Snap for 8508678 from b775dea081bb2e671628125b23a6705a866822ef to ndk-r25-release

Change-Id: Iceb7a342c32e98df7127df2e52e7d051eb3518f5
diff --git a/.github/workflows/continuous_deployment.yml b/.github/workflows/continuous_deployment.yml
new file mode 100644
index 0000000..86f439d
--- /dev/null
+++ b/.github/workflows/continuous_deployment.yml
@@ -0,0 +1,168 @@
+# NOTE: This workflow was ported from Travis.
+# Travis was using Ubuntu 14.04. Ubuntu 14.04 is not supportted by GitHub workflows. Ubuntu 20.04 is recommended.
+# Travis was using Clang 3.6. The earliest version support by Ubuntu 20.04 is Clang 6.0.
+# Travis was caching the clang package. APT package caching is not natively supported by GitHub actions/cache.
+# Travis was using Mac OS X 10.13.6 / Xcode 9.4.1 / LLVM 9.1.0
+
+# NOTE: The following documentation may be useful to maintainers of this workflow.
+# Github actions: https://docs.github.com/en/actions
+# Github github-script action: https://github.com/actions/github-script
+# GitHub REST API: https://docs.github.com/en/rest
+# Octokit front-end to the GitHub REST API: https://octokit.github.io/rest.js/v18
+# Octokit endpoint methods: https://github.com/octokit/plugin-rest-endpoint-methods.js/tree/master/docs/repos
+
+# TODO: Use actions/upload-artifact and actions/download-artifact to simplify deployment.
+# TODO: Use composite actions to refactor redundant code.
+
+name: Continuous Deployment
+
+on:
+    workflow_dispatch:
+    push:
+        branches:
+            - master
+
+jobs:
+    linux:
+        runs-on: ${{matrix.os.genus}}
+        strategy:
+            fail-fast: false
+            matrix:
+                os: [{genus: ubuntu-20.04, family: linux}]
+                compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}]
+                cmake_build_type: [Debug, Release]
+        steps:
+            - uses: actions/checkout@v2
+            - uses: actions/setup-python@v2
+              with:
+                  python-version: '3.7'
+            - name: Install Ubuntu Package Dependencies
+              run: |
+                  sudo apt-get -qq update
+                  sudo apt-get install -y clang-6.0
+            - name: Install GoogleTest
+              run: |
+                  # check out pre-breakage version of googletest; can be deleted when
+                  # issue 3128 is fixed
+                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
+                  mkdir -p External/googletest
+                  cd External/googletest
+                  git init
+                  git remote add origin https://github.com/google/googletest.git
+                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
+                  git reset --hard FETCH_HEAD
+                  cd ../..
+            - name: Update Glslang Sources
+              run: |
+                  ./update_glslang_sources.py
+            - name: Build
+              env:
+                  CC: ${{matrix.compiler.cc}}
+                  CXX: ${{matrix.compiler.cxx}}
+              run: |
+                  mkdir build && cd build
+                  cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
+                  make -j4 install
+            - name: Test
+              run: |
+                  cd build
+                  ctest --output-on-failure &&
+                  cd ../Test && ./runtests
+            - name: Zip
+              if: ${{ matrix.compiler.cc == 'clang' }}
+              env:
+                  ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
+              run: |
+                  cd build/install
+                  zip ${ARCHIVE} \
+                      bin/glslangValidator \
+                      include/glslang/* \
+                      lib/libGenericCodeGen${SUFFIX}.a \
+                      lib/libglslang${SUFFIX}.a \
+                      lib/libglslang-default-resource-limits${SUFFIX}.a \
+                      lib/libHLSL${SUFFIX}.a \
+                      lib/libMachineIndependent${SUFFIX}.a \
+                      lib/libOGLCompiler${SUFFIX}.a \
+                      lib/libOSDependent${SUFFIX}.a \
+                      lib/libSPIRV${SUFFIX}.a \
+                      lib/libSPVRemapper${SUFFIX}.a \
+                      lib/libSPIRV-Tools${SUFFIX}.a \
+                      lib/libSPIRV-Tools-opt${SUFFIX}.a
+            - name: Deploy
+              if: ${{ matrix.compiler.cc == 'clang' }}
+              env:
+                  ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
+              uses: actions/github-script@v5
+              with:
+                  script: |
+                      const script = require('.github/workflows/deploy.js')
+                      await script({github, context, core})
+
+    macos:
+        runs-on: ${{matrix.os.genus}}
+        strategy:
+            fail-fast: false
+            matrix:
+                os: [{genus: macos-10.15, family: osx}]
+                compiler: [{cc: clang, cxx: clang++}]
+                cmake_build_type: [Debug, Release]
+        steps:
+            - uses: actions/checkout@v2
+            - uses: actions/setup-python@v2
+              with:
+                  python-version: '3.7'
+            - name: Install GoogleTest
+              run: |
+                  # check out pre-breakage version of googletest; can be deleted when
+                  # issue 3128 is fixed
+                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
+                  mkdir -p External/googletest
+                  cd External/googletest
+                  git init
+                  git remote add origin https://github.com/google/googletest.git
+                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
+                  git reset --hard FETCH_HEAD
+                  cd ../..
+            - name: Update Glslang Sources
+              run: |
+                  ./update_glslang_sources.py
+            - name: Build
+              env:
+                  CC: ${{matrix.compiler.cc}}
+                  CXX: ${{matrix.compiler.cxx}}
+              run: |
+                  mkdir build && cd build
+                  cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
+                  make -j4 install
+            - name: Test
+              run: |
+                  cd build
+                  ctest --output-on-failure &&
+                  cd ../Test && ./runtests
+            - name: Zip
+              env:
+                  ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
+              run: |
+                  cd build/install
+                  zip ${ARCHIVE} \
+                      bin/glslangValidator \
+                      include/glslang/* \
+                      lib/libGenericCodeGen${SUFFIX}.a \
+                      lib/libglslang${SUFFIX}.a \
+                      lib/libglslang-default-resource-limits${SUFFIX}.a \
+                      lib/libHLSL${SUFFIX}.a \
+                      lib/libMachineIndependent${SUFFIX}.a \
+                      lib/libOGLCompiler${SUFFIX}.a \
+                      lib/libOSDependent${SUFFIX}.a \
+                      lib/libSPIRV${SUFFIX}.a \
+                      lib/libSPVRemapper${SUFFIX}.a \
+                      lib/libSPIRV-Tools${SUFFIX}.a \
+                      lib/libSPIRV-Tools-opt${SUFFIX}.a
+            - name: Deploy
+              env:
+                  ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
+              uses: actions/github-script@v5
+              with:
+                  script: |
+                      const script = require('.github/workflows/deploy.js')
+                      await script({github, context, core})
diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml
new file mode 100644
index 0000000..feec0dc
--- /dev/null
+++ b/.github/workflows/continuous_integration.yml
@@ -0,0 +1,157 @@
+# NOTE: This workflow was ported from Travis.
+# Travis was using Ubuntu 14.04. Ubuntu 14.04 is not supportted by GitHub workflows. Ubuntu 20.04 is recommended.
+# Travis was using Clang 3.6. The earliest version support by Ubuntu 20.04 is Clang 6.0.
+# Travis was caching the clang package. APT package caching is not natively supported by GitHub actions/cache.
+# Travis was using Mac OS X 10.13.6 / Xcode 9.4.1 / LLVM 9.1.0
+#
+name: Continuous Integration
+
+on:
+    workflow_dispatch:
+    pull_request:
+        branches:
+            - master
+
+jobs:
+    linux:
+        runs-on: ${{matrix.os}}
+        strategy:
+            fail-fast: false
+            matrix:
+                os: [ubuntu-20.04]
+                compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}]
+                cmake_build_type: [Debug, Release]
+        steps:
+            - uses: actions/checkout@v2
+            - uses: actions/setup-python@v2
+              with:
+                  python-version: '3.7'
+            - name: Install Ubuntu Package Dependencies
+              run: |
+                  sudo apt-get -qq update
+                  sudo apt-get install -y clang-6.0
+            - name: Install GoogleTest
+              run: |
+                  # check out pre-breakage version of googletest; can be deleted when
+                  # issue 3128 is fixed
+                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
+                  mkdir -p External/googletest
+                  cd External/googletest
+                  git init
+                  git remote add origin https://github.com/google/googletest.git
+                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
+                  git reset --hard FETCH_HEAD
+                  cd ../..
+            - name: Update Glslang Sources
+              run: |
+                  ./update_glslang_sources.py
+            - name: Build
+              env:
+                  CC: ${{matrix.compiler.cc}}
+                  CXX: ${{matrix.compiler.cxx}}
+              run: |
+                  mkdir build && cd build
+                  cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
+                  make -j4 install
+            - name: Test
+              run: |
+                  cd build
+                  ctest --output-on-failure &&
+                  cd ../Test && ./runtests
+
+    macos:
+        runs-on: ${{matrix.os}}
+        strategy:
+            fail-fast: false
+            matrix:
+                os: [macos-10.15]
+                compiler: [{cc: clang, cxx: clang++}]
+                cmake_build_type: [Debug, Release]
+        steps:
+            - uses: actions/checkout@v2
+            - uses: actions/setup-python@v2
+              with:
+                  python-version: '3.7'
+            - name: Install GoogleTest
+              run: |
+                  # check out pre-breakage version of googletest; can be deleted when
+                  # issue 3128 is fixed
+                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
+                  mkdir -p External/googletest
+                  cd External/googletest
+                  git init
+                  git remote add origin https://github.com/google/googletest.git
+                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
+                  git reset --hard FETCH_HEAD
+                  cd ../..
+            - name: Update Glslang Sources
+              run: |
+                  ./update_glslang_sources.py
+            - name: Build
+              env:
+                  CC: ${{matrix.compiler.cc}}
+                  CXX: ${{matrix.compiler.cxx}}
+              run: |
+                  mkdir build && cd build
+                  cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
+                  make -j4 install
+            - name: Test
+              run: |
+                  cd build
+                  ctest --output-on-failure &&
+                  cd ../Test && ./runtests
+
+    android:
+        runs-on: ${{matrix.os}}
+        strategy:
+            fail-fast: false
+            matrix:
+                os: [ubuntu-20.04]
+                compiler: [{cc: clang, cxx: clang++}]
+                cmake_build_type: [Release]
+        steps:
+            - uses: actions/checkout@v2
+            - uses: actions/setup-python@v2
+              with:
+                  python-version: '3.7'
+            - name: Install Ubuntu Package Dependencies
+              if: ${{matrix.os == 'ubuntu-20.04'}}
+              run: |
+                  sudo apt-get -qq update
+                  sudo apt-get install -y clang-6.0
+            - name: Install Android NDK
+              run: |
+                  export ANDROID_NDK=$HOME/android-ndk
+                  git init $ANDROID_NDK
+                  pushd $ANDROID_NDK
+                  git remote add dneto0 https://github.com/dneto0/android-ndk.git
+                  git fetch --depth=1 dneto0 r17b-strip
+                  git checkout FETCH_HEAD
+                  popd
+            - name: Install GoogleTest
+              run: |
+                  # check out pre-breakage version of googletest; can be deleted when
+                  # issue 3128 is fixed
+                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
+                  mkdir -p External/googletest
+                  cd External/googletest
+                  git init
+                  git remote add origin https://github.com/google/googletest.git
+                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
+                  git reset --hard FETCH_HEAD
+                  cd ../..
+            - name: Update Glslang Sources
+              run: |
+                  ./update_glslang_sources.py
+            - name: Build
+              env:
+                  CC: ${{matrix.compiler.cc}}
+                  CXX: ${{matrix.compiler.cxx}}
+              run: |
+                  export ANDROID_NDK=$HOME/android-ndk
+                  export TOOLCHAIN_PATH=$ANDROID_NDK/build/cmake/android.toolchain.cmake
+                  echo $ANDROID_NDK
+                  echo $TOOLCHAIN_PATH
+                  mkdir build && cd build
+                  cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH} -DANDROID_NATIVE_API_LEVEL=android-14 -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DANDROID_ABI="armeabi-v7a with NEON" -DBUILD_TESTING=OFF ..
+                  make -j4
diff --git a/.github/workflows/deploy.js b/.github/workflows/deploy.js
new file mode 100644
index 0000000..82ebb1b
--- /dev/null
+++ b/.github/workflows/deploy.js
@@ -0,0 +1,73 @@
+module.exports = async ({github, context, core}) => {
+    try {
+	await github.rest.git.updateRef({
+	    owner: context.repo.owner,
+	    repo: context.repo.repo,
+	    ref: 'tags/master-tot',
+	    sha: context.sha
+	})
+    } catch (error) {
+	core.setFailed(`upload master-tot tag; ${error.name}; ${error.message}`)
+    }
+
+    let release
+    try {
+	release = await github.rest.repos.getReleaseByTag({
+	    owner: context.repo.owner,
+	    repo: context.repo.repo,
+	    tag: 'master-tot'
+	})
+    } catch (error) {
+	core.setFailed(`get the master release; ${error.name}; ${error.message}`)
+    }
+
+    try {
+	await github.rest.repos.updateRelease({
+	    owner: context.repo.owner,
+	    repo: context.repo.repo,
+	    release_id: release.data.id
+	})
+    } catch (error) {
+	core.setFailed(`update the master release; ${error.name}; ${error.message}`)
+    }
+
+    let release_assets
+    try {
+	release_assets = await github.rest.repos.listReleaseAssets({
+	    owner: context.repo.owner,
+	    repo: context.repo.repo,
+	    release_id: release.data.id
+	})
+    } catch (error) {
+	core.setFailed(`list release assets; ${error.name}; ${error.message}`)
+    }
+
+    const { ARCHIVE } = process.env
+    for (const release_asset of release_assets.data) {
+	if (release_asset.name === `${ ARCHIVE }`) {
+	    try {
+		await github.rest.repos.deleteReleaseAsset({
+		    owner: context.repo.owner,
+		    repo: context.repo.repo,
+		    asset_id: release_asset.id
+		})
+	    } catch (error) {
+		core.setFailed(`delete ${ ARCHIVE }; ${error.name}; ${error.message}`)
+	    }
+	}
+    }
+
+    try {
+	const asset_path = `./build/install/${ ARCHIVE }`
+	const fs = require("fs")
+	await github.rest.repos.uploadReleaseAsset({
+	    owner: context.repo.owner,
+	    repo: context.repo.repo,
+	    release_id: release.data.id,
+	    name: `${ ARCHIVE }`,
+	    data: fs.readFileSync(asset_path)
+	})
+    } catch (error) {
+	core.setFailed(`upload ${ ARCHIVE }; ${error.name}; ${error.message}`)
+    }
+}
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index cb0392e..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,141 +0,0 @@
-# Linux and Mac Build Configuration for Travis
-
-language: cpp
-
-os:
-  - linux
-  - osx
-
-# Use Ubuntu 14.04 LTS (Trusty) as the Linux testing environment.
-sudo: false
-dist: trusty
-
-env:
-  global:
-    - secure: aGFrgzyKp+84hKrGkxVWg8cHV61uqrKEHT38gfSQK6+WS4GfLOyH83p7WnsEBb7AMhzU7LMNFdvOFr6+NaMpVnqRvc40CEG1Q+lNg9Pq9mhIZLowvDrfqTL9kQ+8Nbw5Q6/dg6CTvY7fvRfpfCEmKIUZBRkoKUuHeuM1uy3IupFcdNuL5bSYn3Beo+apSJginh9DI4BLDXFUgBzTRSLLyCX5g3cpaeGGOCr8quJlYx75W6HRck5g9SZuLtUoH9GFEV3l+ZEWB8noErW+J56L03bwNwFuuAh321evw++oQk5KFa8rlDvar3SJ3b1RHB8u/eq5DBYMyaK/fS8+Q7QbGr8diF/wDe68bKO7U9IhpNfExXmczCpExjHomW5TQv4rYdGhygPMfW97aIsPRYyNKcl4fkmb7NDrM8w0Jscdq2g5c2Kz0ItyZoBri/NXLwFQQjaVCs7Pf97TjuMA7mK0GJmDTRzi6SrDYlWMt5BQL3y0CCojyfLIRcTh0CQjQI29s97bLfQrYAxt9GNNFR+HTXRLLrkaAlJkPGEPwUywlSfEThnvHLesNxYqemolAYpQT4ithoL4GehGIHmaxsW295aKVhuRf8K9eBODNqrfblvM42UHhjntT+92ZnQ/Gkq80GqaMxnxi4PO5FyPIxt0r981b54YBkWi8YA4P7w5pNI=
-  matrix:
-    - GLSLANG_BUILD_TYPE=Release
-    - GLSLANG_BUILD_TYPE=Debug
-
-compiler:
-  - clang
-  - gcc
-
-matrix:
-  fast_finish: true # Show final status immediately if a test fails.
-  exclude:
-    # Skip GCC builds on Mac OS X.
-    - os: osx
-      compiler: gcc
-  include:
-    # Additional build using Android NDK.
-    - env: BUILD_NDK=ON
-
-cache:
-  apt: true
-
-branches:
-  only:
-    - master
-
-addons:
-  apt:
-    packages:
-      - clang-3.6
-
-install:
-  # Make sure that clang-3.6 is selected on Linux.
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CC" == "clang" ]]; then
-      export CC=clang-3.6 CXX=clang++-3.6;
-    fi
-  # Download a recent Android NDK and use its android.toolchain.cmake file.
-  - if [[ "$BUILD_NDK" == "ON" ]]; then
-      export ANDROID_NDK=$HOME/android-ndk;
-      git init $ANDROID_NDK;
-      pushd $ANDROID_NDK;
-        git remote add dneto0 https://github.com/dneto0/android-ndk.git;
-        git fetch --depth=1 dneto0 r17b-strip;
-        git checkout FETCH_HEAD;
-      popd;
-      export TOOLCHAIN_PATH=$ANDROID_NDK/build/cmake/android.toolchain.cmake;
-    fi
-
-before_script:
-  # check out pre-breakage version of googletest; can be deleted when
-  # issue 3128 is fixed
-  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
-  - mkdir -p External/googletest
-  - cd External/googletest
-  - git init
-  - git remote add origin https://github.com/google/googletest.git
-  - git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
-  - git reset --hard FETCH_HEAD
-  - cd ../..
-  # get spirv-tools and spirv-headers
-  - ./update_glslang_sources.py
-
-script:
-  - mkdir build && cd build
-  # For Android, do release building using NDK without testing.
-  # Use android-14, the oldest native API level supporeted by NDK r17b.
-  # We can use newer API levels if we want.
-  # For Linux and macOS, do debug/release building with testing.
-  - if [[ "$BUILD_NDK" == "ON" ]]; then
-      cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH}
-            -DANDROID_NATIVE_API_LEVEL=android-14
-            -DCMAKE_BUILD_TYPE=Release
-            -DANDROID_ABI="armeabi-v7a with NEON"
-            -DBUILD_TESTING=OFF ..;
-      make -j4;
-    else
-      cmake -DCMAKE_BUILD_TYPE=${GLSLANG_BUILD_TYPE}
-            -DCMAKE_INSTALL_PREFIX=`pwd`/install ..;
-      make -j4 install;
-      ctest --output-on-failure &&
-      cd ../Test && ./runtests;
-    fi
-
-after_success:
-  # For debug build, the generated dll has a postfix "d" in its name.
-  - if [[ "${GLSLANG_BUILD_TYPE}" == "Debug" ]]; then
-      export SUFFIX="d";
-    else
-      export SUFFIX="";
-    fi
-  # Create tarball for deployment
-  - if [[ ${CC} == clang* && "${BUILD_NDK}" != "ON" ]]; then
-      cd ../build/install;
-      export TARBALL=glslang-master-${TRAVIS_OS_NAME}-${GLSLANG_BUILD_TYPE}.zip;
-      zip ${TARBALL}
-        bin/glslangValidator
-        include/glslang/*
-        lib/libGenericCodeGen${SUFFIX}.a
-        lib/libglslang${SUFFIX}.a
-        lib/libglslang-default-resource-limits${SUFFIX}.a
-        lib/libHLSL${SUFFIX}.a
-        lib/libMachineIndependent${SUFFIX}.a
-        lib/libOGLCompiler${SUFFIX}.a
-        lib/libOSDependent${SUFFIX}.a
-        lib/libSPIRV${SUFFIX}.a
-        lib/libSPVRemapper${SUFFIX}.a
-        lib/libSPIRV-Tools${SUFFIX}.a
-        lib/libSPIRV-Tools-opt${SUFFIX}.a;
-    fi
-
-before_deploy:
-  # Tag the current top of the tree as "master-tot".
-  # Travis CI replies on the tag name to properly push to GitHub Releases.
-  - git config --global user.name "Travis CI"
-  - git config --global user.email "builds@travis-ci.org"
-  - git tag -f master-tot
-  - git push -q -f https://${glslangtoken}@github.com/KhronosGroup/glslang --tags
-
-deploy:
-  provider: releases
-  api_key: ${glslangtoken}
-  on:
-    branch: master
-    condition: ${CC} == clang* && ${BUILD_NDK} != ON
-  file: ${TARBALL}
-  skip_cleanup: true
-  overwrite: true
diff --git a/BUILD.gn b/BUILD.gn
index 06d3c4b..4dd0a55 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -74,6 +74,15 @@
 
   out_file = "${target_gen_dir}/include/glslang/glsl_intrinsic_header.h"
 
+  # Fuchsia GN build rules require all GN actions to be hermetic and they
+  # should correctly and fully state their inputs and outpus (see
+  # https://fuchsia.dev/fuchsia-src/development/build/hermetic_actions
+  # for details). All input files of the script should be added to the
+  # |sources| list.
+  sources = [
+    "glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl",
+  ]
+
   inputs = [
     script
   ]
diff --git a/CHANGES.md b/CHANGES.md
index ad4fa40..6d3bd6d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,6 +3,18 @@
 All notable changes to this project will be documented in this file.
 This project adheres to [Semantic Versioning](https://semver.org/).
 
+## 11.8.0 2022-01-27
+
+### Other changes
+* Add support for SPIR-V 1.6
+* Add support for Vulkan 1.3
+* Add --hlsl-dx-position-w option
+
+## 11.7.0 2021-11-11
+
+### Other changes
+* Add support for targeting Vulkan 1.2 in the C API
+
 ## 11.6.0 2021-08-25
 
 ### Other changes
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d5b727a..43533c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -106,10 +106,17 @@
 option(ENABLE_RTTI "Enables RTTI" OFF)
 option(ENABLE_EXCEPTIONS "Enables Exceptions" OFF)
 option(ENABLE_OPT "Enables spirv-opt capability if present" ON)
-option(ENABLE_PCH "Enables Precompiled header" ON)
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
+    # Workaround for CMake behavior on Mac OS with gcc, cmake generates -Xarch_* arguments
+    # which gcc rejects
+    option(ENABLE_PCH "Enables Precompiled header" OFF)
+else()
+    option(ENABLE_PCH "Enables Precompiled header" ON)
+endif()
 option(ENABLE_CTEST "Enables testing" ON)
 
-if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND WIN32)
+if(ENABLE_GLSLANG_INSTALL AND CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND WIN32)
     set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "..." FORCE)
 endif()
 
@@ -163,7 +170,7 @@
         add_compile_options(-Werror=deprecated-copy)
     endif()
 
-    if(NOT CMAKE_VERSION VERSION_LESS "3.13")
+    if(NOT CMAKE_VERSION VERSION_LESS "3.13" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
         # Error if there's symbols that are not found at link time.
         # add_link_options() was added in CMake 3.13 - if using an earlier
         # version don't set this - it should be caught by presubmits anyway.
diff --git a/LICENSE.txt b/LICENSE.txt
index 5f58565..054e68a 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -303,41 +303,647 @@
 GPL 3 with special bison exception
 --------------------------------------------------------------------------------
 
-   Bison implementation for Yacc-like parsers in C
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
+                            Preamble
 
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
 
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
 
-   As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
 
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+Bison Exception
+
+As a special exception, you may create a larger work that contains part or all
+of the Bison parser skeleton and distribute that work under terms of your
+choice, so long as that work isn't itself a parser generator using the skeleton
+or a modified version thereof as a parser skeleton.  Alternatively, if you
+modify or redistribute the parser skeleton itself, you may (at your option)
+remove this special exception, which will cause the skeleton and the resulting
+Bison output files to be licensed under the GNU General Public License without
+this special exception.
+
+This special exception was added by the Free Software Foundation in version
+2.2 of Bison.
+
+                     END OF TERMS AND CONDITIONS
 
 --------------------------------------------------------------------------------
 ================================================================================
 --------------------------------------------------------------------------------
 
-The preprocessor has the core licenses stated above, plus an additional licence:
+The preprocessor has the core licenses stated above, plus additional licences:
 
 /****************************************************************************\
 Copyright (c) 2002, NVIDIA Corporation.
@@ -382,3 +988,29 @@
 TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \****************************************************************************/
+
+/*
+** Copyright (c) 2014-2016 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"),
+** to deal in the Materials without restriction, including without limitation
+** the rights to use, copy, modify, merge, publish, distribute, sublicense,
+** and/or sell copies of the Materials, and to permit persons to whom the
+** Materials are 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 Materials.
+**
+** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
+** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
+** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
+**
+** THE MATERIALS ARE 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 MATERIALS OR THE USE OR OTHER DEALINGS
+** IN THE MATERIALS.
+*/
diff --git a/README.md b/README.md
index 9b8cfb3..48118b2 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,8 @@
 
 If people are only using this location to get spirv.hpp, I recommend they get that from [SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) instead.
 
-[![Build Status](https://travis-ci.org/KhronosGroup/glslang.svg?branch=master)](https://travis-ci.org/KhronosGroup/glslang)
-[![Build status](https://ci.appveyor.com/api/projects/status/q6fi9cb0qnhkla68/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master)
+[![appveyor status](https://ci.appveyor.com/api/projects/status/q6fi9cb0qnhkla68/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master)
+![Continuous Deployment](https://github.com/KhronosGroup/glslang/actions/workflows/continuous_deployment.yml/badge.svg)
 
 # Glslang Components and Status
 
@@ -85,7 +85,15 @@
 * `.frag` for a fragment shader
 * `.comp` for a compute shader
 
-There is also a non-shader extension
+For ray tracing pipeline shaders:
+* `.rgen` for a ray generation shader
+* `.rint` for a ray intersection shader
+* `.rahit` for a ray any-hit shader
+* `.rchit` for a ray closest-hit shader
+* `.rmiss` for a ray miss shader
+* `.rcall` for a callable shader
+
+There is also a non-shader extension:
 * `.conf` for a configuration file of limits, see usage statement for example
 
 ## Building (CMake)
diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
index 22f767d..775466e 100644
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -113,7 +113,8 @@
         if (ENABLE_SPVREMAPPER)
             install(TARGETS SPVRemapper EXPORT SPVRemapperTargets
                     ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-                    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+                    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
         endif()
         install(TARGETS SPIRV EXPORT SPIRVTargets
                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 43aba9c..6cdf234 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1256,8 +1256,10 @@
     if (type.getBasicType() == glslang::EbtRayQuery)
         return spv::StorageClassPrivate;
 #ifndef GLSLANG_WEB
-    if (type.getQualifier().isSpirvByReference())
-        return spv::StorageClassFunction;
+    if (type.getQualifier().isSpirvByReference()) {
+        if (type.getQualifier().isParamInput() || type.getQualifier().isParamOutput())
+            return spv::StorageClassFunction;
+    }
 #endif
     if (type.getQualifier().isPipeInput())
         return spv::StorageClassInput;
@@ -1662,9 +1664,22 @@
 
     case EShLangCompute:
         builder.addCapability(spv::CapabilityShader);
-        builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
-                                                                           glslangIntermediate->getLocalSize(1),
-                                                                           glslangIntermediate->getLocalSize(2));
+        if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
+          std::vector<spv::Id> dimConstId;
+          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) {
+                builder.addDecoration(dimConstId.back(), spv::DecorationSpecId,
+                                      glslangIntermediate->getLocalSizeSpecId(dim));
+            }
+          }
+          builder.addExecutionModeId(shaderEntry, spv::ExecutionModeLocalSizeId, dimConstId);
+        } else {
+          builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
+                                                                             glslangIntermediate->getLocalSize(1),
+                                                                             glslangIntermediate->getLocalSize(2));
+        }
         if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) {
             builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV);
             builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV);
@@ -1768,9 +1783,22 @@
     case EShLangMeshNV:
         builder.addCapability(spv::CapabilityMeshShadingNV);
         builder.addExtension(spv::E_SPV_NV_mesh_shader);
-        builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
-                                                                           glslangIntermediate->getLocalSize(1),
-                                                                           glslangIntermediate->getLocalSize(2));
+        if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
+            std::vector<spv::Id> dimConstId;
+            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) {
+                    builder.addDecoration(dimConstId.back(), spv::DecorationSpecId,
+                                          glslangIntermediate->getLocalSizeSpecId(dim));
+                }
+            }
+            builder.addExecutionModeId(shaderEntry, spv::ExecutionModeLocalSizeId, dimConstId);
+        } else {
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
+                                                                               glslangIntermediate->getLocalSize(1),
+                                                                               glslangIntermediate->getLocalSize(2));
+        }
         if (glslangIntermediate->getStage() == EShLangMeshNV) {
             builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices,
                 glslangIntermediate->getVertices());
@@ -3777,7 +3805,16 @@
 
     switch (node->getFlowOp()) {
     case glslang::EOpKill:
-        builder.makeStatementTerminator(spv::OpKill, "post-discard");
+        if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
+            if (glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
+              builder.addCapability(spv::CapabilityDemoteToHelperInvocation);
+              builder.createNoResultOp(spv::OpDemoteToHelperInvocationEXT);
+            } else {
+                builder.makeStatementTerminator(spv::OpTerminateInvocation, "post-terminate-invocation");
+            }
+        } else {
+            builder.makeStatementTerminator(spv::OpKill, "post-discard");
+        }
         break;
     case glslang::EOpTerminateInvocation:
         builder.addExtension(spv::E_SPV_KHR_terminate_invocation);
@@ -4148,23 +4185,23 @@
         const auto& spirvType = type.getSpirvType();
         const auto& spirvInst = spirvType.spirvInst;
 
-        std::vector<spv::Id> operands;
+        std::vector<spv::IdImmediate> operands;
         for (const auto& typeParam : spirvType.typeParams) {
             // Constant expression
             if (typeParam.constant->isLiteral()) {
                 if (typeParam.constant->getBasicType() == glslang::EbtFloat) {
                     float floatValue = static_cast<float>(typeParam.constant->getConstArray()[0].getDConst());
                     unsigned literal = *reinterpret_cast<unsigned*>(&floatValue);
-                    operands.push_back(literal);
+                    operands.push_back({false, literal});
                 } else if (typeParam.constant->getBasicType() == glslang::EbtInt) {
                     unsigned literal = typeParam.constant->getConstArray()[0].getIConst();
-                    operands.push_back(literal);
+                    operands.push_back({false, literal});
                 } else if (typeParam.constant->getBasicType() == glslang::EbtUint) {
                     unsigned literal = typeParam.constant->getConstArray()[0].getUConst();
-                    operands.push_back(literal);
+                    operands.push_back({false, literal});
                 } else if (typeParam.constant->getBasicType() == glslang::EbtBool) {
                     unsigned literal = typeParam.constant->getConstArray()[0].getBConst();
-                    operands.push_back(literal);
+                    operands.push_back({false, literal});
                 } else if (typeParam.constant->getBasicType() == glslang::EbtString) {
                     auto str = typeParam.constant->getConstArray()[0].getSConst()->c_str();
                     unsigned literal = 0;
@@ -4176,7 +4213,7 @@
                         *(literalPtr++) = ch;
                         ++charCount;
                         if (charCount == 4) {
-                            operands.push_back(literal);
+                            operands.push_back({false, literal});
                             literalPtr = reinterpret_cast<char*>(&literal);
                             charCount = 0;
                         }
@@ -4186,20 +4223,17 @@
                     if (charCount > 0) {
                         for (; charCount < 4; ++charCount)
                             *(literalPtr++) = 0;
-                        operands.push_back(literal);
+                        operands.push_back({false, literal});
                     }
                 } else
                     assert(0); // Unexpected type
             } else
-                operands.push_back(createSpvConstant(*typeParam.constant));
+                operands.push_back({true, createSpvConstant(*typeParam.constant)});
         }
 
-        if (spirvInst.set == "")
-            spvType = builder.createOp(static_cast<spv::Op>(spirvInst.id), spv::NoType, operands);
-        else {
-            spvType = builder.createBuiltinCall(
-                spv::NoType, getExtBuiltins(spirvInst.set.c_str()), spirvInst.id, operands);
-        }
+        assert(spirvInst.set == ""); // Currently, couldn't be extended instructions.
+        spvType = builder.makeGenericType(static_cast<spv::Op>(spirvInst.id), operands);
+
         break;
     }
 #endif
@@ -8717,8 +8751,18 @@
             builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutOffset);
     }
 
-    if (symbol->getQualifier().hasLocation())
-        builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);
+    if (symbol->getQualifier().hasLocation()) {
+        if (!(glslangIntermediate->isRayTracingStage() && glslangIntermediate->IsRequestedExtension(glslang::E_GL_EXT_ray_tracing)
+              && (builder.getStorageClass(id) == spv::StorageClassRayPayloadKHR ||
+                  builder.getStorageClass(id) == spv::StorageClassIncomingRayPayloadKHR ||
+                  builder.getStorageClass(id) == spv::StorageClassCallableDataKHR ||
+                  builder.getStorageClass(id) == spv::StorageClassIncomingCallableDataKHR))) {
+            // Location values are used to link TraceRayKHR and ExecuteCallableKHR to corresponding variables
+            // but are not valid in SPIRV since they are supported only for Input/Output Storage classes.
+            builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);
+        }
+    }
+
     builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
     if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
         builder.addCapability(spv::CapabilityGeometryStreams);
@@ -8752,7 +8796,16 @@
 
     // add built-in variable decoration
     if (builtIn != spv::BuiltInMax) {
-        builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
+        // WorkgroupSize deprecated in spirv1.6
+        if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_6 ||
+            builtIn != spv::BuiltInWorkgroupSize)
+            builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
+    }
+
+    // Add volatile decoration to HelperInvocation for spirv1.6 and beyond
+    if (builtIn == spv::BuiltInHelperInvocation &&
+        glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
+        builder.addDecoration(id, spv::DecorationVolatile);
     }
 
 #ifndef GLSLANG_WEB
@@ -9025,15 +9078,19 @@
                 break;
 #ifndef GLSLANG_WEB
             case glslang::EbtInt8:
+                builder.addCapability(spv::CapabilityInt8);
                 spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const()));
                 break;
             case glslang::EbtUint8:
+                builder.addCapability(spv::CapabilityInt8);
                 spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const()));
                 break;
             case glslang::EbtInt16:
+                builder.addCapability(spv::CapabilityInt16);
                 spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const()));
                 break;
             case glslang::EbtUint16:
+                builder.addCapability(spv::CapabilityInt16);
                 spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const()));
                 break;
             case glslang::EbtInt64:
@@ -9046,6 +9103,7 @@
                 spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst()));
                 break;
             case glslang::EbtFloat16:
+                builder.addCapability(spv::CapabilityFloat16);
                 spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));
                 break;
 #endif
@@ -9074,15 +9132,19 @@
             break;
 #ifndef GLSLANG_WEB
         case glslang::EbtInt8:
+            builder.addCapability(spv::CapabilityInt8);
             scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant);
             break;
         case glslang::EbtUint8:
+            builder.addCapability(spv::CapabilityInt8);
             scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant);
             break;
         case glslang::EbtInt16:
+            builder.addCapability(spv::CapabilityInt16);
             scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant);
             break;
         case glslang::EbtUint16:
+            builder.addCapability(spv::CapabilityInt16);
             scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant);
             break;
         case glslang::EbtInt64:
@@ -9095,6 +9157,7 @@
             scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant);
             break;
         case glslang::EbtFloat16:
+            builder.addCapability(spv::CapabilityFloat16);
             scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);
             break;
         case glslang::EbtReference:
diff --git a/SPIRV/SPVRemapper.cpp b/SPIRV/SPVRemapper.cpp
index 56d6d5d..fdfbeb9 100644
--- a/SPIRV/SPVRemapper.cpp
+++ b/SPIRV/SPVRemapper.cpp
@@ -297,15 +297,21 @@
     std::string spirvbin_t::literalString(unsigned word) const
     {
         std::string literal;
+        const spirword_t * pos = spv.data() + word;
 
         literal.reserve(16);
 
-        const char* bytes = reinterpret_cast<const char*>(spv.data() + word);
-
-        while (bytes && *bytes)
-            literal += *bytes++;
-
-        return literal;
+        do {
+            spirword_t word = *pos;
+            for (int i = 0; i < 4; i++) {
+                char c = word & 0xff;
+                if (c == '\0')
+                    return literal;
+                literal += c;
+                word >>= 8;
+            }
+            pos++;
+        } while (true);
     }
 
     void spirvbin_t::applyMap()
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index e83306e..36a3f09 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -427,6 +427,37 @@
     return type->getResultId();
 }
 
+Id Builder::makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& operands)
+{
+    // try to find it
+    Instruction* type;
+    for (int t = 0; t < (int)groupedTypes[opcode].size(); ++t) {
+        type = groupedTypes[opcode][t];
+        if (static_cast<size_t>(type->getNumOperands()) != operands.size())
+            continue; // Number mismatch, find next
+
+        bool match = true;
+        for (int op = 0; match && op < (int)operands.size(); ++op) {
+            match = (operands[op].isId ? type->getIdOperand(op) : type->getImmediateOperand(op)) == operands[op].word;
+        }
+        if (match)
+            return type->getResultId();
+    }
+
+    // not found, make it
+    type = new Instruction(getUniqueId(), NoType, opcode);
+    for (size_t op = 0; op < operands.size(); ++op) {
+        if (operands[op].isId)
+            type->addIdOperand(operands[op].word);
+        else
+            type->addImmediateOperand(operands[op].word);
+    }
+    groupedTypes[opcode].push_back(type);
+    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
+    module.mapInstruction(type);
+
+    return type->getResultId();
+}
 
 // TODO: performance: track arrays per stride
 // If a stride is supplied (non-zero) make an array.
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index 251b9ee..c72d9b2 100644
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -181,6 +181,7 @@
     Id makeSamplerType();
     Id makeSampledImageType(Id imageType);
     Id makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols);
+    Id makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& operands);
 
     // accelerationStructureNV type
     Id makeAccelerationStructureType();
diff --git a/SPIRV/SpvTools.cpp b/SPIRV/SpvTools.cpp
index 8acf9b1..8cc17cc 100644
--- a/SPIRV/SpvTools.cpp
+++ b/SPIRV/SpvTools.cpp
@@ -68,6 +68,8 @@
         }
     case glslang::EShTargetVulkan_1_2:
         return spv_target_env::SPV_ENV_VULKAN_1_2;
+    case glslang::EShTargetVulkan_1_3:
+        return spv_target_env::SPV_ENV_VULKAN_1_3;
     default:
         break;
     }
@@ -210,6 +212,7 @@
     optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());
     if (options->optimizeSize) {
         optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
+        optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsPass());
     }
     optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
     optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index 73c988c..74dd605 100644
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -43,6 +43,7 @@
 #include <stack>
 #include <sstream>
 #include <cstring>
+#include <utility>
 
 #include "disassemble.h"
 #include "doc.h"
@@ -100,6 +101,7 @@
     void outputMask(OperandClass operandClass, unsigned mask);
     void disassembleImmediates(int numOperands);
     void disassembleIds(int numOperands);
+    std::pair<int, std::string> decodeString();
     int disassembleString();
     void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands);
 
@@ -290,31 +292,44 @@
     }
 }
 
-// return the number of operands consumed by the string
-int SpirvStream::disassembleString()
+// decode string from words at current position (non-consuming)
+std::pair<int, std::string> SpirvStream::decodeString()
 {
-    int startWord = word;
-
-    out << " \"";
-
-    const char* wordString;
+    std::string res;
+    int wordPos = word;
+    char c;
     bool done = false;
+
     do {
-        unsigned int content = stream[word];
-        wordString = (const char*)&content;
+        unsigned int content = stream[wordPos];
         for (int charCount = 0; charCount < 4; ++charCount) {
-            if (*wordString == 0) {
+            c = content & 0xff;
+            content >>= 8;
+            if (c == '\0') {
                 done = true;
                 break;
             }
-            out << *(wordString++);
+            res += c;
         }
-        ++word;
-    } while (! done);
+        ++wordPos;
+    } while(! done);
 
+    return std::make_pair(wordPos - word, res);
+}
+
+// return the number of operands consumed by the string
+int SpirvStream::disassembleString()
+{
+    out << " \"";
+
+    std::pair<int, std::string> decoderes = decodeString();
+
+    out << decoderes.second;
     out << "\"";
 
-    return word - startWord;
+    word += decoderes.first;
+
+    return decoderes.first;
 }
 
 void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands)
@@ -331,7 +346,7 @@
             nextNestedControl = 0;
         }
     } else if (opCode == OpExtInstImport) {
-        idDescriptor[resultId] = (const char*)(&stream[word]);
+        idDescriptor[resultId] = decodeString().second;
     }
     else {
         if (resultId != 0 && idDescriptor[resultId].size() == 0) {
@@ -428,7 +443,7 @@
             --numOperands;
             // Get names for printing "(XXX)" for readability, *after* this id
             if (opCode == OpName)
-                idDescriptor[stream[word - 1]] = (const char*)(&stream[word]);
+                idDescriptor[stream[word - 1]] = decodeString().second;
             break;
         case OperandVariableIds:
             disassembleIds(numOperands);
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index dbdf707..9a569e0 100644
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -900,6 +900,12 @@
     case CapabilityDeviceGroup: return "DeviceGroup";
     case CapabilityMultiView:   return "MultiView";
 
+    case CapabilityDenormPreserve:           return "DenormPreserve";
+    case CapabilityDenormFlushToZero:        return "DenormFlushToZero";
+    case CapabilitySignedZeroInfNanPreserve: return "SignedZeroInfNanPreserve";
+    case CapabilityRoundingModeRTE:          return "RoundingModeRTE";
+    case CapabilityRoundingModeRTZ:          return "RoundingModeRTZ";
+
     case CapabilityStencilExportEXT: return "StencilExportEXT";
 
     case CapabilityFloat16ImageAMD:       return "Float16ImageAMD";
diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp
index e0fe249..a864200 100644
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -1,2314 +1,2509 @@
-// Copyright (c) 2014-2020 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"),
-// to deal in the Materials without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Materials, and to permit persons to whom the
-// Materials are 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 Materials.
-// 
-// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
-// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
-// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ 
-// 
-// THE MATERIALS ARE 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 MATERIALS OR THE USE OR OTHER DEALINGS
-// IN THE MATERIALS.
-
-// This header is automatically generated by the same tool that creates
-// the Binary Section of the SPIR-V specification.
-
-// Enumeration tokens for SPIR-V, in various styles:
-//   C, C++, C++11, JSON, Lua, Python, C#, D
-// 
-// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL
-// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL
-// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL
-// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL
-// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']
-// - C# will use enum classes in the Specification class located in the "Spv" namespace,
-//     e.g.: Spv.Specification.SourceLanguage.GLSL
-// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL
-// 
-// Some tokens act like mask values, which can be OR'd together,
-// while others are mutually exclusive.  The mask-like ones have
-// "Mask" in their name, and a parallel enum that has the shift
-// amount (1 << x) for each corresponding enumerant.
-
-#ifndef spirv_HPP
-#define spirv_HPP
-
-namespace spv {
-
-typedef unsigned int Id;
-
-#define SPV_VERSION 0x10500
-#define SPV_REVISION 4
-
-static const unsigned int MagicNumber = 0x07230203;
-static const unsigned int Version = 0x00010500;
-static const unsigned int Revision = 4;
-static const unsigned int OpCodeMask = 0xffff;
-static const unsigned int WordCountShift = 16;
-
-enum SourceLanguage {
-    SourceLanguageUnknown = 0,
-    SourceLanguageESSL = 1,
-    SourceLanguageGLSL = 2,
-    SourceLanguageOpenCL_C = 3,
-    SourceLanguageOpenCL_CPP = 4,
-    SourceLanguageHLSL = 5,
-    SourceLanguageMax = 0x7fffffff,
-};
-
-enum ExecutionModel {
-    ExecutionModelVertex = 0,
-    ExecutionModelTessellationControl = 1,
-    ExecutionModelTessellationEvaluation = 2,
-    ExecutionModelGeometry = 3,
-    ExecutionModelFragment = 4,
-    ExecutionModelGLCompute = 5,
-    ExecutionModelKernel = 6,
-    ExecutionModelTaskNV = 5267,
-    ExecutionModelMeshNV = 5268,
-    ExecutionModelRayGenerationKHR = 5313,
-    ExecutionModelRayGenerationNV = 5313,
-    ExecutionModelIntersectionKHR = 5314,
-    ExecutionModelIntersectionNV = 5314,
-    ExecutionModelAnyHitKHR = 5315,
-    ExecutionModelAnyHitNV = 5315,
-    ExecutionModelClosestHitKHR = 5316,
-    ExecutionModelClosestHitNV = 5316,
-    ExecutionModelMissKHR = 5317,
-    ExecutionModelMissNV = 5317,
-    ExecutionModelCallableKHR = 5318,
-    ExecutionModelCallableNV = 5318,
-    ExecutionModelMax = 0x7fffffff,
-};
-
-enum AddressingModel {
-    AddressingModelLogical = 0,
-    AddressingModelPhysical32 = 1,
-    AddressingModelPhysical64 = 2,
-    AddressingModelPhysicalStorageBuffer64 = 5348,
-    AddressingModelPhysicalStorageBuffer64EXT = 5348,
-    AddressingModelMax = 0x7fffffff,
-};
-
-enum MemoryModel {
-    MemoryModelSimple = 0,
-    MemoryModelGLSL450 = 1,
-    MemoryModelOpenCL = 2,
-    MemoryModelVulkan = 3,
-    MemoryModelVulkanKHR = 3,
-    MemoryModelMax = 0x7fffffff,
-};
-
-enum ExecutionMode {
-    ExecutionModeInvocations = 0,
-    ExecutionModeSpacingEqual = 1,
-    ExecutionModeSpacingFractionalEven = 2,
-    ExecutionModeSpacingFractionalOdd = 3,
-    ExecutionModeVertexOrderCw = 4,
-    ExecutionModeVertexOrderCcw = 5,
-    ExecutionModePixelCenterInteger = 6,
-    ExecutionModeOriginUpperLeft = 7,
-    ExecutionModeOriginLowerLeft = 8,
-    ExecutionModeEarlyFragmentTests = 9,
-    ExecutionModePointMode = 10,
-    ExecutionModeXfb = 11,
-    ExecutionModeDepthReplacing = 12,
-    ExecutionModeDepthGreater = 14,
-    ExecutionModeDepthLess = 15,
-    ExecutionModeDepthUnchanged = 16,
-    ExecutionModeLocalSize = 17,
-    ExecutionModeLocalSizeHint = 18,
-    ExecutionModeInputPoints = 19,
-    ExecutionModeInputLines = 20,
-    ExecutionModeInputLinesAdjacency = 21,
-    ExecutionModeTriangles = 22,
-    ExecutionModeInputTrianglesAdjacency = 23,
-    ExecutionModeQuads = 24,
-    ExecutionModeIsolines = 25,
-    ExecutionModeOutputVertices = 26,
-    ExecutionModeOutputPoints = 27,
-    ExecutionModeOutputLineStrip = 28,
-    ExecutionModeOutputTriangleStrip = 29,
-    ExecutionModeVecTypeHint = 30,
-    ExecutionModeContractionOff = 31,
-    ExecutionModeInitializer = 33,
-    ExecutionModeFinalizer = 34,
-    ExecutionModeSubgroupSize = 35,
-    ExecutionModeSubgroupsPerWorkgroup = 36,
-    ExecutionModeSubgroupsPerWorkgroupId = 37,
-    ExecutionModeLocalSizeId = 38,
-    ExecutionModeLocalSizeHintId = 39,
-    ExecutionModeSubgroupUniformControlFlowKHR = 4421,
-    ExecutionModePostDepthCoverage = 4446,
-    ExecutionModeDenormPreserve = 4459,
-    ExecutionModeDenormFlushToZero = 4460,
-    ExecutionModeSignedZeroInfNanPreserve = 4461,
-    ExecutionModeRoundingModeRTE = 4462,
-    ExecutionModeRoundingModeRTZ = 4463,
-    ExecutionModeStencilRefReplacingEXT = 5027,
-    ExecutionModeOutputLinesNV = 5269,
-    ExecutionModeOutputPrimitivesNV = 5270,
-    ExecutionModeDerivativeGroupQuadsNV = 5289,
-    ExecutionModeDerivativeGroupLinearNV = 5290,
-    ExecutionModeOutputTrianglesNV = 5298,
-    ExecutionModePixelInterlockOrderedEXT = 5366,
-    ExecutionModePixelInterlockUnorderedEXT = 5367,
-    ExecutionModeSampleInterlockOrderedEXT = 5368,
-    ExecutionModeSampleInterlockUnorderedEXT = 5369,
-    ExecutionModeShadingRateInterlockOrderedEXT = 5370,
-    ExecutionModeShadingRateInterlockUnorderedEXT = 5371,
-    ExecutionModeSharedLocalMemorySizeINTEL = 5618,
-    ExecutionModeRoundingModeRTPINTEL = 5620,
-    ExecutionModeRoundingModeRTNINTEL = 5621,
-    ExecutionModeFloatingPointModeALTINTEL = 5622,
-    ExecutionModeFloatingPointModeIEEEINTEL = 5623,
-    ExecutionModeMaxWorkgroupSizeINTEL = 5893,
-    ExecutionModeMaxWorkDimINTEL = 5894,
-    ExecutionModeNoGlobalOffsetINTEL = 5895,
-    ExecutionModeNumSIMDWorkitemsINTEL = 5896,
-    ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,
-    ExecutionModeMax = 0x7fffffff,
-};
-
-enum StorageClass {
-    StorageClassUniformConstant = 0,
-    StorageClassInput = 1,
-    StorageClassUniform = 2,
-    StorageClassOutput = 3,
-    StorageClassWorkgroup = 4,
-    StorageClassCrossWorkgroup = 5,
-    StorageClassPrivate = 6,
-    StorageClassFunction = 7,
-    StorageClassGeneric = 8,
-    StorageClassPushConstant = 9,
-    StorageClassAtomicCounter = 10,
-    StorageClassImage = 11,
-    StorageClassStorageBuffer = 12,
-    StorageClassCallableDataKHR = 5328,
-    StorageClassCallableDataNV = 5328,
-    StorageClassIncomingCallableDataKHR = 5329,
-    StorageClassIncomingCallableDataNV = 5329,
-    StorageClassRayPayloadKHR = 5338,
-    StorageClassRayPayloadNV = 5338,
-    StorageClassHitAttributeKHR = 5339,
-    StorageClassHitAttributeNV = 5339,
-    StorageClassIncomingRayPayloadKHR = 5342,
-    StorageClassIncomingRayPayloadNV = 5342,
-    StorageClassShaderRecordBufferKHR = 5343,
-    StorageClassShaderRecordBufferNV = 5343,
-    StorageClassPhysicalStorageBuffer = 5349,
-    StorageClassPhysicalStorageBufferEXT = 5349,
-    StorageClassCodeSectionINTEL = 5605,
-    StorageClassDeviceOnlyINTEL = 5936,
-    StorageClassHostOnlyINTEL = 5937,
-    StorageClassMax = 0x7fffffff,
-};
-
-enum Dim {
-    Dim1D = 0,
-    Dim2D = 1,
-    Dim3D = 2,
-    DimCube = 3,
-    DimRect = 4,
-    DimBuffer = 5,
-    DimSubpassData = 6,
-    DimMax = 0x7fffffff,
-};
-
-enum SamplerAddressingMode {
-    SamplerAddressingModeNone = 0,
-    SamplerAddressingModeClampToEdge = 1,
-    SamplerAddressingModeClamp = 2,
-    SamplerAddressingModeRepeat = 3,
-    SamplerAddressingModeRepeatMirrored = 4,
-    SamplerAddressingModeMax = 0x7fffffff,
-};
-
-enum SamplerFilterMode {
-    SamplerFilterModeNearest = 0,
-    SamplerFilterModeLinear = 1,
-    SamplerFilterModeMax = 0x7fffffff,
-};
-
-enum ImageFormat {
-    ImageFormatUnknown = 0,
-    ImageFormatRgba32f = 1,
-    ImageFormatRgba16f = 2,
-    ImageFormatR32f = 3,
-    ImageFormatRgba8 = 4,
-    ImageFormatRgba8Snorm = 5,
-    ImageFormatRg32f = 6,
-    ImageFormatRg16f = 7,
-    ImageFormatR11fG11fB10f = 8,
-    ImageFormatR16f = 9,
-    ImageFormatRgba16 = 10,
-    ImageFormatRgb10A2 = 11,
-    ImageFormatRg16 = 12,
-    ImageFormatRg8 = 13,
-    ImageFormatR16 = 14,
-    ImageFormatR8 = 15,
-    ImageFormatRgba16Snorm = 16,
-    ImageFormatRg16Snorm = 17,
-    ImageFormatRg8Snorm = 18,
-    ImageFormatR16Snorm = 19,
-    ImageFormatR8Snorm = 20,
-    ImageFormatRgba32i = 21,
-    ImageFormatRgba16i = 22,
-    ImageFormatRgba8i = 23,
-    ImageFormatR32i = 24,
-    ImageFormatRg32i = 25,
-    ImageFormatRg16i = 26,
-    ImageFormatRg8i = 27,
-    ImageFormatR16i = 28,
-    ImageFormatR8i = 29,
-    ImageFormatRgba32ui = 30,
-    ImageFormatRgba16ui = 31,
-    ImageFormatRgba8ui = 32,
-    ImageFormatR32ui = 33,
-    ImageFormatRgb10a2ui = 34,
-    ImageFormatRg32ui = 35,
-    ImageFormatRg16ui = 36,
-    ImageFormatRg8ui = 37,
-    ImageFormatR16ui = 38,
-    ImageFormatR8ui = 39,
-    ImageFormatR64ui = 40,
-    ImageFormatR64i = 41,
-    ImageFormatMax = 0x7fffffff,
-};
-
-enum ImageChannelOrder {
-    ImageChannelOrderR = 0,
-    ImageChannelOrderA = 1,
-    ImageChannelOrderRG = 2,
-    ImageChannelOrderRA = 3,
-    ImageChannelOrderRGB = 4,
-    ImageChannelOrderRGBA = 5,
-    ImageChannelOrderBGRA = 6,
-    ImageChannelOrderARGB = 7,
-    ImageChannelOrderIntensity = 8,
-    ImageChannelOrderLuminance = 9,
-    ImageChannelOrderRx = 10,
-    ImageChannelOrderRGx = 11,
-    ImageChannelOrderRGBx = 12,
-    ImageChannelOrderDepth = 13,
-    ImageChannelOrderDepthStencil = 14,
-    ImageChannelOrdersRGB = 15,
-    ImageChannelOrdersRGBx = 16,
-    ImageChannelOrdersRGBA = 17,
-    ImageChannelOrdersBGRA = 18,
-    ImageChannelOrderABGR = 19,
-    ImageChannelOrderMax = 0x7fffffff,
-};
-
-enum ImageChannelDataType {
-    ImageChannelDataTypeSnormInt8 = 0,
-    ImageChannelDataTypeSnormInt16 = 1,
-    ImageChannelDataTypeUnormInt8 = 2,
-    ImageChannelDataTypeUnormInt16 = 3,
-    ImageChannelDataTypeUnormShort565 = 4,
-    ImageChannelDataTypeUnormShort555 = 5,
-    ImageChannelDataTypeUnormInt101010 = 6,
-    ImageChannelDataTypeSignedInt8 = 7,
-    ImageChannelDataTypeSignedInt16 = 8,
-    ImageChannelDataTypeSignedInt32 = 9,
-    ImageChannelDataTypeUnsignedInt8 = 10,
-    ImageChannelDataTypeUnsignedInt16 = 11,
-    ImageChannelDataTypeUnsignedInt32 = 12,
-    ImageChannelDataTypeHalfFloat = 13,
-    ImageChannelDataTypeFloat = 14,
-    ImageChannelDataTypeUnormInt24 = 15,
-    ImageChannelDataTypeUnormInt101010_2 = 16,
-    ImageChannelDataTypeMax = 0x7fffffff,
-};
-
-enum ImageOperandsShift {
-    ImageOperandsBiasShift = 0,
-    ImageOperandsLodShift = 1,
-    ImageOperandsGradShift = 2,
-    ImageOperandsConstOffsetShift = 3,
-    ImageOperandsOffsetShift = 4,
-    ImageOperandsConstOffsetsShift = 5,
-    ImageOperandsSampleShift = 6,
-    ImageOperandsMinLodShift = 7,
-    ImageOperandsMakeTexelAvailableShift = 8,
-    ImageOperandsMakeTexelAvailableKHRShift = 8,
-    ImageOperandsMakeTexelVisibleShift = 9,
-    ImageOperandsMakeTexelVisibleKHRShift = 9,
-    ImageOperandsNonPrivateTexelShift = 10,
-    ImageOperandsNonPrivateTexelKHRShift = 10,
-    ImageOperandsVolatileTexelShift = 11,
-    ImageOperandsVolatileTexelKHRShift = 11,
-    ImageOperandsSignExtendShift = 12,
-    ImageOperandsZeroExtendShift = 13,
-    ImageOperandsMax = 0x7fffffff,
-};
-
-enum ImageOperandsMask {
-    ImageOperandsMaskNone = 0,
-    ImageOperandsBiasMask = 0x00000001,
-    ImageOperandsLodMask = 0x00000002,
-    ImageOperandsGradMask = 0x00000004,
-    ImageOperandsConstOffsetMask = 0x00000008,
-    ImageOperandsOffsetMask = 0x00000010,
-    ImageOperandsConstOffsetsMask = 0x00000020,
-    ImageOperandsSampleMask = 0x00000040,
-    ImageOperandsMinLodMask = 0x00000080,
-    ImageOperandsMakeTexelAvailableMask = 0x00000100,
-    ImageOperandsMakeTexelAvailableKHRMask = 0x00000100,
-    ImageOperandsMakeTexelVisibleMask = 0x00000200,
-    ImageOperandsMakeTexelVisibleKHRMask = 0x00000200,
-    ImageOperandsNonPrivateTexelMask = 0x00000400,
-    ImageOperandsNonPrivateTexelKHRMask = 0x00000400,
-    ImageOperandsVolatileTexelMask = 0x00000800,
-    ImageOperandsVolatileTexelKHRMask = 0x00000800,
-    ImageOperandsSignExtendMask = 0x00001000,
-    ImageOperandsZeroExtendMask = 0x00002000,
-};
-
-enum FPFastMathModeShift {
-    FPFastMathModeNotNaNShift = 0,
-    FPFastMathModeNotInfShift = 1,
-    FPFastMathModeNSZShift = 2,
-    FPFastMathModeAllowRecipShift = 3,
-    FPFastMathModeFastShift = 4,
-    FPFastMathModeAllowContractFastINTELShift = 16,
-    FPFastMathModeAllowReassocINTELShift = 17,
-    FPFastMathModeMax = 0x7fffffff,
-};
-
-enum FPFastMathModeMask {
-    FPFastMathModeMaskNone = 0,
-    FPFastMathModeNotNaNMask = 0x00000001,
-    FPFastMathModeNotInfMask = 0x00000002,
-    FPFastMathModeNSZMask = 0x00000004,
-    FPFastMathModeAllowRecipMask = 0x00000008,
-    FPFastMathModeFastMask = 0x00000010,
-    FPFastMathModeAllowContractFastINTELMask = 0x00010000,
-    FPFastMathModeAllowReassocINTELMask = 0x00020000,
-};
-
-enum FPRoundingMode {
-    FPRoundingModeRTE = 0,
-    FPRoundingModeRTZ = 1,
-    FPRoundingModeRTP = 2,
-    FPRoundingModeRTN = 3,
-    FPRoundingModeMax = 0x7fffffff,
-};
-
-enum LinkageType {
-    LinkageTypeExport = 0,
-    LinkageTypeImport = 1,
-    LinkageTypeLinkOnceODR = 2,
-    LinkageTypeMax = 0x7fffffff,
-};
-
-enum AccessQualifier {
-    AccessQualifierReadOnly = 0,
-    AccessQualifierWriteOnly = 1,
-    AccessQualifierReadWrite = 2,
-    AccessQualifierMax = 0x7fffffff,
-};
-
-enum FunctionParameterAttribute {
-    FunctionParameterAttributeZext = 0,
-    FunctionParameterAttributeSext = 1,
-    FunctionParameterAttributeByVal = 2,
-    FunctionParameterAttributeSret = 3,
-    FunctionParameterAttributeNoAlias = 4,
-    FunctionParameterAttributeNoCapture = 5,
-    FunctionParameterAttributeNoWrite = 6,
-    FunctionParameterAttributeNoReadWrite = 7,
-    FunctionParameterAttributeMax = 0x7fffffff,
-};
-
-enum Decoration {
-    DecorationRelaxedPrecision = 0,
-    DecorationSpecId = 1,
-    DecorationBlock = 2,
-    DecorationBufferBlock = 3,
-    DecorationRowMajor = 4,
-    DecorationColMajor = 5,
-    DecorationArrayStride = 6,
-    DecorationMatrixStride = 7,
-    DecorationGLSLShared = 8,
-    DecorationGLSLPacked = 9,
-    DecorationCPacked = 10,
-    DecorationBuiltIn = 11,
-    DecorationNoPerspective = 13,
-    DecorationFlat = 14,
-    DecorationPatch = 15,
-    DecorationCentroid = 16,
-    DecorationSample = 17,
-    DecorationInvariant = 18,
-    DecorationRestrict = 19,
-    DecorationAliased = 20,
-    DecorationVolatile = 21,
-    DecorationConstant = 22,
-    DecorationCoherent = 23,
-    DecorationNonWritable = 24,
-    DecorationNonReadable = 25,
-    DecorationUniform = 26,
-    DecorationUniformId = 27,
-    DecorationSaturatedConversion = 28,
-    DecorationStream = 29,
-    DecorationLocation = 30,
-    DecorationComponent = 31,
-    DecorationIndex = 32,
-    DecorationBinding = 33,
-    DecorationDescriptorSet = 34,
-    DecorationOffset = 35,
-    DecorationXfbBuffer = 36,
-    DecorationXfbStride = 37,
-    DecorationFuncParamAttr = 38,
-    DecorationFPRoundingMode = 39,
-    DecorationFPFastMathMode = 40,
-    DecorationLinkageAttributes = 41,
-    DecorationNoContraction = 42,
-    DecorationInputAttachmentIndex = 43,
-    DecorationAlignment = 44,
-    DecorationMaxByteOffset = 45,
-    DecorationAlignmentId = 46,
-    DecorationMaxByteOffsetId = 47,
-    DecorationNoSignedWrap = 4469,
-    DecorationNoUnsignedWrap = 4470,
-    DecorationExplicitInterpAMD = 4999,
-    DecorationOverrideCoverageNV = 5248,
-    DecorationPassthroughNV = 5250,
-    DecorationViewportRelativeNV = 5252,
-    DecorationSecondaryViewportRelativeNV = 5256,
-    DecorationPerPrimitiveNV = 5271,
-    DecorationPerViewNV = 5272,
-    DecorationPerTaskNV = 5273,
-    DecorationPerVertexNV = 5285,
-    DecorationNonUniform = 5300,
-    DecorationNonUniformEXT = 5300,
-    DecorationRestrictPointer = 5355,
-    DecorationRestrictPointerEXT = 5355,
-    DecorationAliasedPointer = 5356,
-    DecorationAliasedPointerEXT = 5356,
-    DecorationSIMTCallINTEL = 5599,
-    DecorationReferencedIndirectlyINTEL = 5602,
-    DecorationClobberINTEL = 5607,
-    DecorationSideEffectsINTEL = 5608,
-    DecorationVectorComputeVariableINTEL = 5624,
-    DecorationFuncParamIOKindINTEL = 5625,
-    DecorationVectorComputeFunctionINTEL = 5626,
-    DecorationStackCallINTEL = 5627,
-    DecorationGlobalVariableOffsetINTEL = 5628,
-    DecorationCounterBuffer = 5634,
-    DecorationHlslCounterBufferGOOGLE = 5634,
-    DecorationHlslSemanticGOOGLE = 5635,
-    DecorationUserSemantic = 5635,
-    DecorationUserTypeGOOGLE = 5636,
-    DecorationFunctionRoundingModeINTEL = 5822,
-    DecorationFunctionDenormModeINTEL = 5823,
-    DecorationRegisterINTEL = 5825,
-    DecorationMemoryINTEL = 5826,
-    DecorationNumbanksINTEL = 5827,
-    DecorationBankwidthINTEL = 5828,
-    DecorationMaxPrivateCopiesINTEL = 5829,
-    DecorationSinglepumpINTEL = 5830,
-    DecorationDoublepumpINTEL = 5831,
-    DecorationMaxReplicatesINTEL = 5832,
-    DecorationSimpleDualPortINTEL = 5833,
-    DecorationMergeINTEL = 5834,
-    DecorationBankBitsINTEL = 5835,
-    DecorationForcePow2DepthINTEL = 5836,
-    DecorationBurstCoalesceINTEL = 5899,
-    DecorationCacheSizeINTEL = 5900,
-    DecorationDontStaticallyCoalesceINTEL = 5901,
-    DecorationPrefetchINTEL = 5902,
-    DecorationStallEnableINTEL = 5905,
-    DecorationFuseLoopsInFunctionINTEL = 5907,
-    DecorationBufferLocationINTEL = 5921,
-    DecorationIOPipeStorageINTEL = 5944,
-    DecorationFunctionFloatingPointModeINTEL = 6080,
-    DecorationSingleElementVectorINTEL = 6085,
-    DecorationVectorComputeCallableFunctionINTEL = 6087,
-    DecorationMax = 0x7fffffff,
-};
-
-enum BuiltIn {
-    BuiltInPosition = 0,
-    BuiltInPointSize = 1,
-    BuiltInClipDistance = 3,
-    BuiltInCullDistance = 4,
-    BuiltInVertexId = 5,
-    BuiltInInstanceId = 6,
-    BuiltInPrimitiveId = 7,
-    BuiltInInvocationId = 8,
-    BuiltInLayer = 9,
-    BuiltInViewportIndex = 10,
-    BuiltInTessLevelOuter = 11,
-    BuiltInTessLevelInner = 12,
-    BuiltInTessCoord = 13,
-    BuiltInPatchVertices = 14,
-    BuiltInFragCoord = 15,
-    BuiltInPointCoord = 16,
-    BuiltInFrontFacing = 17,
-    BuiltInSampleId = 18,
-    BuiltInSamplePosition = 19,
-    BuiltInSampleMask = 20,
-    BuiltInFragDepth = 22,
-    BuiltInHelperInvocation = 23,
-    BuiltInNumWorkgroups = 24,
-    BuiltInWorkgroupSize = 25,
-    BuiltInWorkgroupId = 26,
-    BuiltInLocalInvocationId = 27,
-    BuiltInGlobalInvocationId = 28,
-    BuiltInLocalInvocationIndex = 29,
-    BuiltInWorkDim = 30,
-    BuiltInGlobalSize = 31,
-    BuiltInEnqueuedWorkgroupSize = 32,
-    BuiltInGlobalOffset = 33,
-    BuiltInGlobalLinearId = 34,
-    BuiltInSubgroupSize = 36,
-    BuiltInSubgroupMaxSize = 37,
-    BuiltInNumSubgroups = 38,
-    BuiltInNumEnqueuedSubgroups = 39,
-    BuiltInSubgroupId = 40,
-    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,
-    BuiltInDrawIndex = 4426,
-    BuiltInPrimitiveShadingRateKHR = 4432,
-    BuiltInDeviceIndex = 4438,
-    BuiltInViewIndex = 4440,
-    BuiltInShadingRateKHR = 4444,
-    BuiltInBaryCoordNoPerspAMD = 4992,
-    BuiltInBaryCoordNoPerspCentroidAMD = 4993,
-    BuiltInBaryCoordNoPerspSampleAMD = 4994,
-    BuiltInBaryCoordSmoothAMD = 4995,
-    BuiltInBaryCoordSmoothCentroidAMD = 4996,
-    BuiltInBaryCoordSmoothSampleAMD = 4997,
-    BuiltInBaryCoordPullModelAMD = 4998,
-    BuiltInFragStencilRefEXT = 5014,
-    BuiltInViewportMaskNV = 5253,
-    BuiltInSecondaryPositionNV = 5257,
-    BuiltInSecondaryViewportMaskNV = 5258,
-    BuiltInPositionPerViewNV = 5261,
-    BuiltInViewportMaskPerViewNV = 5262,
-    BuiltInFullyCoveredEXT = 5264,
-    BuiltInTaskCountNV = 5274,
-    BuiltInPrimitiveCountNV = 5275,
-    BuiltInPrimitiveIndicesNV = 5276,
-    BuiltInClipDistancePerViewNV = 5277,
-    BuiltInCullDistancePerViewNV = 5278,
-    BuiltInLayerPerViewNV = 5279,
-    BuiltInMeshViewCountNV = 5280,
-    BuiltInMeshViewIndicesNV = 5281,
-    BuiltInBaryCoordNV = 5286,
-    BuiltInBaryCoordNoPerspNV = 5287,
-    BuiltInFragSizeEXT = 5292,
-    BuiltInFragmentSizeNV = 5292,
-    BuiltInFragInvocationCountEXT = 5293,
-    BuiltInInvocationsPerPixelNV = 5293,
-    BuiltInLaunchIdKHR = 5319,
-    BuiltInLaunchIdNV = 5319,
-    BuiltInLaunchSizeKHR = 5320,
-    BuiltInLaunchSizeNV = 5320,
-    BuiltInWorldRayOriginKHR = 5321,
-    BuiltInWorldRayOriginNV = 5321,
-    BuiltInWorldRayDirectionKHR = 5322,
-    BuiltInWorldRayDirectionNV = 5322,
-    BuiltInObjectRayOriginKHR = 5323,
-    BuiltInObjectRayOriginNV = 5323,
-    BuiltInObjectRayDirectionKHR = 5324,
-    BuiltInObjectRayDirectionNV = 5324,
-    BuiltInRayTminKHR = 5325,
-    BuiltInRayTminNV = 5325,
-    BuiltInRayTmaxKHR = 5326,
-    BuiltInRayTmaxNV = 5326,
-    BuiltInInstanceCustomIndexKHR = 5327,
-    BuiltInInstanceCustomIndexNV = 5327,
-    BuiltInObjectToWorldKHR = 5330,
-    BuiltInObjectToWorldNV = 5330,
-    BuiltInWorldToObjectKHR = 5331,
-    BuiltInWorldToObjectNV = 5331,
-    BuiltInHitTNV = 5332,
-    BuiltInHitKindKHR = 5333,
-    BuiltInHitKindNV = 5333,
-    BuiltInCurrentRayTimeNV = 5334,
-    BuiltInIncomingRayFlagsKHR = 5351,
-    BuiltInIncomingRayFlagsNV = 5351,
-    BuiltInRayGeometryIndexKHR = 5352,
-    BuiltInWarpsPerSMNV = 5374,
-    BuiltInSMCountNV = 5375,
-    BuiltInWarpIDNV = 5376,
-    BuiltInSMIDNV = 5377,
-    BuiltInMax = 0x7fffffff,
-};
-
-enum SelectionControlShift {
-    SelectionControlFlattenShift = 0,
-    SelectionControlDontFlattenShift = 1,
-    SelectionControlMax = 0x7fffffff,
-};
-
-enum SelectionControlMask {
-    SelectionControlMaskNone = 0,
-    SelectionControlFlattenMask = 0x00000001,
-    SelectionControlDontFlattenMask = 0x00000002,
-};
-
-enum LoopControlShift {
-    LoopControlUnrollShift = 0,
-    LoopControlDontUnrollShift = 1,
-    LoopControlDependencyInfiniteShift = 2,
-    LoopControlDependencyLengthShift = 3,
-    LoopControlMinIterationsShift = 4,
-    LoopControlMaxIterationsShift = 5,
-    LoopControlIterationMultipleShift = 6,
-    LoopControlPeelCountShift = 7,
-    LoopControlPartialCountShift = 8,
-    LoopControlInitiationIntervalINTELShift = 16,
-    LoopControlMaxConcurrencyINTELShift = 17,
-    LoopControlDependencyArrayINTELShift = 18,
-    LoopControlPipelineEnableINTELShift = 19,
-    LoopControlLoopCoalesceINTELShift = 20,
-    LoopControlMaxInterleavingINTELShift = 21,
-    LoopControlSpeculatedIterationsINTELShift = 22,
-    LoopControlNoFusionINTELShift = 23,
-    LoopControlMax = 0x7fffffff,
-};
-
-enum LoopControlMask {
-    LoopControlMaskNone = 0,
-    LoopControlUnrollMask = 0x00000001,
-    LoopControlDontUnrollMask = 0x00000002,
-    LoopControlDependencyInfiniteMask = 0x00000004,
-    LoopControlDependencyLengthMask = 0x00000008,
-    LoopControlMinIterationsMask = 0x00000010,
-    LoopControlMaxIterationsMask = 0x00000020,
-    LoopControlIterationMultipleMask = 0x00000040,
-    LoopControlPeelCountMask = 0x00000080,
-    LoopControlPartialCountMask = 0x00000100,
-    LoopControlInitiationIntervalINTELMask = 0x00010000,
-    LoopControlMaxConcurrencyINTELMask = 0x00020000,
-    LoopControlDependencyArrayINTELMask = 0x00040000,
-    LoopControlPipelineEnableINTELMask = 0x00080000,
-    LoopControlLoopCoalesceINTELMask = 0x00100000,
-    LoopControlMaxInterleavingINTELMask = 0x00200000,
-    LoopControlSpeculatedIterationsINTELMask = 0x00400000,
-    LoopControlNoFusionINTELMask = 0x00800000,
-};
-
-enum FunctionControlShift {
-    FunctionControlInlineShift = 0,
-    FunctionControlDontInlineShift = 1,
-    FunctionControlPureShift = 2,
-    FunctionControlConstShift = 3,
-    FunctionControlMax = 0x7fffffff,
-};
-
-enum FunctionControlMask {
-    FunctionControlMaskNone = 0,
-    FunctionControlInlineMask = 0x00000001,
-    FunctionControlDontInlineMask = 0x00000002,
-    FunctionControlPureMask = 0x00000004,
-    FunctionControlConstMask = 0x00000008,
-};
-
-enum MemorySemanticsShift {
-    MemorySemanticsAcquireShift = 1,
-    MemorySemanticsReleaseShift = 2,
-    MemorySemanticsAcquireReleaseShift = 3,
-    MemorySemanticsSequentiallyConsistentShift = 4,
-    MemorySemanticsUniformMemoryShift = 6,
-    MemorySemanticsSubgroupMemoryShift = 7,
-    MemorySemanticsWorkgroupMemoryShift = 8,
-    MemorySemanticsCrossWorkgroupMemoryShift = 9,
-    MemorySemanticsAtomicCounterMemoryShift = 10,
-    MemorySemanticsImageMemoryShift = 11,
-    MemorySemanticsOutputMemoryShift = 12,
-    MemorySemanticsOutputMemoryKHRShift = 12,
-    MemorySemanticsMakeAvailableShift = 13,
-    MemorySemanticsMakeAvailableKHRShift = 13,
-    MemorySemanticsMakeVisibleShift = 14,
-    MemorySemanticsMakeVisibleKHRShift = 14,
-    MemorySemanticsVolatileShift = 15,
-    MemorySemanticsMax = 0x7fffffff,
-};
-
-enum MemorySemanticsMask {
-    MemorySemanticsMaskNone = 0,
-    MemorySemanticsAcquireMask = 0x00000002,
-    MemorySemanticsReleaseMask = 0x00000004,
-    MemorySemanticsAcquireReleaseMask = 0x00000008,
-    MemorySemanticsSequentiallyConsistentMask = 0x00000010,
-    MemorySemanticsUniformMemoryMask = 0x00000040,
-    MemorySemanticsSubgroupMemoryMask = 0x00000080,
-    MemorySemanticsWorkgroupMemoryMask = 0x00000100,
-    MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,
-    MemorySemanticsAtomicCounterMemoryMask = 0x00000400,
-    MemorySemanticsImageMemoryMask = 0x00000800,
-    MemorySemanticsOutputMemoryMask = 0x00001000,
-    MemorySemanticsOutputMemoryKHRMask = 0x00001000,
-    MemorySemanticsMakeAvailableMask = 0x00002000,
-    MemorySemanticsMakeAvailableKHRMask = 0x00002000,
-    MemorySemanticsMakeVisibleMask = 0x00004000,
-    MemorySemanticsMakeVisibleKHRMask = 0x00004000,
-    MemorySemanticsVolatileMask = 0x00008000,
-};
-
-enum MemoryAccessShift {
-    MemoryAccessVolatileShift = 0,
-    MemoryAccessAlignedShift = 1,
-    MemoryAccessNontemporalShift = 2,
-    MemoryAccessMakePointerAvailableShift = 3,
-    MemoryAccessMakePointerAvailableKHRShift = 3,
-    MemoryAccessMakePointerVisibleShift = 4,
-    MemoryAccessMakePointerVisibleKHRShift = 4,
-    MemoryAccessNonPrivatePointerShift = 5,
-    MemoryAccessNonPrivatePointerKHRShift = 5,
-    MemoryAccessMax = 0x7fffffff,
-};
-
-enum MemoryAccessMask {
-    MemoryAccessMaskNone = 0,
-    MemoryAccessVolatileMask = 0x00000001,
-    MemoryAccessAlignedMask = 0x00000002,
-    MemoryAccessNontemporalMask = 0x00000004,
-    MemoryAccessMakePointerAvailableMask = 0x00000008,
-    MemoryAccessMakePointerAvailableKHRMask = 0x00000008,
-    MemoryAccessMakePointerVisibleMask = 0x00000010,
-    MemoryAccessMakePointerVisibleKHRMask = 0x00000010,
-    MemoryAccessNonPrivatePointerMask = 0x00000020,
-    MemoryAccessNonPrivatePointerKHRMask = 0x00000020,
-};
-
-enum Scope {
-    ScopeCrossDevice = 0,
-    ScopeDevice = 1,
-    ScopeWorkgroup = 2,
-    ScopeSubgroup = 3,
-    ScopeInvocation = 4,
-    ScopeQueueFamily = 5,
-    ScopeQueueFamilyKHR = 5,
-    ScopeShaderCallKHR = 6,
-    ScopeMax = 0x7fffffff,
-};
-
-enum GroupOperation {
-    GroupOperationReduce = 0,
-    GroupOperationInclusiveScan = 1,
-    GroupOperationExclusiveScan = 2,
-    GroupOperationClusteredReduce = 3,
-    GroupOperationPartitionedReduceNV = 6,
-    GroupOperationPartitionedInclusiveScanNV = 7,
-    GroupOperationPartitionedExclusiveScanNV = 8,
-    GroupOperationMax = 0x7fffffff,
-};
-
-enum KernelEnqueueFlags {
-    KernelEnqueueFlagsNoWait = 0,
-    KernelEnqueueFlagsWaitKernel = 1,
-    KernelEnqueueFlagsWaitWorkGroup = 2,
-    KernelEnqueueFlagsMax = 0x7fffffff,
-};
-
-enum KernelProfilingInfoShift {
-    KernelProfilingInfoCmdExecTimeShift = 0,
-    KernelProfilingInfoMax = 0x7fffffff,
-};
-
-enum KernelProfilingInfoMask {
-    KernelProfilingInfoMaskNone = 0,
-    KernelProfilingInfoCmdExecTimeMask = 0x00000001,
-};
-
-enum Capability {
-    CapabilityMatrix = 0,
-    CapabilityShader = 1,
-    CapabilityGeometry = 2,
-    CapabilityTessellation = 3,
-    CapabilityAddresses = 4,
-    CapabilityLinkage = 5,
-    CapabilityKernel = 6,
-    CapabilityVector16 = 7,
-    CapabilityFloat16Buffer = 8,
-    CapabilityFloat16 = 9,
-    CapabilityFloat64 = 10,
-    CapabilityInt64 = 11,
-    CapabilityInt64Atomics = 12,
-    CapabilityImageBasic = 13,
-    CapabilityImageReadWrite = 14,
-    CapabilityImageMipmap = 15,
-    CapabilityPipes = 17,
-    CapabilityGroups = 18,
-    CapabilityDeviceEnqueue = 19,
-    CapabilityLiteralSampler = 20,
-    CapabilityAtomicStorage = 21,
-    CapabilityInt16 = 22,
-    CapabilityTessellationPointSize = 23,
-    CapabilityGeometryPointSize = 24,
-    CapabilityImageGatherExtended = 25,
-    CapabilityStorageImageMultisample = 27,
-    CapabilityUniformBufferArrayDynamicIndexing = 28,
-    CapabilitySampledImageArrayDynamicIndexing = 29,
-    CapabilityStorageBufferArrayDynamicIndexing = 30,
-    CapabilityStorageImageArrayDynamicIndexing = 31,
-    CapabilityClipDistance = 32,
-    CapabilityCullDistance = 33,
-    CapabilityImageCubeArray = 34,
-    CapabilitySampleRateShading = 35,
-    CapabilityImageRect = 36,
-    CapabilitySampledRect = 37,
-    CapabilityGenericPointer = 38,
-    CapabilityInt8 = 39,
-    CapabilityInputAttachment = 40,
-    CapabilitySparseResidency = 41,
-    CapabilityMinLod = 42,
-    CapabilitySampled1D = 43,
-    CapabilityImage1D = 44,
-    CapabilitySampledCubeArray = 45,
-    CapabilitySampledBuffer = 46,
-    CapabilityImageBuffer = 47,
-    CapabilityImageMSArray = 48,
-    CapabilityStorageImageExtendedFormats = 49,
-    CapabilityImageQuery = 50,
-    CapabilityDerivativeControl = 51,
-    CapabilityInterpolationFunction = 52,
-    CapabilityTransformFeedback = 53,
-    CapabilityGeometryStreams = 54,
-    CapabilityStorageImageReadWithoutFormat = 55,
-    CapabilityStorageImageWriteWithoutFormat = 56,
-    CapabilityMultiViewport = 57,
-    CapabilitySubgroupDispatch = 58,
-    CapabilityNamedBarrier = 59,
-    CapabilityPipeStorage = 60,
-    CapabilityGroupNonUniform = 61,
-    CapabilityGroupNonUniformVote = 62,
-    CapabilityGroupNonUniformArithmetic = 63,
-    CapabilityGroupNonUniformBallot = 64,
-    CapabilityGroupNonUniformShuffle = 65,
-    CapabilityGroupNonUniformShuffleRelative = 66,
-    CapabilityGroupNonUniformClustered = 67,
-    CapabilityGroupNonUniformQuad = 68,
-    CapabilityShaderLayer = 69,
-    CapabilityShaderViewportIndex = 70,
-    CapabilityFragmentShadingRateKHR = 4422,
-    CapabilitySubgroupBallotKHR = 4423,
-    CapabilityDrawParameters = 4427,
-    CapabilityWorkgroupMemoryExplicitLayoutKHR = 4428,
-    CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,
-    CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,
-    CapabilitySubgroupVoteKHR = 4431,
-    CapabilityStorageBuffer16BitAccess = 4433,
-    CapabilityStorageUniformBufferBlock16 = 4433,
-    CapabilityStorageUniform16 = 4434,
-    CapabilityUniformAndStorageBuffer16BitAccess = 4434,
-    CapabilityStoragePushConstant16 = 4435,
-    CapabilityStorageInputOutput16 = 4436,
-    CapabilityDeviceGroup = 4437,
-    CapabilityMultiView = 4439,
-    CapabilityVariablePointersStorageBuffer = 4441,
-    CapabilityVariablePointers = 4442,
-    CapabilityAtomicStorageOps = 4445,
-    CapabilitySampleMaskPostDepthCoverage = 4447,
-    CapabilityStorageBuffer8BitAccess = 4448,
-    CapabilityUniformAndStorageBuffer8BitAccess = 4449,
-    CapabilityStoragePushConstant8 = 4450,
-    CapabilityDenormPreserve = 4464,
-    CapabilityDenormFlushToZero = 4465,
-    CapabilitySignedZeroInfNanPreserve = 4466,
-    CapabilityRoundingModeRTE = 4467,
-    CapabilityRoundingModeRTZ = 4468,
-    CapabilityRayQueryProvisionalKHR = 4471,
-    CapabilityRayQueryKHR = 4472,
-    CapabilityRayTraversalPrimitiveCullingKHR = 4478,
-    CapabilityRayTracingKHR = 4479,
-    CapabilityFloat16ImageAMD = 5008,
-    CapabilityImageGatherBiasLodAMD = 5009,
-    CapabilityFragmentMaskAMD = 5010,
-    CapabilityStencilExportEXT = 5013,
-    CapabilityImageReadWriteLodAMD = 5015,
-    CapabilityInt64ImageEXT = 5016,
-    CapabilityShaderClockKHR = 5055,
-    CapabilitySampleMaskOverrideCoverageNV = 5249,
-    CapabilityGeometryShaderPassthroughNV = 5251,
-    CapabilityShaderViewportIndexLayerEXT = 5254,
-    CapabilityShaderViewportIndexLayerNV = 5254,
-    CapabilityShaderViewportMaskNV = 5255,
-    CapabilityShaderStereoViewNV = 5259,
-    CapabilityPerViewAttributesNV = 5260,
-    CapabilityFragmentFullyCoveredEXT = 5265,
-    CapabilityMeshShadingNV = 5266,
-    CapabilityImageFootprintNV = 5282,
-    CapabilityFragmentBarycentricNV = 5284,
-    CapabilityComputeDerivativeGroupQuadsNV = 5288,
-    CapabilityFragmentDensityEXT = 5291,
-    CapabilityShadingRateNV = 5291,
-    CapabilityGroupNonUniformPartitionedNV = 5297,
-    CapabilityShaderNonUniform = 5301,
-    CapabilityShaderNonUniformEXT = 5301,
-    CapabilityRuntimeDescriptorArray = 5302,
-    CapabilityRuntimeDescriptorArrayEXT = 5302,
-    CapabilityInputAttachmentArrayDynamicIndexing = 5303,
-    CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303,
-    CapabilityUniformTexelBufferArrayDynamicIndexing = 5304,
-    CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304,
-    CapabilityStorageTexelBufferArrayDynamicIndexing = 5305,
-    CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305,
-    CapabilityUniformBufferArrayNonUniformIndexing = 5306,
-    CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306,
-    CapabilitySampledImageArrayNonUniformIndexing = 5307,
-    CapabilitySampledImageArrayNonUniformIndexingEXT = 5307,
-    CapabilityStorageBufferArrayNonUniformIndexing = 5308,
-    CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308,
-    CapabilityStorageImageArrayNonUniformIndexing = 5309,
-    CapabilityStorageImageArrayNonUniformIndexingEXT = 5309,
-    CapabilityInputAttachmentArrayNonUniformIndexing = 5310,
-    CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,
-    CapabilityUniformTexelBufferArrayNonUniformIndexing = 5311,
-    CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,
-    CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,
-    CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
-    CapabilityRayTracingNV = 5340,
-    CapabilityRayTracingMotionBlurNV = 5341,
-    CapabilityVulkanMemoryModel = 5345,
-    CapabilityVulkanMemoryModelKHR = 5345,
-    CapabilityVulkanMemoryModelDeviceScope = 5346,
-    CapabilityVulkanMemoryModelDeviceScopeKHR = 5346,
-    CapabilityPhysicalStorageBufferAddresses = 5347,
-    CapabilityPhysicalStorageBufferAddressesEXT = 5347,
-    CapabilityComputeDerivativeGroupLinearNV = 5350,
-    CapabilityRayTracingProvisionalKHR = 5353,
-    CapabilityCooperativeMatrixNV = 5357,
-    CapabilityFragmentShaderSampleInterlockEXT = 5363,
-    CapabilityFragmentShaderShadingRateInterlockEXT = 5372,
-    CapabilityShaderSMBuiltinsNV = 5373,
-    CapabilityFragmentShaderPixelInterlockEXT = 5378,
-    CapabilityDemoteToHelperInvocationEXT = 5379,
-    CapabilitySubgroupShuffleINTEL = 5568,
-    CapabilitySubgroupBufferBlockIOINTEL = 5569,
-    CapabilitySubgroupImageBlockIOINTEL = 5570,
-    CapabilitySubgroupImageMediaBlockIOINTEL = 5579,
-    CapabilityRoundToInfinityINTEL = 5582,
-    CapabilityFloatingPointModeINTEL = 5583,
-    CapabilityIntegerFunctions2INTEL = 5584,
-    CapabilityFunctionPointersINTEL = 5603,
-    CapabilityIndirectReferencesINTEL = 5604,
-    CapabilityAsmINTEL = 5606,
-    CapabilityAtomicFloat32MinMaxEXT = 5612,
-    CapabilityAtomicFloat64MinMaxEXT = 5613,
-    CapabilityAtomicFloat16MinMaxEXT = 5616,
-    CapabilityVectorComputeINTEL = 5617,
-    CapabilityVectorAnyINTEL = 5619,
-    CapabilityExpectAssumeKHR = 5629,
-    CapabilitySubgroupAvcMotionEstimationINTEL = 5696,
-    CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,
-    CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,
-    CapabilityVariableLengthArrayINTEL = 5817,
-    CapabilityFunctionFloatControlINTEL = 5821,
-    CapabilityFPGAMemoryAttributesINTEL = 5824,
-    CapabilityFPFastMathModeINTEL = 5837,
-    CapabilityArbitraryPrecisionIntegersINTEL = 5844,
-    CapabilityUnstructuredLoopControlsINTEL = 5886,
-    CapabilityFPGALoopControlsINTEL = 5888,
-    CapabilityKernelAttributesINTEL = 5892,
-    CapabilityFPGAKernelAttributesINTEL = 5897,
-    CapabilityFPGAMemoryAccessesINTEL = 5898,
-    CapabilityFPGAClusterAttributesINTEL = 5904,
-    CapabilityLoopFuseINTEL = 5906,
-    CapabilityFPGABufferLocationINTEL = 5920,
-    CapabilityUSMStorageClassesINTEL = 5935,
-    CapabilityIOPipesINTEL = 5943,
-    CapabilityBlockingPipesINTEL = 5945,
-    CapabilityFPGARegINTEL = 5948,
-    CapabilityAtomicFloat32AddEXT = 6033,
-    CapabilityAtomicFloat64AddEXT = 6034,
-    CapabilityLongConstantCompositeINTEL = 6089,
-    CapabilityAtomicFloat16AddEXT = 6095,
-    CapabilityMax = 0x7fffffff,
-};
-
-enum RayFlagsShift {
-    RayFlagsOpaqueKHRShift = 0,
-    RayFlagsNoOpaqueKHRShift = 1,
-    RayFlagsTerminateOnFirstHitKHRShift = 2,
-    RayFlagsSkipClosestHitShaderKHRShift = 3,
-    RayFlagsCullBackFacingTrianglesKHRShift = 4,
-    RayFlagsCullFrontFacingTrianglesKHRShift = 5,
-    RayFlagsCullOpaqueKHRShift = 6,
-    RayFlagsCullNoOpaqueKHRShift = 7,
-    RayFlagsSkipTrianglesKHRShift = 8,
-    RayFlagsSkipAABBsKHRShift = 9,
-    RayFlagsMax = 0x7fffffff,
-};
-
-enum RayFlagsMask {
-    RayFlagsMaskNone = 0,
-    RayFlagsOpaqueKHRMask = 0x00000001,
-    RayFlagsNoOpaqueKHRMask = 0x00000002,
-    RayFlagsTerminateOnFirstHitKHRMask = 0x00000004,
-    RayFlagsSkipClosestHitShaderKHRMask = 0x00000008,
-    RayFlagsCullBackFacingTrianglesKHRMask = 0x00000010,
-    RayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020,
-    RayFlagsCullOpaqueKHRMask = 0x00000040,
-    RayFlagsCullNoOpaqueKHRMask = 0x00000080,
-    RayFlagsSkipTrianglesKHRMask = 0x00000100,
-    RayFlagsSkipAABBsKHRMask = 0x00000200,
-};
-
-enum RayQueryIntersection {
-    RayQueryIntersectionRayQueryCandidateIntersectionKHR = 0,
-    RayQueryIntersectionRayQueryCommittedIntersectionKHR = 1,
-    RayQueryIntersectionMax = 0x7fffffff,
-};
-
-enum RayQueryCommittedIntersectionType {
-    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0,
-    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR = 1,
-    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR = 2,
-    RayQueryCommittedIntersectionTypeMax = 0x7fffffff,
-};
-
-enum RayQueryCandidateIntersectionType {
-    RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR = 0,
-    RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1,
-    RayQueryCandidateIntersectionTypeMax = 0x7fffffff,
-};
-
-enum FragmentShadingRateShift {
-    FragmentShadingRateVertical2PixelsShift = 0,
-    FragmentShadingRateVertical4PixelsShift = 1,
-    FragmentShadingRateHorizontal2PixelsShift = 2,
-    FragmentShadingRateHorizontal4PixelsShift = 3,
-    FragmentShadingRateMax = 0x7fffffff,
-};
-
-enum FragmentShadingRateMask {
-    FragmentShadingRateMaskNone = 0,
-    FragmentShadingRateVertical2PixelsMask = 0x00000001,
-    FragmentShadingRateVertical4PixelsMask = 0x00000002,
-    FragmentShadingRateHorizontal2PixelsMask = 0x00000004,
-    FragmentShadingRateHorizontal4PixelsMask = 0x00000008,
-};
-
-enum FPDenormMode {
-    FPDenormModePreserve = 0,
-    FPDenormModeFlushToZero = 1,
-    FPDenormModeMax = 0x7fffffff,
-};
-
-enum FPOperationMode {
-    FPOperationModeIEEE = 0,
-    FPOperationModeALT = 1,
-    FPOperationModeMax = 0x7fffffff,
-};
-
-enum Op {
-    OpNop = 0,
-    OpUndef = 1,
-    OpSourceContinued = 2,
-    OpSource = 3,
-    OpSourceExtension = 4,
-    OpName = 5,
-    OpMemberName = 6,
-    OpString = 7,
-    OpLine = 8,
-    OpExtension = 10,
-    OpExtInstImport = 11,
-    OpExtInst = 12,
-    OpMemoryModel = 14,
-    OpEntryPoint = 15,
-    OpExecutionMode = 16,
-    OpCapability = 17,
-    OpTypeVoid = 19,
-    OpTypeBool = 20,
-    OpTypeInt = 21,
-    OpTypeFloat = 22,
-    OpTypeVector = 23,
-    OpTypeMatrix = 24,
-    OpTypeImage = 25,
-    OpTypeSampler = 26,
-    OpTypeSampledImage = 27,
-    OpTypeArray = 28,
-    OpTypeRuntimeArray = 29,
-    OpTypeStruct = 30,
-    OpTypeOpaque = 31,
-    OpTypePointer = 32,
-    OpTypeFunction = 33,
-    OpTypeEvent = 34,
-    OpTypeDeviceEvent = 35,
-    OpTypeReserveId = 36,
-    OpTypeQueue = 37,
-    OpTypePipe = 38,
-    OpTypeForwardPointer = 39,
-    OpConstantTrue = 41,
-    OpConstantFalse = 42,
-    OpConstant = 43,
-    OpConstantComposite = 44,
-    OpConstantSampler = 45,
-    OpConstantNull = 46,
-    OpSpecConstantTrue = 48,
-    OpSpecConstantFalse = 49,
-    OpSpecConstant = 50,
-    OpSpecConstantComposite = 51,
-    OpSpecConstantOp = 52,
-    OpFunction = 54,
-    OpFunctionParameter = 55,
-    OpFunctionEnd = 56,
-    OpFunctionCall = 57,
-    OpVariable = 59,
-    OpImageTexelPointer = 60,
-    OpLoad = 61,
-    OpStore = 62,
-    OpCopyMemory = 63,
-    OpCopyMemorySized = 64,
-    OpAccessChain = 65,
-    OpInBoundsAccessChain = 66,
-    OpPtrAccessChain = 67,
-    OpArrayLength = 68,
-    OpGenericPtrMemSemantics = 69,
-    OpInBoundsPtrAccessChain = 70,
-    OpDecorate = 71,
-    OpMemberDecorate = 72,
-    OpDecorationGroup = 73,
-    OpGroupDecorate = 74,
-    OpGroupMemberDecorate = 75,
-    OpVectorExtractDynamic = 77,
-    OpVectorInsertDynamic = 78,
-    OpVectorShuffle = 79,
-    OpCompositeConstruct = 80,
-    OpCompositeExtract = 81,
-    OpCompositeInsert = 82,
-    OpCopyObject = 83,
-    OpTranspose = 84,
-    OpSampledImage = 86,
-    OpImageSampleImplicitLod = 87,
-    OpImageSampleExplicitLod = 88,
-    OpImageSampleDrefImplicitLod = 89,
-    OpImageSampleDrefExplicitLod = 90,
-    OpImageSampleProjImplicitLod = 91,
-    OpImageSampleProjExplicitLod = 92,
-    OpImageSampleProjDrefImplicitLod = 93,
-    OpImageSampleProjDrefExplicitLod = 94,
-    OpImageFetch = 95,
-    OpImageGather = 96,
-    OpImageDrefGather = 97,
-    OpImageRead = 98,
-    OpImageWrite = 99,
-    OpImage = 100,
-    OpImageQueryFormat = 101,
-    OpImageQueryOrder = 102,
-    OpImageQuerySizeLod = 103,
-    OpImageQuerySize = 104,
-    OpImageQueryLod = 105,
-    OpImageQueryLevels = 106,
-    OpImageQuerySamples = 107,
-    OpConvertFToU = 109,
-    OpConvertFToS = 110,
-    OpConvertSToF = 111,
-    OpConvertUToF = 112,
-    OpUConvert = 113,
-    OpSConvert = 114,
-    OpFConvert = 115,
-    OpQuantizeToF16 = 116,
-    OpConvertPtrToU = 117,
-    OpSatConvertSToU = 118,
-    OpSatConvertUToS = 119,
-    OpConvertUToPtr = 120,
-    OpPtrCastToGeneric = 121,
-    OpGenericCastToPtr = 122,
-    OpGenericCastToPtrExplicit = 123,
-    OpBitcast = 124,
-    OpSNegate = 126,
-    OpFNegate = 127,
-    OpIAdd = 128,
-    OpFAdd = 129,
-    OpISub = 130,
-    OpFSub = 131,
-    OpIMul = 132,
-    OpFMul = 133,
-    OpUDiv = 134,
-    OpSDiv = 135,
-    OpFDiv = 136,
-    OpUMod = 137,
-    OpSRem = 138,
-    OpSMod = 139,
-    OpFRem = 140,
-    OpFMod = 141,
-    OpVectorTimesScalar = 142,
-    OpMatrixTimesScalar = 143,
-    OpVectorTimesMatrix = 144,
-    OpMatrixTimesVector = 145,
-    OpMatrixTimesMatrix = 146,
-    OpOuterProduct = 147,
-    OpDot = 148,
-    OpIAddCarry = 149,
-    OpISubBorrow = 150,
-    OpUMulExtended = 151,
-    OpSMulExtended = 152,
-    OpAny = 154,
-    OpAll = 155,
-    OpIsNan = 156,
-    OpIsInf = 157,
-    OpIsFinite = 158,
-    OpIsNormal = 159,
-    OpSignBitSet = 160,
-    OpLessOrGreater = 161,
-    OpOrdered = 162,
-    OpUnordered = 163,
-    OpLogicalEqual = 164,
-    OpLogicalNotEqual = 165,
-    OpLogicalOr = 166,
-    OpLogicalAnd = 167,
-    OpLogicalNot = 168,
-    OpSelect = 169,
-    OpIEqual = 170,
-    OpINotEqual = 171,
-    OpUGreaterThan = 172,
-    OpSGreaterThan = 173,
-    OpUGreaterThanEqual = 174,
-    OpSGreaterThanEqual = 175,
-    OpULessThan = 176,
-    OpSLessThan = 177,
-    OpULessThanEqual = 178,
-    OpSLessThanEqual = 179,
-    OpFOrdEqual = 180,
-    OpFUnordEqual = 181,
-    OpFOrdNotEqual = 182,
-    OpFUnordNotEqual = 183,
-    OpFOrdLessThan = 184,
-    OpFUnordLessThan = 185,
-    OpFOrdGreaterThan = 186,
-    OpFUnordGreaterThan = 187,
-    OpFOrdLessThanEqual = 188,
-    OpFUnordLessThanEqual = 189,
-    OpFOrdGreaterThanEqual = 190,
-    OpFUnordGreaterThanEqual = 191,
-    OpShiftRightLogical = 194,
-    OpShiftRightArithmetic = 195,
-    OpShiftLeftLogical = 196,
-    OpBitwiseOr = 197,
-    OpBitwiseXor = 198,
-    OpBitwiseAnd = 199,
-    OpNot = 200,
-    OpBitFieldInsert = 201,
-    OpBitFieldSExtract = 202,
-    OpBitFieldUExtract = 203,
-    OpBitReverse = 204,
-    OpBitCount = 205,
-    OpDPdx = 207,
-    OpDPdy = 208,
-    OpFwidth = 209,
-    OpDPdxFine = 210,
-    OpDPdyFine = 211,
-    OpFwidthFine = 212,
-    OpDPdxCoarse = 213,
-    OpDPdyCoarse = 214,
-    OpFwidthCoarse = 215,
-    OpEmitVertex = 218,
-    OpEndPrimitive = 219,
-    OpEmitStreamVertex = 220,
-    OpEndStreamPrimitive = 221,
-    OpControlBarrier = 224,
-    OpMemoryBarrier = 225,
-    OpAtomicLoad = 227,
-    OpAtomicStore = 228,
-    OpAtomicExchange = 229,
-    OpAtomicCompareExchange = 230,
-    OpAtomicCompareExchangeWeak = 231,
-    OpAtomicIIncrement = 232,
-    OpAtomicIDecrement = 233,
-    OpAtomicIAdd = 234,
-    OpAtomicISub = 235,
-    OpAtomicSMin = 236,
-    OpAtomicUMin = 237,
-    OpAtomicSMax = 238,
-    OpAtomicUMax = 239,
-    OpAtomicAnd = 240,
-    OpAtomicOr = 241,
-    OpAtomicXor = 242,
-    OpPhi = 245,
-    OpLoopMerge = 246,
-    OpSelectionMerge = 247,
-    OpLabel = 248,
-    OpBranch = 249,
-    OpBranchConditional = 250,
-    OpSwitch = 251,
-    OpKill = 252,
-    OpReturn = 253,
-    OpReturnValue = 254,
-    OpUnreachable = 255,
-    OpLifetimeStart = 256,
-    OpLifetimeStop = 257,
-    OpGroupAsyncCopy = 259,
-    OpGroupWaitEvents = 260,
-    OpGroupAll = 261,
-    OpGroupAny = 262,
-    OpGroupBroadcast = 263,
-    OpGroupIAdd = 264,
-    OpGroupFAdd = 265,
-    OpGroupFMin = 266,
-    OpGroupUMin = 267,
-    OpGroupSMin = 268,
-    OpGroupFMax = 269,
-    OpGroupUMax = 270,
-    OpGroupSMax = 271,
-    OpReadPipe = 274,
-    OpWritePipe = 275,
-    OpReservedReadPipe = 276,
-    OpReservedWritePipe = 277,
-    OpReserveReadPipePackets = 278,
-    OpReserveWritePipePackets = 279,
-    OpCommitReadPipe = 280,
-    OpCommitWritePipe = 281,
-    OpIsValidReserveId = 282,
-    OpGetNumPipePackets = 283,
-    OpGetMaxPipePackets = 284,
-    OpGroupReserveReadPipePackets = 285,
-    OpGroupReserveWritePipePackets = 286,
-    OpGroupCommitReadPipe = 287,
-    OpGroupCommitWritePipe = 288,
-    OpEnqueueMarker = 291,
-    OpEnqueueKernel = 292,
-    OpGetKernelNDrangeSubGroupCount = 293,
-    OpGetKernelNDrangeMaxSubGroupSize = 294,
-    OpGetKernelWorkGroupSize = 295,
-    OpGetKernelPreferredWorkGroupSizeMultiple = 296,
-    OpRetainEvent = 297,
-    OpReleaseEvent = 298,
-    OpCreateUserEvent = 299,
-    OpIsValidEvent = 300,
-    OpSetUserEventStatus = 301,
-    OpCaptureEventProfilingInfo = 302,
-    OpGetDefaultQueue = 303,
-    OpBuildNDRange = 304,
-    OpImageSparseSampleImplicitLod = 305,
-    OpImageSparseSampleExplicitLod = 306,
-    OpImageSparseSampleDrefImplicitLod = 307,
-    OpImageSparseSampleDrefExplicitLod = 308,
-    OpImageSparseSampleProjImplicitLod = 309,
-    OpImageSparseSampleProjExplicitLod = 310,
-    OpImageSparseSampleProjDrefImplicitLod = 311,
-    OpImageSparseSampleProjDrefExplicitLod = 312,
-    OpImageSparseFetch = 313,
-    OpImageSparseGather = 314,
-    OpImageSparseDrefGather = 315,
-    OpImageSparseTexelsResident = 316,
-    OpNoLine = 317,
-    OpAtomicFlagTestAndSet = 318,
-    OpAtomicFlagClear = 319,
-    OpImageSparseRead = 320,
-    OpSizeOf = 321,
-    OpTypePipeStorage = 322,
-    OpConstantPipeStorage = 323,
-    OpCreatePipeFromPipeStorage = 324,
-    OpGetKernelLocalSizeForSubgroupCount = 325,
-    OpGetKernelMaxNumSubgroups = 326,
-    OpTypeNamedBarrier = 327,
-    OpNamedBarrierInitialize = 328,
-    OpMemoryNamedBarrier = 329,
-    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,
-    OpCopyLogical = 400,
-    OpPtrEqual = 401,
-    OpPtrNotEqual = 402,
-    OpPtrDiff = 403,
-    OpTerminateInvocation = 4416,
-    OpSubgroupBallotKHR = 4421,
-    OpSubgroupFirstInvocationKHR = 4422,
-    OpSubgroupAllKHR = 4428,
-    OpSubgroupAnyKHR = 4429,
-    OpSubgroupAllEqualKHR = 4430,
-    OpSubgroupReadInvocationKHR = 4432,
-    OpTraceRayKHR = 4445,
-    OpExecuteCallableKHR = 4446,
-    OpConvertUToAccelerationStructureKHR = 4447,
-    OpIgnoreIntersectionKHR = 4448,
-    OpTerminateRayKHR = 4449,
-    OpTypeRayQueryKHR = 4472,
-    OpRayQueryInitializeKHR = 4473,
-    OpRayQueryTerminateKHR = 4474,
-    OpRayQueryGenerateIntersectionKHR = 4475,
-    OpRayQueryConfirmIntersectionKHR = 4476,
-    OpRayQueryProceedKHR = 4477,
-    OpRayQueryGetIntersectionTypeKHR = 4479,
-    OpGroupIAddNonUniformAMD = 5000,
-    OpGroupFAddNonUniformAMD = 5001,
-    OpGroupFMinNonUniformAMD = 5002,
-    OpGroupUMinNonUniformAMD = 5003,
-    OpGroupSMinNonUniformAMD = 5004,
-    OpGroupFMaxNonUniformAMD = 5005,
-    OpGroupUMaxNonUniformAMD = 5006,
-    OpGroupSMaxNonUniformAMD = 5007,
-    OpFragmentMaskFetchAMD = 5011,
-    OpFragmentFetchAMD = 5012,
-    OpReadClockKHR = 5056,
-    OpImageSampleFootprintNV = 5283,
-    OpGroupNonUniformPartitionNV = 5296,
-    OpWritePackedPrimitiveIndices4x8NV = 5299,
-    OpReportIntersectionKHR = 5334,
-    OpReportIntersectionNV = 5334,
-    OpIgnoreIntersectionNV = 5335,
-    OpTerminateRayNV = 5336,
-    OpTraceNV = 5337,
-    OpTraceMotionNV = 5338,
-    OpTraceRayMotionNV = 5339,
-    OpTypeAccelerationStructureKHR = 5341,
-    OpTypeAccelerationStructureNV = 5341,
-    OpExecuteCallableNV = 5344,
-    OpTypeCooperativeMatrixNV = 5358,
-    OpCooperativeMatrixLoadNV = 5359,
-    OpCooperativeMatrixStoreNV = 5360,
-    OpCooperativeMatrixMulAddNV = 5361,
-    OpCooperativeMatrixLengthNV = 5362,
-    OpBeginInvocationInterlockEXT = 5364,
-    OpEndInvocationInterlockEXT = 5365,
-    OpDemoteToHelperInvocationEXT = 5380,
-    OpIsHelperInvocationEXT = 5381,
-    OpSubgroupShuffleINTEL = 5571,
-    OpSubgroupShuffleDownINTEL = 5572,
-    OpSubgroupShuffleUpINTEL = 5573,
-    OpSubgroupShuffleXorINTEL = 5574,
-    OpSubgroupBlockReadINTEL = 5575,
-    OpSubgroupBlockWriteINTEL = 5576,
-    OpSubgroupImageBlockReadINTEL = 5577,
-    OpSubgroupImageBlockWriteINTEL = 5578,
-    OpSubgroupImageMediaBlockReadINTEL = 5580,
-    OpSubgroupImageMediaBlockWriteINTEL = 5581,
-    OpUCountLeadingZerosINTEL = 5585,
-    OpUCountTrailingZerosINTEL = 5586,
-    OpAbsISubINTEL = 5587,
-    OpAbsUSubINTEL = 5588,
-    OpIAddSatINTEL = 5589,
-    OpUAddSatINTEL = 5590,
-    OpIAverageINTEL = 5591,
-    OpUAverageINTEL = 5592,
-    OpIAverageRoundedINTEL = 5593,
-    OpUAverageRoundedINTEL = 5594,
-    OpISubSatINTEL = 5595,
-    OpUSubSatINTEL = 5596,
-    OpIMul32x16INTEL = 5597,
-    OpUMul32x16INTEL = 5598,
-    OpConstFunctionPointerINTEL = 5600,
-    OpFunctionPointerCallINTEL = 5601,
-    OpAsmTargetINTEL = 5609,
-    OpAsmINTEL = 5610,
-    OpAsmCallINTEL = 5611,
-    OpAtomicFMinEXT = 5614,
-    OpAtomicFMaxEXT = 5615,
-    OpAssumeTrueKHR = 5630,
-    OpExpectKHR = 5631,
-    OpDecorateString = 5632,
-    OpDecorateStringGOOGLE = 5632,
-    OpMemberDecorateString = 5633,
-    OpMemberDecorateStringGOOGLE = 5633,
-    OpVmeImageINTEL = 5699,
-    OpTypeVmeImageINTEL = 5700,
-    OpTypeAvcImePayloadINTEL = 5701,
-    OpTypeAvcRefPayloadINTEL = 5702,
-    OpTypeAvcSicPayloadINTEL = 5703,
-    OpTypeAvcMcePayloadINTEL = 5704,
-    OpTypeAvcMceResultINTEL = 5705,
-    OpTypeAvcImeResultINTEL = 5706,
-    OpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707,
-    OpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708,
-    OpTypeAvcImeSingleReferenceStreaminINTEL = 5709,
-    OpTypeAvcImeDualReferenceStreaminINTEL = 5710,
-    OpTypeAvcRefResultINTEL = 5711,
-    OpTypeAvcSicResultINTEL = 5712,
-    OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713,
-    OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714,
-    OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715,
-    OpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716,
-    OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717,
-    OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718,
-    OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719,
-    OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720,
-    OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721,
-    OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722,
-    OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723,
-    OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724,
-    OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725,
-    OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726,
-    OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727,
-    OpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728,
-    OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729,
-    OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730,
-    OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731,
-    OpSubgroupAvcMceConvertToImePayloadINTEL = 5732,
-    OpSubgroupAvcMceConvertToImeResultINTEL = 5733,
-    OpSubgroupAvcMceConvertToRefPayloadINTEL = 5734,
-    OpSubgroupAvcMceConvertToRefResultINTEL = 5735,
-    OpSubgroupAvcMceConvertToSicPayloadINTEL = 5736,
-    OpSubgroupAvcMceConvertToSicResultINTEL = 5737,
-    OpSubgroupAvcMceGetMotionVectorsINTEL = 5738,
-    OpSubgroupAvcMceGetInterDistortionsINTEL = 5739,
-    OpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740,
-    OpSubgroupAvcMceGetInterMajorShapeINTEL = 5741,
-    OpSubgroupAvcMceGetInterMinorShapeINTEL = 5742,
-    OpSubgroupAvcMceGetInterDirectionsINTEL = 5743,
-    OpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744,
-    OpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745,
-    OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746,
-    OpSubgroupAvcImeInitializeINTEL = 5747,
-    OpSubgroupAvcImeSetSingleReferenceINTEL = 5748,
-    OpSubgroupAvcImeSetDualReferenceINTEL = 5749,
-    OpSubgroupAvcImeRefWindowSizeINTEL = 5750,
-    OpSubgroupAvcImeAdjustRefOffsetINTEL = 5751,
-    OpSubgroupAvcImeConvertToMcePayloadINTEL = 5752,
-    OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753,
-    OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754,
-    OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755,
-    OpSubgroupAvcImeSetWeightedSadINTEL = 5756,
-    OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757,
-    OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758,
-    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759,
-    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760,
-    OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761,
-    OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762,
-    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763,
-    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764,
-    OpSubgroupAvcImeConvertToMceResultINTEL = 5765,
-    OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766,
-    OpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767,
-    OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768,
-    OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769,
-    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770,
-    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771,
-    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772,
-    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773,
-    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774,
-    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775,
-    OpSubgroupAvcImeGetBorderReachedINTEL = 5776,
-    OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777,
-    OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778,
-    OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779,
-    OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780,
-    OpSubgroupAvcFmeInitializeINTEL = 5781,
-    OpSubgroupAvcBmeInitializeINTEL = 5782,
-    OpSubgroupAvcRefConvertToMcePayloadINTEL = 5783,
-    OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784,
-    OpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785,
-    OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786,
-    OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787,
-    OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788,
-    OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789,
-    OpSubgroupAvcRefConvertToMceResultINTEL = 5790,
-    OpSubgroupAvcSicInitializeINTEL = 5791,
-    OpSubgroupAvcSicConfigureSkcINTEL = 5792,
-    OpSubgroupAvcSicConfigureIpeLumaINTEL = 5793,
-    OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794,
-    OpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795,
-    OpSubgroupAvcSicConvertToMcePayloadINTEL = 5796,
-    OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797,
-    OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798,
-    OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799,
-    OpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800,
-    OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801,
-    OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802,
-    OpSubgroupAvcSicEvaluateIpeINTEL = 5803,
-    OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804,
-    OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805,
-    OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806,
-    OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807,
-    OpSubgroupAvcSicConvertToMceResultINTEL = 5808,
-    OpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809,
-    OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810,
-    OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811,
-    OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812,
-    OpSubgroupAvcSicGetIpeChromaModeINTEL = 5813,
-    OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,
-    OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,
-    OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,
-    OpVariableLengthArrayINTEL = 5818,
-    OpSaveMemoryINTEL = 5819,
-    OpRestoreMemoryINTEL = 5820,
-    OpLoopControlINTEL = 5887,
-    OpPtrCastToCrossWorkgroupINTEL = 5934,
-    OpCrossWorkgroupCastToPtrINTEL = 5938,
-    OpReadPipeBlockingINTEL = 5946,
-    OpWritePipeBlockingINTEL = 5947,
-    OpFPGARegINTEL = 5949,
-    OpRayQueryGetRayTMinKHR = 6016,
-    OpRayQueryGetRayFlagsKHR = 6017,
-    OpRayQueryGetIntersectionTKHR = 6018,
-    OpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019,
-    OpRayQueryGetIntersectionInstanceIdKHR = 6020,
-    OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021,
-    OpRayQueryGetIntersectionGeometryIndexKHR = 6022,
-    OpRayQueryGetIntersectionPrimitiveIndexKHR = 6023,
-    OpRayQueryGetIntersectionBarycentricsKHR = 6024,
-    OpRayQueryGetIntersectionFrontFaceKHR = 6025,
-    OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026,
-    OpRayQueryGetIntersectionObjectRayDirectionKHR = 6027,
-    OpRayQueryGetIntersectionObjectRayOriginKHR = 6028,
-    OpRayQueryGetWorldRayDirectionKHR = 6029,
-    OpRayQueryGetWorldRayOriginKHR = 6030,
-    OpRayQueryGetIntersectionObjectToWorldKHR = 6031,
-    OpRayQueryGetIntersectionWorldToObjectKHR = 6032,
-    OpAtomicFAddEXT = 6035,
-    OpTypeBufferSurfaceINTEL = 6086,
-    OpTypeStructContinuedINTEL = 6090,
-    OpConstantCompositeContinuedINTEL = 6091,
-    OpSpecConstantCompositeContinuedINTEL = 6092,
-    OpMax = 0x7fffffff,
-};
-
-#ifdef SPV_ENABLE_UTILITY_CODE
-inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
-    *hasResult = *hasResultType = false;
-    switch (opcode) {
-    default: /* unknown opcode */ break;
-    case OpNop: *hasResult = false; *hasResultType = false; break;
-    case OpUndef: *hasResult = true; *hasResultType = true; break;
-    case OpSourceContinued: *hasResult = false; *hasResultType = false; break;
-    case OpSource: *hasResult = false; *hasResultType = false; break;
-    case OpSourceExtension: *hasResult = false; *hasResultType = false; break;
-    case OpName: *hasResult = false; *hasResultType = false; break;
-    case OpMemberName: *hasResult = false; *hasResultType = false; break;
-    case OpString: *hasResult = true; *hasResultType = false; break;
-    case OpLine: *hasResult = false; *hasResultType = false; break;
-    case OpExtension: *hasResult = false; *hasResultType = false; break;
-    case OpExtInstImport: *hasResult = true; *hasResultType = false; break;
-    case OpExtInst: *hasResult = true; *hasResultType = true; break;
-    case OpMemoryModel: *hasResult = false; *hasResultType = false; break;
-    case OpEntryPoint: *hasResult = false; *hasResultType = false; break;
-    case OpExecutionMode: *hasResult = false; *hasResultType = false; break;
-    case OpCapability: *hasResult = false; *hasResultType = false; break;
-    case OpTypeVoid: *hasResult = true; *hasResultType = false; break;
-    case OpTypeBool: *hasResult = true; *hasResultType = false; break;
-    case OpTypeInt: *hasResult = true; *hasResultType = false; break;
-    case OpTypeFloat: *hasResult = true; *hasResultType = false; break;
-    case OpTypeVector: *hasResult = true; *hasResultType = false; break;
-    case OpTypeMatrix: *hasResult = true; *hasResultType = false; break;
-    case OpTypeImage: *hasResult = true; *hasResultType = false; break;
-    case OpTypeSampler: *hasResult = true; *hasResultType = false; break;
-    case OpTypeSampledImage: *hasResult = true; *hasResultType = false; break;
-    case OpTypeArray: *hasResult = true; *hasResultType = false; break;
-    case OpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break;
-    case OpTypeStruct: *hasResult = true; *hasResultType = false; break;
-    case OpTypeOpaque: *hasResult = true; *hasResultType = false; break;
-    case OpTypePointer: *hasResult = true; *hasResultType = false; break;
-    case OpTypeFunction: *hasResult = true; *hasResultType = false; break;
-    case OpTypeEvent: *hasResult = true; *hasResultType = false; break;
-    case OpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break;
-    case OpTypeReserveId: *hasResult = true; *hasResultType = false; break;
-    case OpTypeQueue: *hasResult = true; *hasResultType = false; break;
-    case OpTypePipe: *hasResult = true; *hasResultType = false; break;
-    case OpTypeForwardPointer: *hasResult = false; *hasResultType = false; break;
-    case OpConstantTrue: *hasResult = true; *hasResultType = true; break;
-    case OpConstantFalse: *hasResult = true; *hasResultType = true; break;
-    case OpConstant: *hasResult = true; *hasResultType = true; break;
-    case OpConstantComposite: *hasResult = true; *hasResultType = true; break;
-    case OpConstantSampler: *hasResult = true; *hasResultType = true; break;
-    case OpConstantNull: *hasResult = true; *hasResultType = true; break;
-    case OpSpecConstantTrue: *hasResult = true; *hasResultType = true; break;
-    case OpSpecConstantFalse: *hasResult = true; *hasResultType = true; break;
-    case OpSpecConstant: *hasResult = true; *hasResultType = true; break;
-    case OpSpecConstantComposite: *hasResult = true; *hasResultType = true; break;
-    case OpSpecConstantOp: *hasResult = true; *hasResultType = true; break;
-    case OpFunction: *hasResult = true; *hasResultType = true; break;
-    case OpFunctionParameter: *hasResult = true; *hasResultType = true; break;
-    case OpFunctionEnd: *hasResult = false; *hasResultType = false; break;
-    case OpFunctionCall: *hasResult = true; *hasResultType = true; break;
-    case OpVariable: *hasResult = true; *hasResultType = true; break;
-    case OpImageTexelPointer: *hasResult = true; *hasResultType = true; break;
-    case OpLoad: *hasResult = true; *hasResultType = true; break;
-    case OpStore: *hasResult = false; *hasResultType = false; break;
-    case OpCopyMemory: *hasResult = false; *hasResultType = false; break;
-    case OpCopyMemorySized: *hasResult = false; *hasResultType = false; break;
-    case OpAccessChain: *hasResult = true; *hasResultType = true; break;
-    case OpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break;
-    case OpPtrAccessChain: *hasResult = true; *hasResultType = true; break;
-    case OpArrayLength: *hasResult = true; *hasResultType = true; break;
-    case OpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break;
-    case OpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break;
-    case OpDecorate: *hasResult = false; *hasResultType = false; break;
-    case OpMemberDecorate: *hasResult = false; *hasResultType = false; break;
-    case OpDecorationGroup: *hasResult = true; *hasResultType = false; break;
-    case OpGroupDecorate: *hasResult = false; *hasResultType = false; break;
-    case OpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break;
-    case OpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break;
-    case OpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break;
-    case OpVectorShuffle: *hasResult = true; *hasResultType = true; break;
-    case OpCompositeConstruct: *hasResult = true; *hasResultType = true; break;
-    case OpCompositeExtract: *hasResult = true; *hasResultType = true; break;
-    case OpCompositeInsert: *hasResult = true; *hasResultType = true; break;
-    case OpCopyObject: *hasResult = true; *hasResultType = true; break;
-    case OpTranspose: *hasResult = true; *hasResultType = true; break;
-    case OpSampledImage: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageFetch: *hasResult = true; *hasResultType = true; break;
-    case OpImageGather: *hasResult = true; *hasResultType = true; break;
-    case OpImageDrefGather: *hasResult = true; *hasResultType = true; break;
-    case OpImageRead: *hasResult = true; *hasResultType = true; break;
-    case OpImageWrite: *hasResult = false; *hasResultType = false; break;
-    case OpImage: *hasResult = true; *hasResultType = true; break;
-    case OpImageQueryFormat: *hasResult = true; *hasResultType = true; break;
-    case OpImageQueryOrder: *hasResult = true; *hasResultType = true; break;
-    case OpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageQuerySize: *hasResult = true; *hasResultType = true; break;
-    case OpImageQueryLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageQueryLevels: *hasResult = true; *hasResultType = true; break;
-    case OpImageQuerySamples: *hasResult = true; *hasResultType = true; break;
-    case OpConvertFToU: *hasResult = true; *hasResultType = true; break;
-    case OpConvertFToS: *hasResult = true; *hasResultType = true; break;
-    case OpConvertSToF: *hasResult = true; *hasResultType = true; break;
-    case OpConvertUToF: *hasResult = true; *hasResultType = true; break;
-    case OpUConvert: *hasResult = true; *hasResultType = true; break;
-    case OpSConvert: *hasResult = true; *hasResultType = true; break;
-    case OpFConvert: *hasResult = true; *hasResultType = true; break;
-    case OpQuantizeToF16: *hasResult = true; *hasResultType = true; break;
-    case OpConvertPtrToU: *hasResult = true; *hasResultType = true; break;
-    case OpSatConvertSToU: *hasResult = true; *hasResultType = true; break;
-    case OpSatConvertUToS: *hasResult = true; *hasResultType = true; break;
-    case OpConvertUToPtr: *hasResult = true; *hasResultType = true; break;
-    case OpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break;
-    case OpGenericCastToPtr: *hasResult = true; *hasResultType = true; break;
-    case OpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break;
-    case OpBitcast: *hasResult = true; *hasResultType = true; break;
-    case OpSNegate: *hasResult = true; *hasResultType = true; break;
-    case OpFNegate: *hasResult = true; *hasResultType = true; break;
-    case OpIAdd: *hasResult = true; *hasResultType = true; break;
-    case OpFAdd: *hasResult = true; *hasResultType = true; break;
-    case OpISub: *hasResult = true; *hasResultType = true; break;
-    case OpFSub: *hasResult = true; *hasResultType = true; break;
-    case OpIMul: *hasResult = true; *hasResultType = true; break;
-    case OpFMul: *hasResult = true; *hasResultType = true; break;
-    case OpUDiv: *hasResult = true; *hasResultType = true; break;
-    case OpSDiv: *hasResult = true; *hasResultType = true; break;
-    case OpFDiv: *hasResult = true; *hasResultType = true; break;
-    case OpUMod: *hasResult = true; *hasResultType = true; break;
-    case OpSRem: *hasResult = true; *hasResultType = true; break;
-    case OpSMod: *hasResult = true; *hasResultType = true; break;
-    case OpFRem: *hasResult = true; *hasResultType = true; break;
-    case OpFMod: *hasResult = true; *hasResultType = true; break;
-    case OpVectorTimesScalar: *hasResult = true; *hasResultType = true; break;
-    case OpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break;
-    case OpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break;
-    case OpMatrixTimesVector: *hasResult = true; *hasResultType = true; break;
-    case OpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break;
-    case OpOuterProduct: *hasResult = true; *hasResultType = true; break;
-    case OpDot: *hasResult = true; *hasResultType = true; break;
-    case OpIAddCarry: *hasResult = true; *hasResultType = true; break;
-    case OpISubBorrow: *hasResult = true; *hasResultType = true; break;
-    case OpUMulExtended: *hasResult = true; *hasResultType = true; break;
-    case OpSMulExtended: *hasResult = true; *hasResultType = true; break;
-    case OpAny: *hasResult = true; *hasResultType = true; break;
-    case OpAll: *hasResult = true; *hasResultType = true; break;
-    case OpIsNan: *hasResult = true; *hasResultType = true; break;
-    case OpIsInf: *hasResult = true; *hasResultType = true; break;
-    case OpIsFinite: *hasResult = true; *hasResultType = true; break;
-    case OpIsNormal: *hasResult = true; *hasResultType = true; break;
-    case OpSignBitSet: *hasResult = true; *hasResultType = true; break;
-    case OpLessOrGreater: *hasResult = true; *hasResultType = true; break;
-    case OpOrdered: *hasResult = true; *hasResultType = true; break;
-    case OpUnordered: *hasResult = true; *hasResultType = true; break;
-    case OpLogicalEqual: *hasResult = true; *hasResultType = true; break;
-    case OpLogicalNotEqual: *hasResult = true; *hasResultType = true; break;
-    case OpLogicalOr: *hasResult = true; *hasResultType = true; break;
-    case OpLogicalAnd: *hasResult = true; *hasResultType = true; break;
-    case OpLogicalNot: *hasResult = true; *hasResultType = true; break;
-    case OpSelect: *hasResult = true; *hasResultType = true; break;
-    case OpIEqual: *hasResult = true; *hasResultType = true; break;
-    case OpINotEqual: *hasResult = true; *hasResultType = true; break;
-    case OpUGreaterThan: *hasResult = true; *hasResultType = true; break;
-    case OpSGreaterThan: *hasResult = true; *hasResultType = true; break;
-    case OpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpULessThan: *hasResult = true; *hasResultType = true; break;
-    case OpSLessThan: *hasResult = true; *hasResultType = true; break;
-    case OpULessThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpSLessThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFOrdEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFUnordEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFOrdNotEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFUnordNotEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFOrdLessThan: *hasResult = true; *hasResultType = true; break;
-    case OpFUnordLessThan: *hasResult = true; *hasResultType = true; break;
-    case OpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break;
-    case OpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break;
-    case OpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break;
-    case OpShiftRightLogical: *hasResult = true; *hasResultType = true; break;
-    case OpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break;
-    case OpShiftLeftLogical: *hasResult = true; *hasResultType = true; break;
-    case OpBitwiseOr: *hasResult = true; *hasResultType = true; break;
-    case OpBitwiseXor: *hasResult = true; *hasResultType = true; break;
-    case OpBitwiseAnd: *hasResult = true; *hasResultType = true; break;
-    case OpNot: *hasResult = true; *hasResultType = true; break;
-    case OpBitFieldInsert: *hasResult = true; *hasResultType = true; break;
-    case OpBitFieldSExtract: *hasResult = true; *hasResultType = true; break;
-    case OpBitFieldUExtract: *hasResult = true; *hasResultType = true; break;
-    case OpBitReverse: *hasResult = true; *hasResultType = true; break;
-    case OpBitCount: *hasResult = true; *hasResultType = true; break;
-    case OpDPdx: *hasResult = true; *hasResultType = true; break;
-    case OpDPdy: *hasResult = true; *hasResultType = true; break;
-    case OpFwidth: *hasResult = true; *hasResultType = true; break;
-    case OpDPdxFine: *hasResult = true; *hasResultType = true; break;
-    case OpDPdyFine: *hasResult = true; *hasResultType = true; break;
-    case OpFwidthFine: *hasResult = true; *hasResultType = true; break;
-    case OpDPdxCoarse: *hasResult = true; *hasResultType = true; break;
-    case OpDPdyCoarse: *hasResult = true; *hasResultType = true; break;
-    case OpFwidthCoarse: *hasResult = true; *hasResultType = true; break;
-    case OpEmitVertex: *hasResult = false; *hasResultType = false; break;
-    case OpEndPrimitive: *hasResult = false; *hasResultType = false; break;
-    case OpEmitStreamVertex: *hasResult = false; *hasResultType = false; break;
-    case OpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break;
-    case OpControlBarrier: *hasResult = false; *hasResultType = false; break;
-    case OpMemoryBarrier: *hasResult = false; *hasResultType = false; break;
-    case OpAtomicLoad: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicStore: *hasResult = false; *hasResultType = false; break;
-    case OpAtomicExchange: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicIIncrement: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicIDecrement: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicIAdd: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicISub: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicSMin: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicUMin: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicSMax: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicUMax: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicAnd: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicOr: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicXor: *hasResult = true; *hasResultType = true; break;
-    case OpPhi: *hasResult = true; *hasResultType = true; break;
-    case OpLoopMerge: *hasResult = false; *hasResultType = false; break;
-    case OpSelectionMerge: *hasResult = false; *hasResultType = false; break;
-    case OpLabel: *hasResult = true; *hasResultType = false; break;
-    case OpBranch: *hasResult = false; *hasResultType = false; break;
-    case OpBranchConditional: *hasResult = false; *hasResultType = false; break;
-    case OpSwitch: *hasResult = false; *hasResultType = false; break;
-    case OpKill: *hasResult = false; *hasResultType = false; break;
-    case OpReturn: *hasResult = false; *hasResultType = false; break;
-    case OpReturnValue: *hasResult = false; *hasResultType = false; break;
-    case OpUnreachable: *hasResult = false; *hasResultType = false; break;
-    case OpLifetimeStart: *hasResult = false; *hasResultType = false; break;
-    case OpLifetimeStop: *hasResult = false; *hasResultType = false; break;
-    case OpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break;
-    case OpGroupWaitEvents: *hasResult = false; *hasResultType = false; break;
-    case OpGroupAll: *hasResult = true; *hasResultType = true; break;
-    case OpGroupAny: *hasResult = true; *hasResultType = true; break;
-    case OpGroupBroadcast: *hasResult = true; *hasResultType = true; break;
-    case OpGroupIAdd: *hasResult = true; *hasResultType = true; break;
-    case OpGroupFAdd: *hasResult = true; *hasResultType = true; break;
-    case OpGroupFMin: *hasResult = true; *hasResultType = true; break;
-    case OpGroupUMin: *hasResult = true; *hasResultType = true; break;
-    case OpGroupSMin: *hasResult = true; *hasResultType = true; break;
-    case OpGroupFMax: *hasResult = true; *hasResultType = true; break;
-    case OpGroupUMax: *hasResult = true; *hasResultType = true; break;
-    case OpGroupSMax: *hasResult = true; *hasResultType = true; break;
-    case OpReadPipe: *hasResult = true; *hasResultType = true; break;
-    case OpWritePipe: *hasResult = true; *hasResultType = true; break;
-    case OpReservedReadPipe: *hasResult = true; *hasResultType = true; break;
-    case OpReservedWritePipe: *hasResult = true; *hasResultType = true; break;
-    case OpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;
-    case OpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;
-    case OpCommitReadPipe: *hasResult = false; *hasResultType = false; break;
-    case OpCommitWritePipe: *hasResult = false; *hasResultType = false; break;
-    case OpIsValidReserveId: *hasResult = true; *hasResultType = true; break;
-    case OpGetNumPipePackets: *hasResult = true; *hasResultType = true; break;
-    case OpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break;
-    case OpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;
-    case OpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;
-    case OpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break;
-    case OpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break;
-    case OpEnqueueMarker: *hasResult = true; *hasResultType = true; break;
-    case OpEnqueueKernel: *hasResult = true; *hasResultType = true; break;
-    case OpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break;
-    case OpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break;
-    case OpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break;
-    case OpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break;
-    case OpRetainEvent: *hasResult = false; *hasResultType = false; break;
-    case OpReleaseEvent: *hasResult = false; *hasResultType = false; break;
-    case OpCreateUserEvent: *hasResult = true; *hasResultType = true; break;
-    case OpIsValidEvent: *hasResult = true; *hasResultType = true; break;
-    case OpSetUserEventStatus: *hasResult = false; *hasResultType = false; break;
-    case OpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break;
-    case OpGetDefaultQueue: *hasResult = true; *hasResultType = true; break;
-    case OpBuildNDRange: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseFetch: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseGather: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break;
-    case OpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break;
-    case OpNoLine: *hasResult = false; *hasResultType = false; break;
-    case OpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicFlagClear: *hasResult = false; *hasResultType = false; break;
-    case OpImageSparseRead: *hasResult = true; *hasResultType = true; break;
-    case OpSizeOf: *hasResult = true; *hasResultType = true; break;
-    case OpTypePipeStorage: *hasResult = true; *hasResultType = false; break;
-    case OpConstantPipeStorage: *hasResult = true; *hasResultType = true; break;
-    case OpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break;
-    case OpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break;
-    case OpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break;
-    case OpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break;
-    case OpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break;
-    case OpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break;
-    case OpModuleProcessed: *hasResult = false; *hasResultType = false; break;
-    case OpExecutionModeId: *hasResult = false; *hasResultType = false; break;
-    case OpDecorateId: *hasResult = false; *hasResultType = false; break;
-    case OpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;
-    case OpCopyLogical: *hasResult = true; *hasResultType = true; break;
-    case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
-    case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
-    case OpPtrDiff: *hasResult = true; *hasResultType = true; break;
-    case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;
-    case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;
-    case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;
-    case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;
-    case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;
-    case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;
-    case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;
-    case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;
-    case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
-    case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
-    case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;
-    case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;
-    case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;
-    case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;
-    case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break;
-    case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break;
-    case OpReadClockKHR: *hasResult = true; *hasResultType = true; break;
-    case OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break;
-    case OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break;
-    case OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break;
-    case OpReportIntersectionNV: *hasResult = true; *hasResultType = true; break;
-    case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;
-    case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
-    case OpTraceNV: *hasResult = false; *hasResultType = false; break;
-    case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;
-    case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;
-    case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
-    case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
-    case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
-    case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;
-    case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break;
-    case OpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break;
-    case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;
-    case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;
-    case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;
-    case OpDemoteToHelperInvocationEXT: *hasResult = false; *hasResultType = false; break;
-    case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpUAddSatINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpIAverageINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpUAverageINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpISubSatINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
-    case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
-    case OpConstFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpAsmINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break;
-    case OpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break;
-    case OpExpectKHR: *hasResult = true; *hasResultType = true; break;
-    case OpDecorateString: *hasResult = false; *hasResultType = false; break;
-    case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;
-    case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
-    case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
-    case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;
-    case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;
-    case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;
-    case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;
-    }
-}
-#endif /* SPV_ENABLE_UTILITY_CODE */
-
-// Overload operator| for mask bit combining
-
-inline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); }
-inline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); }
-inline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); }
-inline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); }
-inline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); }
-inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); }
-inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }
-inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }
-inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }
-inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }
-
-}  // end namespace spv
-
-#endif  // #ifndef spirv_HPP
-
+// Copyright (c) 2014-2020 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"),

+// to deal in the Materials without restriction, including without limitation

+// the rights to use, copy, modify, merge, publish, distribute, sublicense,

+// and/or sell copies of the Materials, and to permit persons to whom the

+// Materials are 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 Materials.

+// 

+// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS

+// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND

+// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ 

+// 

+// THE MATERIALS ARE 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 MATERIALS OR THE USE OR OTHER DEALINGS

+// IN THE MATERIALS.

+

+// This header is automatically generated by the same tool that creates

+// the Binary Section of the SPIR-V specification.

+

+// Enumeration tokens for SPIR-V, in various styles:

+//   C, C++, C++11, JSON, Lua, Python, C#, D

+// 

+// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL

+// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL

+// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL

+// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL

+// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']

+// - C# will use enum classes in the Specification class located in the "Spv" namespace,

+//     e.g.: Spv.Specification.SourceLanguage.GLSL

+// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL

+// 

+// Some tokens act like mask values, which can be OR'd together,

+// while others are mutually exclusive.  The mask-like ones have

+// "Mask" in their name, and a parallel enum that has the shift

+// amount (1 << x) for each corresponding enumerant.

+

+#ifndef spirv_HPP

+#define spirv_HPP

+

+namespace spv {

+

+typedef unsigned int Id;

+

+#define SPV_VERSION 0x10600

+#define SPV_REVISION 1

+

+static const unsigned int MagicNumber = 0x07230203;

+static const unsigned int Version = 0x00010600;

+static const unsigned int Revision = 1;

+static const unsigned int OpCodeMask = 0xffff;

+static const unsigned int WordCountShift = 16;

+

+enum SourceLanguage {

+    SourceLanguageUnknown = 0,

+    SourceLanguageESSL = 1,

+    SourceLanguageGLSL = 2,

+    SourceLanguageOpenCL_C = 3,

+    SourceLanguageOpenCL_CPP = 4,

+    SourceLanguageHLSL = 5,

+    SourceLanguageCPP_for_OpenCL = 6,

+    SourceLanguageMax = 0x7fffffff,

+};

+

+enum ExecutionModel {

+    ExecutionModelVertex = 0,

+    ExecutionModelTessellationControl = 1,

+    ExecutionModelTessellationEvaluation = 2,

+    ExecutionModelGeometry = 3,

+    ExecutionModelFragment = 4,

+    ExecutionModelGLCompute = 5,

+    ExecutionModelKernel = 6,

+    ExecutionModelTaskNV = 5267,

+    ExecutionModelMeshNV = 5268,

+    ExecutionModelRayGenerationKHR = 5313,

+    ExecutionModelRayGenerationNV = 5313,

+    ExecutionModelIntersectionKHR = 5314,

+    ExecutionModelIntersectionNV = 5314,

+    ExecutionModelAnyHitKHR = 5315,

+    ExecutionModelAnyHitNV = 5315,

+    ExecutionModelClosestHitKHR = 5316,

+    ExecutionModelClosestHitNV = 5316,

+    ExecutionModelMissKHR = 5317,

+    ExecutionModelMissNV = 5317,

+    ExecutionModelCallableKHR = 5318,

+    ExecutionModelCallableNV = 5318,

+    ExecutionModelMax = 0x7fffffff,

+};

+

+enum AddressingModel {

+    AddressingModelLogical = 0,

+    AddressingModelPhysical32 = 1,

+    AddressingModelPhysical64 = 2,

+    AddressingModelPhysicalStorageBuffer64 = 5348,

+    AddressingModelPhysicalStorageBuffer64EXT = 5348,

+    AddressingModelMax = 0x7fffffff,

+};

+

+enum MemoryModel {

+    MemoryModelSimple = 0,

+    MemoryModelGLSL450 = 1,

+    MemoryModelOpenCL = 2,

+    MemoryModelVulkan = 3,

+    MemoryModelVulkanKHR = 3,

+    MemoryModelMax = 0x7fffffff,

+};

+

+enum ExecutionMode {

+    ExecutionModeInvocations = 0,

+    ExecutionModeSpacingEqual = 1,

+    ExecutionModeSpacingFractionalEven = 2,

+    ExecutionModeSpacingFractionalOdd = 3,

+    ExecutionModeVertexOrderCw = 4,

+    ExecutionModeVertexOrderCcw = 5,

+    ExecutionModePixelCenterInteger = 6,

+    ExecutionModeOriginUpperLeft = 7,

+    ExecutionModeOriginLowerLeft = 8,

+    ExecutionModeEarlyFragmentTests = 9,

+    ExecutionModePointMode = 10,

+    ExecutionModeXfb = 11,

+    ExecutionModeDepthReplacing = 12,

+    ExecutionModeDepthGreater = 14,

+    ExecutionModeDepthLess = 15,

+    ExecutionModeDepthUnchanged = 16,

+    ExecutionModeLocalSize = 17,

+    ExecutionModeLocalSizeHint = 18,

+    ExecutionModeInputPoints = 19,

+    ExecutionModeInputLines = 20,

+    ExecutionModeInputLinesAdjacency = 21,

+    ExecutionModeTriangles = 22,

+    ExecutionModeInputTrianglesAdjacency = 23,

+    ExecutionModeQuads = 24,

+    ExecutionModeIsolines = 25,

+    ExecutionModeOutputVertices = 26,

+    ExecutionModeOutputPoints = 27,

+    ExecutionModeOutputLineStrip = 28,

+    ExecutionModeOutputTriangleStrip = 29,

+    ExecutionModeVecTypeHint = 30,

+    ExecutionModeContractionOff = 31,

+    ExecutionModeInitializer = 33,

+    ExecutionModeFinalizer = 34,

+    ExecutionModeSubgroupSize = 35,

+    ExecutionModeSubgroupsPerWorkgroup = 36,

+    ExecutionModeSubgroupsPerWorkgroupId = 37,

+    ExecutionModeLocalSizeId = 38,

+    ExecutionModeLocalSizeHintId = 39,

+    ExecutionModeSubgroupUniformControlFlowKHR = 4421,

+    ExecutionModePostDepthCoverage = 4446,

+    ExecutionModeDenormPreserve = 4459,

+    ExecutionModeDenormFlushToZero = 4460,

+    ExecutionModeSignedZeroInfNanPreserve = 4461,

+    ExecutionModeRoundingModeRTE = 4462,

+    ExecutionModeRoundingModeRTZ = 4463,

+    ExecutionModeStencilRefReplacingEXT = 5027,

+    ExecutionModeOutputLinesNV = 5269,

+    ExecutionModeOutputPrimitivesNV = 5270,

+    ExecutionModeDerivativeGroupQuadsNV = 5289,

+    ExecutionModeDerivativeGroupLinearNV = 5290,

+    ExecutionModeOutputTrianglesNV = 5298,

+    ExecutionModePixelInterlockOrderedEXT = 5366,

+    ExecutionModePixelInterlockUnorderedEXT = 5367,

+    ExecutionModeSampleInterlockOrderedEXT = 5368,

+    ExecutionModeSampleInterlockUnorderedEXT = 5369,

+    ExecutionModeShadingRateInterlockOrderedEXT = 5370,

+    ExecutionModeShadingRateInterlockUnorderedEXT = 5371,

+    ExecutionModeSharedLocalMemorySizeINTEL = 5618,

+    ExecutionModeRoundingModeRTPINTEL = 5620,

+    ExecutionModeRoundingModeRTNINTEL = 5621,

+    ExecutionModeFloatingPointModeALTINTEL = 5622,

+    ExecutionModeFloatingPointModeIEEEINTEL = 5623,

+    ExecutionModeMaxWorkgroupSizeINTEL = 5893,

+    ExecutionModeMaxWorkDimINTEL = 5894,

+    ExecutionModeNoGlobalOffsetINTEL = 5895,

+    ExecutionModeNumSIMDWorkitemsINTEL = 5896,

+    ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,

+    ExecutionModeMax = 0x7fffffff,

+};

+

+enum StorageClass {

+    StorageClassUniformConstant = 0,

+    StorageClassInput = 1,

+    StorageClassUniform = 2,

+    StorageClassOutput = 3,

+    StorageClassWorkgroup = 4,

+    StorageClassCrossWorkgroup = 5,

+    StorageClassPrivate = 6,

+    StorageClassFunction = 7,

+    StorageClassGeneric = 8,

+    StorageClassPushConstant = 9,

+    StorageClassAtomicCounter = 10,

+    StorageClassImage = 11,

+    StorageClassStorageBuffer = 12,

+    StorageClassCallableDataKHR = 5328,

+    StorageClassCallableDataNV = 5328,

+    StorageClassIncomingCallableDataKHR = 5329,

+    StorageClassIncomingCallableDataNV = 5329,

+    StorageClassRayPayloadKHR = 5338,

+    StorageClassRayPayloadNV = 5338,

+    StorageClassHitAttributeKHR = 5339,

+    StorageClassHitAttributeNV = 5339,

+    StorageClassIncomingRayPayloadKHR = 5342,

+    StorageClassIncomingRayPayloadNV = 5342,

+    StorageClassShaderRecordBufferKHR = 5343,

+    StorageClassShaderRecordBufferNV = 5343,

+    StorageClassPhysicalStorageBuffer = 5349,

+    StorageClassPhysicalStorageBufferEXT = 5349,

+    StorageClassCodeSectionINTEL = 5605,

+    StorageClassDeviceOnlyINTEL = 5936,

+    StorageClassHostOnlyINTEL = 5937,

+    StorageClassMax = 0x7fffffff,

+};

+

+enum Dim {

+    Dim1D = 0,

+    Dim2D = 1,

+    Dim3D = 2,

+    DimCube = 3,

+    DimRect = 4,

+    DimBuffer = 5,

+    DimSubpassData = 6,

+    DimMax = 0x7fffffff,

+};

+

+enum SamplerAddressingMode {

+    SamplerAddressingModeNone = 0,

+    SamplerAddressingModeClampToEdge = 1,

+    SamplerAddressingModeClamp = 2,

+    SamplerAddressingModeRepeat = 3,

+    SamplerAddressingModeRepeatMirrored = 4,

+    SamplerAddressingModeMax = 0x7fffffff,

+};

+

+enum SamplerFilterMode {

+    SamplerFilterModeNearest = 0,

+    SamplerFilterModeLinear = 1,

+    SamplerFilterModeMax = 0x7fffffff,

+};

+

+enum ImageFormat {

+    ImageFormatUnknown = 0,

+    ImageFormatRgba32f = 1,

+    ImageFormatRgba16f = 2,

+    ImageFormatR32f = 3,

+    ImageFormatRgba8 = 4,

+    ImageFormatRgba8Snorm = 5,

+    ImageFormatRg32f = 6,

+    ImageFormatRg16f = 7,

+    ImageFormatR11fG11fB10f = 8,

+    ImageFormatR16f = 9,

+    ImageFormatRgba16 = 10,

+    ImageFormatRgb10A2 = 11,

+    ImageFormatRg16 = 12,

+    ImageFormatRg8 = 13,

+    ImageFormatR16 = 14,

+    ImageFormatR8 = 15,

+    ImageFormatRgba16Snorm = 16,

+    ImageFormatRg16Snorm = 17,

+    ImageFormatRg8Snorm = 18,

+    ImageFormatR16Snorm = 19,

+    ImageFormatR8Snorm = 20,

+    ImageFormatRgba32i = 21,

+    ImageFormatRgba16i = 22,

+    ImageFormatRgba8i = 23,

+    ImageFormatR32i = 24,

+    ImageFormatRg32i = 25,

+    ImageFormatRg16i = 26,

+    ImageFormatRg8i = 27,

+    ImageFormatR16i = 28,

+    ImageFormatR8i = 29,

+    ImageFormatRgba32ui = 30,

+    ImageFormatRgba16ui = 31,

+    ImageFormatRgba8ui = 32,

+    ImageFormatR32ui = 33,

+    ImageFormatRgb10a2ui = 34,

+    ImageFormatRg32ui = 35,

+    ImageFormatRg16ui = 36,

+    ImageFormatRg8ui = 37,

+    ImageFormatR16ui = 38,

+    ImageFormatR8ui = 39,

+    ImageFormatR64ui = 40,

+    ImageFormatR64i = 41,

+    ImageFormatMax = 0x7fffffff,

+};

+

+enum ImageChannelOrder {

+    ImageChannelOrderR = 0,

+    ImageChannelOrderA = 1,

+    ImageChannelOrderRG = 2,

+    ImageChannelOrderRA = 3,

+    ImageChannelOrderRGB = 4,

+    ImageChannelOrderRGBA = 5,

+    ImageChannelOrderBGRA = 6,

+    ImageChannelOrderARGB = 7,

+    ImageChannelOrderIntensity = 8,

+    ImageChannelOrderLuminance = 9,

+    ImageChannelOrderRx = 10,

+    ImageChannelOrderRGx = 11,

+    ImageChannelOrderRGBx = 12,

+    ImageChannelOrderDepth = 13,

+    ImageChannelOrderDepthStencil = 14,

+    ImageChannelOrdersRGB = 15,

+    ImageChannelOrdersRGBx = 16,

+    ImageChannelOrdersRGBA = 17,

+    ImageChannelOrdersBGRA = 18,

+    ImageChannelOrderABGR = 19,

+    ImageChannelOrderMax = 0x7fffffff,

+};

+

+enum ImageChannelDataType {

+    ImageChannelDataTypeSnormInt8 = 0,

+    ImageChannelDataTypeSnormInt16 = 1,

+    ImageChannelDataTypeUnormInt8 = 2,

+    ImageChannelDataTypeUnormInt16 = 3,

+    ImageChannelDataTypeUnormShort565 = 4,

+    ImageChannelDataTypeUnormShort555 = 5,

+    ImageChannelDataTypeUnormInt101010 = 6,

+    ImageChannelDataTypeSignedInt8 = 7,

+    ImageChannelDataTypeSignedInt16 = 8,

+    ImageChannelDataTypeSignedInt32 = 9,

+    ImageChannelDataTypeUnsignedInt8 = 10,

+    ImageChannelDataTypeUnsignedInt16 = 11,

+    ImageChannelDataTypeUnsignedInt32 = 12,

+    ImageChannelDataTypeHalfFloat = 13,

+    ImageChannelDataTypeFloat = 14,

+    ImageChannelDataTypeUnormInt24 = 15,

+    ImageChannelDataTypeUnormInt101010_2 = 16,

+    ImageChannelDataTypeMax = 0x7fffffff,

+};

+

+enum ImageOperandsShift {

+    ImageOperandsBiasShift = 0,

+    ImageOperandsLodShift = 1,

+    ImageOperandsGradShift = 2,

+    ImageOperandsConstOffsetShift = 3,

+    ImageOperandsOffsetShift = 4,

+    ImageOperandsConstOffsetsShift = 5,

+    ImageOperandsSampleShift = 6,

+    ImageOperandsMinLodShift = 7,

+    ImageOperandsMakeTexelAvailableShift = 8,

+    ImageOperandsMakeTexelAvailableKHRShift = 8,

+    ImageOperandsMakeTexelVisibleShift = 9,

+    ImageOperandsMakeTexelVisibleKHRShift = 9,

+    ImageOperandsNonPrivateTexelShift = 10,

+    ImageOperandsNonPrivateTexelKHRShift = 10,

+    ImageOperandsVolatileTexelShift = 11,

+    ImageOperandsVolatileTexelKHRShift = 11,

+    ImageOperandsSignExtendShift = 12,

+    ImageOperandsZeroExtendShift = 13,

+    ImageOperandsNontemporalShift = 14,

+    ImageOperandsOffsetsShift = 16,

+    ImageOperandsMax = 0x7fffffff,

+};

+

+enum ImageOperandsMask {

+    ImageOperandsMaskNone = 0,

+    ImageOperandsBiasMask = 0x00000001,

+    ImageOperandsLodMask = 0x00000002,

+    ImageOperandsGradMask = 0x00000004,

+    ImageOperandsConstOffsetMask = 0x00000008,

+    ImageOperandsOffsetMask = 0x00000010,

+    ImageOperandsConstOffsetsMask = 0x00000020,

+    ImageOperandsSampleMask = 0x00000040,

+    ImageOperandsMinLodMask = 0x00000080,

+    ImageOperandsMakeTexelAvailableMask = 0x00000100,

+    ImageOperandsMakeTexelAvailableKHRMask = 0x00000100,

+    ImageOperandsMakeTexelVisibleMask = 0x00000200,

+    ImageOperandsMakeTexelVisibleKHRMask = 0x00000200,

+    ImageOperandsNonPrivateTexelMask = 0x00000400,

+    ImageOperandsNonPrivateTexelKHRMask = 0x00000400,

+    ImageOperandsVolatileTexelMask = 0x00000800,

+    ImageOperandsVolatileTexelKHRMask = 0x00000800,

+    ImageOperandsSignExtendMask = 0x00001000,

+    ImageOperandsZeroExtendMask = 0x00002000,

+    ImageOperandsNontemporalMask = 0x00004000,

+    ImageOperandsOffsetsMask = 0x00010000,

+};

+

+enum FPFastMathModeShift {

+    FPFastMathModeNotNaNShift = 0,

+    FPFastMathModeNotInfShift = 1,

+    FPFastMathModeNSZShift = 2,

+    FPFastMathModeAllowRecipShift = 3,

+    FPFastMathModeFastShift = 4,

+    FPFastMathModeAllowContractFastINTELShift = 16,

+    FPFastMathModeAllowReassocINTELShift = 17,

+    FPFastMathModeMax = 0x7fffffff,

+};

+

+enum FPFastMathModeMask {

+    FPFastMathModeMaskNone = 0,

+    FPFastMathModeNotNaNMask = 0x00000001,

+    FPFastMathModeNotInfMask = 0x00000002,

+    FPFastMathModeNSZMask = 0x00000004,

+    FPFastMathModeAllowRecipMask = 0x00000008,

+    FPFastMathModeFastMask = 0x00000010,

+    FPFastMathModeAllowContractFastINTELMask = 0x00010000,

+    FPFastMathModeAllowReassocINTELMask = 0x00020000,

+};

+

+enum FPRoundingMode {

+    FPRoundingModeRTE = 0,

+    FPRoundingModeRTZ = 1,

+    FPRoundingModeRTP = 2,

+    FPRoundingModeRTN = 3,

+    FPRoundingModeMax = 0x7fffffff,

+};

+

+enum LinkageType {

+    LinkageTypeExport = 0,

+    LinkageTypeImport = 1,

+    LinkageTypeLinkOnceODR = 2,

+    LinkageTypeMax = 0x7fffffff,

+};

+

+enum AccessQualifier {

+    AccessQualifierReadOnly = 0,

+    AccessQualifierWriteOnly = 1,

+    AccessQualifierReadWrite = 2,

+    AccessQualifierMax = 0x7fffffff,

+};

+

+enum FunctionParameterAttribute {

+    FunctionParameterAttributeZext = 0,

+    FunctionParameterAttributeSext = 1,

+    FunctionParameterAttributeByVal = 2,

+    FunctionParameterAttributeSret = 3,

+    FunctionParameterAttributeNoAlias = 4,

+    FunctionParameterAttributeNoCapture = 5,

+    FunctionParameterAttributeNoWrite = 6,

+    FunctionParameterAttributeNoReadWrite = 7,

+    FunctionParameterAttributeMax = 0x7fffffff,

+};

+

+enum Decoration {

+    DecorationRelaxedPrecision = 0,

+    DecorationSpecId = 1,

+    DecorationBlock = 2,

+    DecorationBufferBlock = 3,

+    DecorationRowMajor = 4,

+    DecorationColMajor = 5,

+    DecorationArrayStride = 6,

+    DecorationMatrixStride = 7,

+    DecorationGLSLShared = 8,

+    DecorationGLSLPacked = 9,

+    DecorationCPacked = 10,

+    DecorationBuiltIn = 11,

+    DecorationNoPerspective = 13,

+    DecorationFlat = 14,

+    DecorationPatch = 15,

+    DecorationCentroid = 16,

+    DecorationSample = 17,

+    DecorationInvariant = 18,

+    DecorationRestrict = 19,

+    DecorationAliased = 20,

+    DecorationVolatile = 21,

+    DecorationConstant = 22,

+    DecorationCoherent = 23,

+    DecorationNonWritable = 24,

+    DecorationNonReadable = 25,

+    DecorationUniform = 26,

+    DecorationUniformId = 27,

+    DecorationSaturatedConversion = 28,

+    DecorationStream = 29,

+    DecorationLocation = 30,

+    DecorationComponent = 31,

+    DecorationIndex = 32,

+    DecorationBinding = 33,

+    DecorationDescriptorSet = 34,

+    DecorationOffset = 35,

+    DecorationXfbBuffer = 36,

+    DecorationXfbStride = 37,

+    DecorationFuncParamAttr = 38,

+    DecorationFPRoundingMode = 39,

+    DecorationFPFastMathMode = 40,

+    DecorationLinkageAttributes = 41,

+    DecorationNoContraction = 42,

+    DecorationInputAttachmentIndex = 43,

+    DecorationAlignment = 44,

+    DecorationMaxByteOffset = 45,

+    DecorationAlignmentId = 46,

+    DecorationMaxByteOffsetId = 47,

+    DecorationNoSignedWrap = 4469,

+    DecorationNoUnsignedWrap = 4470,

+    DecorationExplicitInterpAMD = 4999,

+    DecorationOverrideCoverageNV = 5248,

+    DecorationPassthroughNV = 5250,

+    DecorationViewportRelativeNV = 5252,

+    DecorationSecondaryViewportRelativeNV = 5256,

+    DecorationPerPrimitiveNV = 5271,

+    DecorationPerViewNV = 5272,

+    DecorationPerTaskNV = 5273,

+    DecorationPerVertexKHR = 5285,

+    DecorationPerVertexNV = 5285,

+    DecorationNonUniform = 5300,

+    DecorationNonUniformEXT = 5300,

+    DecorationRestrictPointer = 5355,

+    DecorationRestrictPointerEXT = 5355,

+    DecorationAliasedPointer = 5356,

+    DecorationAliasedPointerEXT = 5356,

+    DecorationBindlessSamplerNV = 5398,

+    DecorationBindlessImageNV = 5399,

+    DecorationBoundSamplerNV = 5400,

+    DecorationBoundImageNV = 5401,

+    DecorationSIMTCallINTEL = 5599,

+    DecorationReferencedIndirectlyINTEL = 5602,

+    DecorationClobberINTEL = 5607,

+    DecorationSideEffectsINTEL = 5608,

+    DecorationVectorComputeVariableINTEL = 5624,

+    DecorationFuncParamIOKindINTEL = 5625,

+    DecorationVectorComputeFunctionINTEL = 5626,

+    DecorationStackCallINTEL = 5627,

+    DecorationGlobalVariableOffsetINTEL = 5628,

+    DecorationCounterBuffer = 5634,

+    DecorationHlslCounterBufferGOOGLE = 5634,

+    DecorationHlslSemanticGOOGLE = 5635,

+    DecorationUserSemantic = 5635,

+    DecorationUserTypeGOOGLE = 5636,

+    DecorationFunctionRoundingModeINTEL = 5822,

+    DecorationFunctionDenormModeINTEL = 5823,

+    DecorationRegisterINTEL = 5825,

+    DecorationMemoryINTEL = 5826,

+    DecorationNumbanksINTEL = 5827,

+    DecorationBankwidthINTEL = 5828,

+    DecorationMaxPrivateCopiesINTEL = 5829,

+    DecorationSinglepumpINTEL = 5830,

+    DecorationDoublepumpINTEL = 5831,

+    DecorationMaxReplicatesINTEL = 5832,

+    DecorationSimpleDualPortINTEL = 5833,

+    DecorationMergeINTEL = 5834,

+    DecorationBankBitsINTEL = 5835,

+    DecorationForcePow2DepthINTEL = 5836,

+    DecorationBurstCoalesceINTEL = 5899,

+    DecorationCacheSizeINTEL = 5900,

+    DecorationDontStaticallyCoalesceINTEL = 5901,

+    DecorationPrefetchINTEL = 5902,

+    DecorationStallEnableINTEL = 5905,

+    DecorationFuseLoopsInFunctionINTEL = 5907,

+    DecorationBufferLocationINTEL = 5921,

+    DecorationIOPipeStorageINTEL = 5944,

+    DecorationFunctionFloatingPointModeINTEL = 6080,

+    DecorationSingleElementVectorINTEL = 6085,

+    DecorationVectorComputeCallableFunctionINTEL = 6087,

+    DecorationMediaBlockIOINTEL = 6140,

+    DecorationMax = 0x7fffffff,

+};

+

+enum BuiltIn {

+    BuiltInPosition = 0,

+    BuiltInPointSize = 1,

+    BuiltInClipDistance = 3,

+    BuiltInCullDistance = 4,

+    BuiltInVertexId = 5,

+    BuiltInInstanceId = 6,

+    BuiltInPrimitiveId = 7,

+    BuiltInInvocationId = 8,

+    BuiltInLayer = 9,

+    BuiltInViewportIndex = 10,

+    BuiltInTessLevelOuter = 11,

+    BuiltInTessLevelInner = 12,

+    BuiltInTessCoord = 13,

+    BuiltInPatchVertices = 14,

+    BuiltInFragCoord = 15,

+    BuiltInPointCoord = 16,

+    BuiltInFrontFacing = 17,

+    BuiltInSampleId = 18,

+    BuiltInSamplePosition = 19,

+    BuiltInSampleMask = 20,

+    BuiltInFragDepth = 22,

+    BuiltInHelperInvocation = 23,

+    BuiltInNumWorkgroups = 24,

+    BuiltInWorkgroupSize = 25,

+    BuiltInWorkgroupId = 26,

+    BuiltInLocalInvocationId = 27,

+    BuiltInGlobalInvocationId = 28,

+    BuiltInLocalInvocationIndex = 29,

+    BuiltInWorkDim = 30,

+    BuiltInGlobalSize = 31,

+    BuiltInEnqueuedWorkgroupSize = 32,

+    BuiltInGlobalOffset = 33,

+    BuiltInGlobalLinearId = 34,

+    BuiltInSubgroupSize = 36,

+    BuiltInSubgroupMaxSize = 37,

+    BuiltInNumSubgroups = 38,

+    BuiltInNumEnqueuedSubgroups = 39,

+    BuiltInSubgroupId = 40,

+    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,

+    BuiltInDrawIndex = 4426,

+    BuiltInPrimitiveShadingRateKHR = 4432,

+    BuiltInDeviceIndex = 4438,

+    BuiltInViewIndex = 4440,

+    BuiltInShadingRateKHR = 4444,

+    BuiltInBaryCoordNoPerspAMD = 4992,

+    BuiltInBaryCoordNoPerspCentroidAMD = 4993,

+    BuiltInBaryCoordNoPerspSampleAMD = 4994,

+    BuiltInBaryCoordSmoothAMD = 4995,

+    BuiltInBaryCoordSmoothCentroidAMD = 4996,

+    BuiltInBaryCoordSmoothSampleAMD = 4997,

+    BuiltInBaryCoordPullModelAMD = 4998,

+    BuiltInFragStencilRefEXT = 5014,

+    BuiltInViewportMaskNV = 5253,

+    BuiltInSecondaryPositionNV = 5257,

+    BuiltInSecondaryViewportMaskNV = 5258,

+    BuiltInPositionPerViewNV = 5261,

+    BuiltInViewportMaskPerViewNV = 5262,

+    BuiltInFullyCoveredEXT = 5264,

+    BuiltInTaskCountNV = 5274,

+    BuiltInPrimitiveCountNV = 5275,

+    BuiltInPrimitiveIndicesNV = 5276,

+    BuiltInClipDistancePerViewNV = 5277,

+    BuiltInCullDistancePerViewNV = 5278,

+    BuiltInLayerPerViewNV = 5279,

+    BuiltInMeshViewCountNV = 5280,

+    BuiltInMeshViewIndicesNV = 5281,

+    BuiltInBaryCoordKHR = 5286,

+    BuiltInBaryCoordNV = 5286,

+    BuiltInBaryCoordNoPerspKHR = 5287,

+    BuiltInBaryCoordNoPerspNV = 5287,

+    BuiltInFragSizeEXT = 5292,

+    BuiltInFragmentSizeNV = 5292,

+    BuiltInFragInvocationCountEXT = 5293,

+    BuiltInInvocationsPerPixelNV = 5293,

+    BuiltInLaunchIdKHR = 5319,

+    BuiltInLaunchIdNV = 5319,

+    BuiltInLaunchSizeKHR = 5320,

+    BuiltInLaunchSizeNV = 5320,

+    BuiltInWorldRayOriginKHR = 5321,

+    BuiltInWorldRayOriginNV = 5321,

+    BuiltInWorldRayDirectionKHR = 5322,

+    BuiltInWorldRayDirectionNV = 5322,

+    BuiltInObjectRayOriginKHR = 5323,

+    BuiltInObjectRayOriginNV = 5323,

+    BuiltInObjectRayDirectionKHR = 5324,

+    BuiltInObjectRayDirectionNV = 5324,

+    BuiltInRayTminKHR = 5325,

+    BuiltInRayTminNV = 5325,

+    BuiltInRayTmaxKHR = 5326,

+    BuiltInRayTmaxNV = 5326,

+    BuiltInInstanceCustomIndexKHR = 5327,

+    BuiltInInstanceCustomIndexNV = 5327,

+    BuiltInObjectToWorldKHR = 5330,

+    BuiltInObjectToWorldNV = 5330,

+    BuiltInWorldToObjectKHR = 5331,

+    BuiltInWorldToObjectNV = 5331,

+    BuiltInHitTNV = 5332,

+    BuiltInHitKindKHR = 5333,

+    BuiltInHitKindNV = 5333,

+    BuiltInCurrentRayTimeNV = 5334,

+    BuiltInIncomingRayFlagsKHR = 5351,

+    BuiltInIncomingRayFlagsNV = 5351,

+    BuiltInRayGeometryIndexKHR = 5352,

+    BuiltInWarpsPerSMNV = 5374,

+    BuiltInSMCountNV = 5375,

+    BuiltInWarpIDNV = 5376,

+    BuiltInSMIDNV = 5377,

+    BuiltInMax = 0x7fffffff,

+};

+

+enum SelectionControlShift {

+    SelectionControlFlattenShift = 0,

+    SelectionControlDontFlattenShift = 1,

+    SelectionControlMax = 0x7fffffff,

+};

+

+enum SelectionControlMask {

+    SelectionControlMaskNone = 0,

+    SelectionControlFlattenMask = 0x00000001,

+    SelectionControlDontFlattenMask = 0x00000002,

+};

+

+enum LoopControlShift {

+    LoopControlUnrollShift = 0,

+    LoopControlDontUnrollShift = 1,

+    LoopControlDependencyInfiniteShift = 2,

+    LoopControlDependencyLengthShift = 3,

+    LoopControlMinIterationsShift = 4,

+    LoopControlMaxIterationsShift = 5,

+    LoopControlIterationMultipleShift = 6,

+    LoopControlPeelCountShift = 7,

+    LoopControlPartialCountShift = 8,

+    LoopControlInitiationIntervalINTELShift = 16,

+    LoopControlMaxConcurrencyINTELShift = 17,

+    LoopControlDependencyArrayINTELShift = 18,

+    LoopControlPipelineEnableINTELShift = 19,

+    LoopControlLoopCoalesceINTELShift = 20,

+    LoopControlMaxInterleavingINTELShift = 21,

+    LoopControlSpeculatedIterationsINTELShift = 22,

+    LoopControlNoFusionINTELShift = 23,

+    LoopControlMax = 0x7fffffff,

+};

+

+enum LoopControlMask {

+    LoopControlMaskNone = 0,

+    LoopControlUnrollMask = 0x00000001,

+    LoopControlDontUnrollMask = 0x00000002,

+    LoopControlDependencyInfiniteMask = 0x00000004,

+    LoopControlDependencyLengthMask = 0x00000008,

+    LoopControlMinIterationsMask = 0x00000010,

+    LoopControlMaxIterationsMask = 0x00000020,

+    LoopControlIterationMultipleMask = 0x00000040,

+    LoopControlPeelCountMask = 0x00000080,

+    LoopControlPartialCountMask = 0x00000100,

+    LoopControlInitiationIntervalINTELMask = 0x00010000,

+    LoopControlMaxConcurrencyINTELMask = 0x00020000,

+    LoopControlDependencyArrayINTELMask = 0x00040000,

+    LoopControlPipelineEnableINTELMask = 0x00080000,

+    LoopControlLoopCoalesceINTELMask = 0x00100000,

+    LoopControlMaxInterleavingINTELMask = 0x00200000,

+    LoopControlSpeculatedIterationsINTELMask = 0x00400000,

+    LoopControlNoFusionINTELMask = 0x00800000,

+};

+

+enum FunctionControlShift {

+    FunctionControlInlineShift = 0,

+    FunctionControlDontInlineShift = 1,

+    FunctionControlPureShift = 2,

+    FunctionControlConstShift = 3,

+    FunctionControlOptNoneINTELShift = 16,

+    FunctionControlMax = 0x7fffffff,

+};

+

+enum FunctionControlMask {

+    FunctionControlMaskNone = 0,

+    FunctionControlInlineMask = 0x00000001,

+    FunctionControlDontInlineMask = 0x00000002,

+    FunctionControlPureMask = 0x00000004,

+    FunctionControlConstMask = 0x00000008,

+    FunctionControlOptNoneINTELMask = 0x00010000,

+};

+

+enum MemorySemanticsShift {

+    MemorySemanticsAcquireShift = 1,

+    MemorySemanticsReleaseShift = 2,

+    MemorySemanticsAcquireReleaseShift = 3,

+    MemorySemanticsSequentiallyConsistentShift = 4,

+    MemorySemanticsUniformMemoryShift = 6,

+    MemorySemanticsSubgroupMemoryShift = 7,

+    MemorySemanticsWorkgroupMemoryShift = 8,

+    MemorySemanticsCrossWorkgroupMemoryShift = 9,

+    MemorySemanticsAtomicCounterMemoryShift = 10,

+    MemorySemanticsImageMemoryShift = 11,

+    MemorySemanticsOutputMemoryShift = 12,

+    MemorySemanticsOutputMemoryKHRShift = 12,

+    MemorySemanticsMakeAvailableShift = 13,

+    MemorySemanticsMakeAvailableKHRShift = 13,

+    MemorySemanticsMakeVisibleShift = 14,

+    MemorySemanticsMakeVisibleKHRShift = 14,

+    MemorySemanticsVolatileShift = 15,

+    MemorySemanticsMax = 0x7fffffff,

+};

+

+enum MemorySemanticsMask {

+    MemorySemanticsMaskNone = 0,

+    MemorySemanticsAcquireMask = 0x00000002,

+    MemorySemanticsReleaseMask = 0x00000004,

+    MemorySemanticsAcquireReleaseMask = 0x00000008,

+    MemorySemanticsSequentiallyConsistentMask = 0x00000010,

+    MemorySemanticsUniformMemoryMask = 0x00000040,

+    MemorySemanticsSubgroupMemoryMask = 0x00000080,

+    MemorySemanticsWorkgroupMemoryMask = 0x00000100,

+    MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,

+    MemorySemanticsAtomicCounterMemoryMask = 0x00000400,

+    MemorySemanticsImageMemoryMask = 0x00000800,

+    MemorySemanticsOutputMemoryMask = 0x00001000,

+    MemorySemanticsOutputMemoryKHRMask = 0x00001000,

+    MemorySemanticsMakeAvailableMask = 0x00002000,

+    MemorySemanticsMakeAvailableKHRMask = 0x00002000,

+    MemorySemanticsMakeVisibleMask = 0x00004000,

+    MemorySemanticsMakeVisibleKHRMask = 0x00004000,

+    MemorySemanticsVolatileMask = 0x00008000,

+};

+

+enum MemoryAccessShift {

+    MemoryAccessVolatileShift = 0,

+    MemoryAccessAlignedShift = 1,

+    MemoryAccessNontemporalShift = 2,

+    MemoryAccessMakePointerAvailableShift = 3,

+    MemoryAccessMakePointerAvailableKHRShift = 3,

+    MemoryAccessMakePointerVisibleShift = 4,

+    MemoryAccessMakePointerVisibleKHRShift = 4,

+    MemoryAccessNonPrivatePointerShift = 5,

+    MemoryAccessNonPrivatePointerKHRShift = 5,

+    MemoryAccessMax = 0x7fffffff,

+};

+

+enum MemoryAccessMask {

+    MemoryAccessMaskNone = 0,

+    MemoryAccessVolatileMask = 0x00000001,

+    MemoryAccessAlignedMask = 0x00000002,

+    MemoryAccessNontemporalMask = 0x00000004,

+    MemoryAccessMakePointerAvailableMask = 0x00000008,

+    MemoryAccessMakePointerAvailableKHRMask = 0x00000008,

+    MemoryAccessMakePointerVisibleMask = 0x00000010,

+    MemoryAccessMakePointerVisibleKHRMask = 0x00000010,

+    MemoryAccessNonPrivatePointerMask = 0x00000020,

+    MemoryAccessNonPrivatePointerKHRMask = 0x00000020,

+};

+

+enum Scope {

+    ScopeCrossDevice = 0,

+    ScopeDevice = 1,

+    ScopeWorkgroup = 2,

+    ScopeSubgroup = 3,

+    ScopeInvocation = 4,

+    ScopeQueueFamily = 5,

+    ScopeQueueFamilyKHR = 5,

+    ScopeShaderCallKHR = 6,

+    ScopeMax = 0x7fffffff,

+};

+

+enum GroupOperation {

+    GroupOperationReduce = 0,

+    GroupOperationInclusiveScan = 1,

+    GroupOperationExclusiveScan = 2,

+    GroupOperationClusteredReduce = 3,

+    GroupOperationPartitionedReduceNV = 6,

+    GroupOperationPartitionedInclusiveScanNV = 7,

+    GroupOperationPartitionedExclusiveScanNV = 8,

+    GroupOperationMax = 0x7fffffff,

+};

+

+enum KernelEnqueueFlags {

+    KernelEnqueueFlagsNoWait = 0,

+    KernelEnqueueFlagsWaitKernel = 1,

+    KernelEnqueueFlagsWaitWorkGroup = 2,

+    KernelEnqueueFlagsMax = 0x7fffffff,

+};

+

+enum KernelProfilingInfoShift {

+    KernelProfilingInfoCmdExecTimeShift = 0,

+    KernelProfilingInfoMax = 0x7fffffff,

+};

+

+enum KernelProfilingInfoMask {

+    KernelProfilingInfoMaskNone = 0,

+    KernelProfilingInfoCmdExecTimeMask = 0x00000001,

+};

+

+enum Capability {

+    CapabilityMatrix = 0,

+    CapabilityShader = 1,

+    CapabilityGeometry = 2,

+    CapabilityTessellation = 3,

+    CapabilityAddresses = 4,

+    CapabilityLinkage = 5,

+    CapabilityKernel = 6,

+    CapabilityVector16 = 7,

+    CapabilityFloat16Buffer = 8,

+    CapabilityFloat16 = 9,

+    CapabilityFloat64 = 10,

+    CapabilityInt64 = 11,

+    CapabilityInt64Atomics = 12,

+    CapabilityImageBasic = 13,

+    CapabilityImageReadWrite = 14,

+    CapabilityImageMipmap = 15,

+    CapabilityPipes = 17,

+    CapabilityGroups = 18,

+    CapabilityDeviceEnqueue = 19,

+    CapabilityLiteralSampler = 20,

+    CapabilityAtomicStorage = 21,

+    CapabilityInt16 = 22,

+    CapabilityTessellationPointSize = 23,

+    CapabilityGeometryPointSize = 24,

+    CapabilityImageGatherExtended = 25,

+    CapabilityStorageImageMultisample = 27,

+    CapabilityUniformBufferArrayDynamicIndexing = 28,

+    CapabilitySampledImageArrayDynamicIndexing = 29,

+    CapabilityStorageBufferArrayDynamicIndexing = 30,

+    CapabilityStorageImageArrayDynamicIndexing = 31,

+    CapabilityClipDistance = 32,

+    CapabilityCullDistance = 33,

+    CapabilityImageCubeArray = 34,

+    CapabilitySampleRateShading = 35,

+    CapabilityImageRect = 36,

+    CapabilitySampledRect = 37,

+    CapabilityGenericPointer = 38,

+    CapabilityInt8 = 39,

+    CapabilityInputAttachment = 40,

+    CapabilitySparseResidency = 41,

+    CapabilityMinLod = 42,

+    CapabilitySampled1D = 43,

+    CapabilityImage1D = 44,

+    CapabilitySampledCubeArray = 45,

+    CapabilitySampledBuffer = 46,

+    CapabilityImageBuffer = 47,

+    CapabilityImageMSArray = 48,

+    CapabilityStorageImageExtendedFormats = 49,

+    CapabilityImageQuery = 50,

+    CapabilityDerivativeControl = 51,

+    CapabilityInterpolationFunction = 52,

+    CapabilityTransformFeedback = 53,

+    CapabilityGeometryStreams = 54,

+    CapabilityStorageImageReadWithoutFormat = 55,

+    CapabilityStorageImageWriteWithoutFormat = 56,

+    CapabilityMultiViewport = 57,

+    CapabilitySubgroupDispatch = 58,

+    CapabilityNamedBarrier = 59,

+    CapabilityPipeStorage = 60,

+    CapabilityGroupNonUniform = 61,

+    CapabilityGroupNonUniformVote = 62,

+    CapabilityGroupNonUniformArithmetic = 63,

+    CapabilityGroupNonUniformBallot = 64,

+    CapabilityGroupNonUniformShuffle = 65,

+    CapabilityGroupNonUniformShuffleRelative = 66,

+    CapabilityGroupNonUniformClustered = 67,

+    CapabilityGroupNonUniformQuad = 68,

+    CapabilityShaderLayer = 69,

+    CapabilityShaderViewportIndex = 70,

+    CapabilityUniformDecoration = 71,

+    CapabilityFragmentShadingRateKHR = 4422,

+    CapabilitySubgroupBallotKHR = 4423,

+    CapabilityDrawParameters = 4427,

+    CapabilityWorkgroupMemoryExplicitLayoutKHR = 4428,

+    CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,

+    CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,

+    CapabilitySubgroupVoteKHR = 4431,

+    CapabilityStorageBuffer16BitAccess = 4433,

+    CapabilityStorageUniformBufferBlock16 = 4433,

+    CapabilityStorageUniform16 = 4434,

+    CapabilityUniformAndStorageBuffer16BitAccess = 4434,

+    CapabilityStoragePushConstant16 = 4435,

+    CapabilityStorageInputOutput16 = 4436,

+    CapabilityDeviceGroup = 4437,

+    CapabilityMultiView = 4439,

+    CapabilityVariablePointersStorageBuffer = 4441,

+    CapabilityVariablePointers = 4442,

+    CapabilityAtomicStorageOps = 4445,

+    CapabilitySampleMaskPostDepthCoverage = 4447,

+    CapabilityStorageBuffer8BitAccess = 4448,

+    CapabilityUniformAndStorageBuffer8BitAccess = 4449,

+    CapabilityStoragePushConstant8 = 4450,

+    CapabilityDenormPreserve = 4464,

+    CapabilityDenormFlushToZero = 4465,

+    CapabilitySignedZeroInfNanPreserve = 4466,

+    CapabilityRoundingModeRTE = 4467,

+    CapabilityRoundingModeRTZ = 4468,

+    CapabilityRayQueryProvisionalKHR = 4471,

+    CapabilityRayQueryKHR = 4472,

+    CapabilityRayTraversalPrimitiveCullingKHR = 4478,

+    CapabilityRayTracingKHR = 4479,

+    CapabilityFloat16ImageAMD = 5008,

+    CapabilityImageGatherBiasLodAMD = 5009,

+    CapabilityFragmentMaskAMD = 5010,

+    CapabilityStencilExportEXT = 5013,

+    CapabilityImageReadWriteLodAMD = 5015,

+    CapabilityInt64ImageEXT = 5016,

+    CapabilityShaderClockKHR = 5055,

+    CapabilitySampleMaskOverrideCoverageNV = 5249,

+    CapabilityGeometryShaderPassthroughNV = 5251,

+    CapabilityShaderViewportIndexLayerEXT = 5254,

+    CapabilityShaderViewportIndexLayerNV = 5254,

+    CapabilityShaderViewportMaskNV = 5255,

+    CapabilityShaderStereoViewNV = 5259,

+    CapabilityPerViewAttributesNV = 5260,

+    CapabilityFragmentFullyCoveredEXT = 5265,

+    CapabilityMeshShadingNV = 5266,

+    CapabilityImageFootprintNV = 5282,

+    CapabilityFragmentBarycentricKHR = 5284,

+    CapabilityFragmentBarycentricNV = 5284,

+    CapabilityComputeDerivativeGroupQuadsNV = 5288,

+    CapabilityFragmentDensityEXT = 5291,

+    CapabilityShadingRateNV = 5291,

+    CapabilityGroupNonUniformPartitionedNV = 5297,

+    CapabilityShaderNonUniform = 5301,

+    CapabilityShaderNonUniformEXT = 5301,

+    CapabilityRuntimeDescriptorArray = 5302,

+    CapabilityRuntimeDescriptorArrayEXT = 5302,

+    CapabilityInputAttachmentArrayDynamicIndexing = 5303,

+    CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303,

+    CapabilityUniformTexelBufferArrayDynamicIndexing = 5304,

+    CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304,

+    CapabilityStorageTexelBufferArrayDynamicIndexing = 5305,

+    CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305,

+    CapabilityUniformBufferArrayNonUniformIndexing = 5306,

+    CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306,

+    CapabilitySampledImageArrayNonUniformIndexing = 5307,

+    CapabilitySampledImageArrayNonUniformIndexingEXT = 5307,

+    CapabilityStorageBufferArrayNonUniformIndexing = 5308,

+    CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308,

+    CapabilityStorageImageArrayNonUniformIndexing = 5309,

+    CapabilityStorageImageArrayNonUniformIndexingEXT = 5309,

+    CapabilityInputAttachmentArrayNonUniformIndexing = 5310,

+    CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,

+    CapabilityUniformTexelBufferArrayNonUniformIndexing = 5311,

+    CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,

+    CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,

+    CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,

+    CapabilityRayTracingNV = 5340,

+    CapabilityRayTracingMotionBlurNV = 5341,

+    CapabilityVulkanMemoryModel = 5345,

+    CapabilityVulkanMemoryModelKHR = 5345,

+    CapabilityVulkanMemoryModelDeviceScope = 5346,

+    CapabilityVulkanMemoryModelDeviceScopeKHR = 5346,

+    CapabilityPhysicalStorageBufferAddresses = 5347,

+    CapabilityPhysicalStorageBufferAddressesEXT = 5347,

+    CapabilityComputeDerivativeGroupLinearNV = 5350,

+    CapabilityRayTracingProvisionalKHR = 5353,

+    CapabilityCooperativeMatrixNV = 5357,

+    CapabilityFragmentShaderSampleInterlockEXT = 5363,

+    CapabilityFragmentShaderShadingRateInterlockEXT = 5372,

+    CapabilityShaderSMBuiltinsNV = 5373,

+    CapabilityFragmentShaderPixelInterlockEXT = 5378,

+    CapabilityDemoteToHelperInvocation = 5379,

+    CapabilityDemoteToHelperInvocationEXT = 5379,

+    CapabilityBindlessTextureNV = 5390,

+    CapabilitySubgroupShuffleINTEL = 5568,

+    CapabilitySubgroupBufferBlockIOINTEL = 5569,

+    CapabilitySubgroupImageBlockIOINTEL = 5570,

+    CapabilitySubgroupImageMediaBlockIOINTEL = 5579,

+    CapabilityRoundToInfinityINTEL = 5582,

+    CapabilityFloatingPointModeINTEL = 5583,

+    CapabilityIntegerFunctions2INTEL = 5584,

+    CapabilityFunctionPointersINTEL = 5603,

+    CapabilityIndirectReferencesINTEL = 5604,

+    CapabilityAsmINTEL = 5606,

+    CapabilityAtomicFloat32MinMaxEXT = 5612,

+    CapabilityAtomicFloat64MinMaxEXT = 5613,

+    CapabilityAtomicFloat16MinMaxEXT = 5616,

+    CapabilityVectorComputeINTEL = 5617,

+    CapabilityVectorAnyINTEL = 5619,

+    CapabilityExpectAssumeKHR = 5629,

+    CapabilitySubgroupAvcMotionEstimationINTEL = 5696,

+    CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,

+    CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,

+    CapabilityVariableLengthArrayINTEL = 5817,

+    CapabilityFunctionFloatControlINTEL = 5821,

+    CapabilityFPGAMemoryAttributesINTEL = 5824,

+    CapabilityFPFastMathModeINTEL = 5837,

+    CapabilityArbitraryPrecisionIntegersINTEL = 5844,

+    CapabilityArbitraryPrecisionFloatingPointINTEL = 5845,

+    CapabilityUnstructuredLoopControlsINTEL = 5886,

+    CapabilityFPGALoopControlsINTEL = 5888,

+    CapabilityKernelAttributesINTEL = 5892,

+    CapabilityFPGAKernelAttributesINTEL = 5897,

+    CapabilityFPGAMemoryAccessesINTEL = 5898,

+    CapabilityFPGAClusterAttributesINTEL = 5904,

+    CapabilityLoopFuseINTEL = 5906,

+    CapabilityFPGABufferLocationINTEL = 5920,

+    CapabilityArbitraryPrecisionFixedPointINTEL = 5922,

+    CapabilityUSMStorageClassesINTEL = 5935,

+    CapabilityIOPipesINTEL = 5943,

+    CapabilityBlockingPipesINTEL = 5945,

+    CapabilityFPGARegINTEL = 5948,

+    CapabilityDotProductInputAll = 6016,

+    CapabilityDotProductInputAllKHR = 6016,

+    CapabilityDotProductInput4x8Bit = 6017,

+    CapabilityDotProductInput4x8BitKHR = 6017,

+    CapabilityDotProductInput4x8BitPacked = 6018,

+    CapabilityDotProductInput4x8BitPackedKHR = 6018,

+    CapabilityDotProduct = 6019,

+    CapabilityDotProductKHR = 6019,

+    CapabilityBitInstructions = 6025,

+    CapabilityAtomicFloat32AddEXT = 6033,

+    CapabilityAtomicFloat64AddEXT = 6034,

+    CapabilityLongConstantCompositeINTEL = 6089,

+    CapabilityOptNoneINTEL = 6094,

+    CapabilityAtomicFloat16AddEXT = 6095,

+    CapabilityDebugInfoModuleINTEL = 6114,

+    CapabilityMax = 0x7fffffff,

+};

+

+enum RayFlagsShift {

+    RayFlagsOpaqueKHRShift = 0,

+    RayFlagsNoOpaqueKHRShift = 1,

+    RayFlagsTerminateOnFirstHitKHRShift = 2,

+    RayFlagsSkipClosestHitShaderKHRShift = 3,

+    RayFlagsCullBackFacingTrianglesKHRShift = 4,

+    RayFlagsCullFrontFacingTrianglesKHRShift = 5,

+    RayFlagsCullOpaqueKHRShift = 6,

+    RayFlagsCullNoOpaqueKHRShift = 7,

+    RayFlagsSkipTrianglesKHRShift = 8,

+    RayFlagsSkipAABBsKHRShift = 9,

+    RayFlagsMax = 0x7fffffff,

+};

+

+enum RayFlagsMask {

+    RayFlagsMaskNone = 0,

+    RayFlagsOpaqueKHRMask = 0x00000001,

+    RayFlagsNoOpaqueKHRMask = 0x00000002,

+    RayFlagsTerminateOnFirstHitKHRMask = 0x00000004,

+    RayFlagsSkipClosestHitShaderKHRMask = 0x00000008,

+    RayFlagsCullBackFacingTrianglesKHRMask = 0x00000010,

+    RayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020,

+    RayFlagsCullOpaqueKHRMask = 0x00000040,

+    RayFlagsCullNoOpaqueKHRMask = 0x00000080,

+    RayFlagsSkipTrianglesKHRMask = 0x00000100,

+    RayFlagsSkipAABBsKHRMask = 0x00000200,

+};

+

+enum RayQueryIntersection {

+    RayQueryIntersectionRayQueryCandidateIntersectionKHR = 0,

+    RayQueryIntersectionRayQueryCommittedIntersectionKHR = 1,

+    RayQueryIntersectionMax = 0x7fffffff,

+};

+

+enum RayQueryCommittedIntersectionType {

+    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0,

+    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR = 1,

+    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR = 2,

+    RayQueryCommittedIntersectionTypeMax = 0x7fffffff,

+};

+

+enum RayQueryCandidateIntersectionType {

+    RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR = 0,

+    RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1,

+    RayQueryCandidateIntersectionTypeMax = 0x7fffffff,

+};

+

+enum FragmentShadingRateShift {

+    FragmentShadingRateVertical2PixelsShift = 0,

+    FragmentShadingRateVertical4PixelsShift = 1,

+    FragmentShadingRateHorizontal2PixelsShift = 2,

+    FragmentShadingRateHorizontal4PixelsShift = 3,

+    FragmentShadingRateMax = 0x7fffffff,

+};

+

+enum FragmentShadingRateMask {

+    FragmentShadingRateMaskNone = 0,

+    FragmentShadingRateVertical2PixelsMask = 0x00000001,

+    FragmentShadingRateVertical4PixelsMask = 0x00000002,

+    FragmentShadingRateHorizontal2PixelsMask = 0x00000004,

+    FragmentShadingRateHorizontal4PixelsMask = 0x00000008,

+};

+

+enum FPDenormMode {

+    FPDenormModePreserve = 0,

+    FPDenormModeFlushToZero = 1,

+    FPDenormModeMax = 0x7fffffff,

+};

+

+enum FPOperationMode {

+    FPOperationModeIEEE = 0,

+    FPOperationModeALT = 1,

+    FPOperationModeMax = 0x7fffffff,

+};

+

+enum QuantizationModes {

+    QuantizationModesTRN = 0,

+    QuantizationModesTRN_ZERO = 1,

+    QuantizationModesRND = 2,

+    QuantizationModesRND_ZERO = 3,

+    QuantizationModesRND_INF = 4,

+    QuantizationModesRND_MIN_INF = 5,

+    QuantizationModesRND_CONV = 6,

+    QuantizationModesRND_CONV_ODD = 7,

+    QuantizationModesMax = 0x7fffffff,

+};

+

+enum OverflowModes {

+    OverflowModesWRAP = 0,

+    OverflowModesSAT = 1,

+    OverflowModesSAT_ZERO = 2,

+    OverflowModesSAT_SYM = 3,

+    OverflowModesMax = 0x7fffffff,

+};

+

+enum PackedVectorFormat {

+    PackedVectorFormatPackedVectorFormat4x8Bit = 0,

+    PackedVectorFormatPackedVectorFormat4x8BitKHR = 0,

+    PackedVectorFormatMax = 0x7fffffff,

+};

+

+enum Op {

+    OpNop = 0,

+    OpUndef = 1,

+    OpSourceContinued = 2,

+    OpSource = 3,

+    OpSourceExtension = 4,

+    OpName = 5,

+    OpMemberName = 6,

+    OpString = 7,

+    OpLine = 8,

+    OpExtension = 10,

+    OpExtInstImport = 11,

+    OpExtInst = 12,

+    OpMemoryModel = 14,

+    OpEntryPoint = 15,

+    OpExecutionMode = 16,

+    OpCapability = 17,

+    OpTypeVoid = 19,

+    OpTypeBool = 20,

+    OpTypeInt = 21,

+    OpTypeFloat = 22,

+    OpTypeVector = 23,

+    OpTypeMatrix = 24,

+    OpTypeImage = 25,

+    OpTypeSampler = 26,

+    OpTypeSampledImage = 27,

+    OpTypeArray = 28,

+    OpTypeRuntimeArray = 29,

+    OpTypeStruct = 30,

+    OpTypeOpaque = 31,

+    OpTypePointer = 32,

+    OpTypeFunction = 33,

+    OpTypeEvent = 34,

+    OpTypeDeviceEvent = 35,

+    OpTypeReserveId = 36,

+    OpTypeQueue = 37,

+    OpTypePipe = 38,

+    OpTypeForwardPointer = 39,

+    OpConstantTrue = 41,

+    OpConstantFalse = 42,

+    OpConstant = 43,

+    OpConstantComposite = 44,

+    OpConstantSampler = 45,

+    OpConstantNull = 46,

+    OpSpecConstantTrue = 48,

+    OpSpecConstantFalse = 49,

+    OpSpecConstant = 50,

+    OpSpecConstantComposite = 51,

+    OpSpecConstantOp = 52,

+    OpFunction = 54,

+    OpFunctionParameter = 55,

+    OpFunctionEnd = 56,

+    OpFunctionCall = 57,

+    OpVariable = 59,

+    OpImageTexelPointer = 60,

+    OpLoad = 61,

+    OpStore = 62,

+    OpCopyMemory = 63,

+    OpCopyMemorySized = 64,

+    OpAccessChain = 65,

+    OpInBoundsAccessChain = 66,

+    OpPtrAccessChain = 67,

+    OpArrayLength = 68,

+    OpGenericPtrMemSemantics = 69,

+    OpInBoundsPtrAccessChain = 70,

+    OpDecorate = 71,

+    OpMemberDecorate = 72,

+    OpDecorationGroup = 73,

+    OpGroupDecorate = 74,

+    OpGroupMemberDecorate = 75,

+    OpVectorExtractDynamic = 77,

+    OpVectorInsertDynamic = 78,

+    OpVectorShuffle = 79,

+    OpCompositeConstruct = 80,

+    OpCompositeExtract = 81,

+    OpCompositeInsert = 82,

+    OpCopyObject = 83,

+    OpTranspose = 84,

+    OpSampledImage = 86,

+    OpImageSampleImplicitLod = 87,

+    OpImageSampleExplicitLod = 88,

+    OpImageSampleDrefImplicitLod = 89,

+    OpImageSampleDrefExplicitLod = 90,

+    OpImageSampleProjImplicitLod = 91,

+    OpImageSampleProjExplicitLod = 92,

+    OpImageSampleProjDrefImplicitLod = 93,

+    OpImageSampleProjDrefExplicitLod = 94,

+    OpImageFetch = 95,

+    OpImageGather = 96,

+    OpImageDrefGather = 97,

+    OpImageRead = 98,

+    OpImageWrite = 99,

+    OpImage = 100,

+    OpImageQueryFormat = 101,

+    OpImageQueryOrder = 102,

+    OpImageQuerySizeLod = 103,

+    OpImageQuerySize = 104,

+    OpImageQueryLod = 105,

+    OpImageQueryLevels = 106,

+    OpImageQuerySamples = 107,

+    OpConvertFToU = 109,

+    OpConvertFToS = 110,

+    OpConvertSToF = 111,

+    OpConvertUToF = 112,

+    OpUConvert = 113,

+    OpSConvert = 114,

+    OpFConvert = 115,

+    OpQuantizeToF16 = 116,

+    OpConvertPtrToU = 117,

+    OpSatConvertSToU = 118,

+    OpSatConvertUToS = 119,

+    OpConvertUToPtr = 120,

+    OpPtrCastToGeneric = 121,

+    OpGenericCastToPtr = 122,

+    OpGenericCastToPtrExplicit = 123,

+    OpBitcast = 124,

+    OpSNegate = 126,

+    OpFNegate = 127,

+    OpIAdd = 128,

+    OpFAdd = 129,

+    OpISub = 130,

+    OpFSub = 131,

+    OpIMul = 132,

+    OpFMul = 133,

+    OpUDiv = 134,

+    OpSDiv = 135,

+    OpFDiv = 136,

+    OpUMod = 137,

+    OpSRem = 138,

+    OpSMod = 139,

+    OpFRem = 140,

+    OpFMod = 141,

+    OpVectorTimesScalar = 142,

+    OpMatrixTimesScalar = 143,

+    OpVectorTimesMatrix = 144,

+    OpMatrixTimesVector = 145,

+    OpMatrixTimesMatrix = 146,

+    OpOuterProduct = 147,

+    OpDot = 148,

+    OpIAddCarry = 149,

+    OpISubBorrow = 150,

+    OpUMulExtended = 151,

+    OpSMulExtended = 152,

+    OpAny = 154,

+    OpAll = 155,

+    OpIsNan = 156,

+    OpIsInf = 157,

+    OpIsFinite = 158,

+    OpIsNormal = 159,

+    OpSignBitSet = 160,

+    OpLessOrGreater = 161,

+    OpOrdered = 162,

+    OpUnordered = 163,

+    OpLogicalEqual = 164,

+    OpLogicalNotEqual = 165,

+    OpLogicalOr = 166,

+    OpLogicalAnd = 167,

+    OpLogicalNot = 168,

+    OpSelect = 169,

+    OpIEqual = 170,

+    OpINotEqual = 171,

+    OpUGreaterThan = 172,

+    OpSGreaterThan = 173,

+    OpUGreaterThanEqual = 174,

+    OpSGreaterThanEqual = 175,

+    OpULessThan = 176,

+    OpSLessThan = 177,

+    OpULessThanEqual = 178,

+    OpSLessThanEqual = 179,

+    OpFOrdEqual = 180,

+    OpFUnordEqual = 181,

+    OpFOrdNotEqual = 182,

+    OpFUnordNotEqual = 183,

+    OpFOrdLessThan = 184,

+    OpFUnordLessThan = 185,

+    OpFOrdGreaterThan = 186,

+    OpFUnordGreaterThan = 187,

+    OpFOrdLessThanEqual = 188,

+    OpFUnordLessThanEqual = 189,

+    OpFOrdGreaterThanEqual = 190,

+    OpFUnordGreaterThanEqual = 191,

+    OpShiftRightLogical = 194,

+    OpShiftRightArithmetic = 195,

+    OpShiftLeftLogical = 196,

+    OpBitwiseOr = 197,

+    OpBitwiseXor = 198,

+    OpBitwiseAnd = 199,

+    OpNot = 200,

+    OpBitFieldInsert = 201,

+    OpBitFieldSExtract = 202,

+    OpBitFieldUExtract = 203,

+    OpBitReverse = 204,

+    OpBitCount = 205,

+    OpDPdx = 207,

+    OpDPdy = 208,

+    OpFwidth = 209,

+    OpDPdxFine = 210,

+    OpDPdyFine = 211,

+    OpFwidthFine = 212,

+    OpDPdxCoarse = 213,

+    OpDPdyCoarse = 214,

+    OpFwidthCoarse = 215,

+    OpEmitVertex = 218,

+    OpEndPrimitive = 219,

+    OpEmitStreamVertex = 220,

+    OpEndStreamPrimitive = 221,

+    OpControlBarrier = 224,

+    OpMemoryBarrier = 225,

+    OpAtomicLoad = 227,

+    OpAtomicStore = 228,

+    OpAtomicExchange = 229,

+    OpAtomicCompareExchange = 230,

+    OpAtomicCompareExchangeWeak = 231,

+    OpAtomicIIncrement = 232,

+    OpAtomicIDecrement = 233,

+    OpAtomicIAdd = 234,

+    OpAtomicISub = 235,

+    OpAtomicSMin = 236,

+    OpAtomicUMin = 237,

+    OpAtomicSMax = 238,

+    OpAtomicUMax = 239,

+    OpAtomicAnd = 240,

+    OpAtomicOr = 241,

+    OpAtomicXor = 242,

+    OpPhi = 245,

+    OpLoopMerge = 246,

+    OpSelectionMerge = 247,

+    OpLabel = 248,

+    OpBranch = 249,

+    OpBranchConditional = 250,

+    OpSwitch = 251,

+    OpKill = 252,

+    OpReturn = 253,

+    OpReturnValue = 254,

+    OpUnreachable = 255,

+    OpLifetimeStart = 256,

+    OpLifetimeStop = 257,

+    OpGroupAsyncCopy = 259,

+    OpGroupWaitEvents = 260,

+    OpGroupAll = 261,

+    OpGroupAny = 262,

+    OpGroupBroadcast = 263,

+    OpGroupIAdd = 264,

+    OpGroupFAdd = 265,

+    OpGroupFMin = 266,

+    OpGroupUMin = 267,

+    OpGroupSMin = 268,

+    OpGroupFMax = 269,

+    OpGroupUMax = 270,

+    OpGroupSMax = 271,

+    OpReadPipe = 274,

+    OpWritePipe = 275,

+    OpReservedReadPipe = 276,

+    OpReservedWritePipe = 277,

+    OpReserveReadPipePackets = 278,

+    OpReserveWritePipePackets = 279,

+    OpCommitReadPipe = 280,

+    OpCommitWritePipe = 281,

+    OpIsValidReserveId = 282,

+    OpGetNumPipePackets = 283,

+    OpGetMaxPipePackets = 284,

+    OpGroupReserveReadPipePackets = 285,

+    OpGroupReserveWritePipePackets = 286,

+    OpGroupCommitReadPipe = 287,

+    OpGroupCommitWritePipe = 288,

+    OpEnqueueMarker = 291,

+    OpEnqueueKernel = 292,

+    OpGetKernelNDrangeSubGroupCount = 293,

+    OpGetKernelNDrangeMaxSubGroupSize = 294,

+    OpGetKernelWorkGroupSize = 295,

+    OpGetKernelPreferredWorkGroupSizeMultiple = 296,

+    OpRetainEvent = 297,

+    OpReleaseEvent = 298,

+    OpCreateUserEvent = 299,

+    OpIsValidEvent = 300,

+    OpSetUserEventStatus = 301,

+    OpCaptureEventProfilingInfo = 302,

+    OpGetDefaultQueue = 303,

+    OpBuildNDRange = 304,

+    OpImageSparseSampleImplicitLod = 305,

+    OpImageSparseSampleExplicitLod = 306,

+    OpImageSparseSampleDrefImplicitLod = 307,

+    OpImageSparseSampleDrefExplicitLod = 308,

+    OpImageSparseSampleProjImplicitLod = 309,

+    OpImageSparseSampleProjExplicitLod = 310,

+    OpImageSparseSampleProjDrefImplicitLod = 311,

+    OpImageSparseSampleProjDrefExplicitLod = 312,

+    OpImageSparseFetch = 313,

+    OpImageSparseGather = 314,

+    OpImageSparseDrefGather = 315,

+    OpImageSparseTexelsResident = 316,

+    OpNoLine = 317,

+    OpAtomicFlagTestAndSet = 318,

+    OpAtomicFlagClear = 319,

+    OpImageSparseRead = 320,

+    OpSizeOf = 321,

+    OpTypePipeStorage = 322,

+    OpConstantPipeStorage = 323,

+    OpCreatePipeFromPipeStorage = 324,

+    OpGetKernelLocalSizeForSubgroupCount = 325,

+    OpGetKernelMaxNumSubgroups = 326,

+    OpTypeNamedBarrier = 327,

+    OpNamedBarrierInitialize = 328,

+    OpMemoryNamedBarrier = 329,

+    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,

+    OpCopyLogical = 400,

+    OpPtrEqual = 401,

+    OpPtrNotEqual = 402,

+    OpPtrDiff = 403,

+    OpTerminateInvocation = 4416,

+    OpSubgroupBallotKHR = 4421,

+    OpSubgroupFirstInvocationKHR = 4422,

+    OpSubgroupAllKHR = 4428,

+    OpSubgroupAnyKHR = 4429,

+    OpSubgroupAllEqualKHR = 4430,

+    OpSubgroupReadInvocationKHR = 4432,

+    OpTraceRayKHR = 4445,

+    OpExecuteCallableKHR = 4446,

+    OpConvertUToAccelerationStructureKHR = 4447,

+    OpIgnoreIntersectionKHR = 4448,

+    OpTerminateRayKHR = 4449,

+    OpSDot = 4450,

+    OpSDotKHR = 4450,

+    OpUDot = 4451,

+    OpUDotKHR = 4451,

+    OpSUDot = 4452,

+    OpSUDotKHR = 4452,

+    OpSDotAccSat = 4453,

+    OpSDotAccSatKHR = 4453,

+    OpUDotAccSat = 4454,

+    OpUDotAccSatKHR = 4454,

+    OpSUDotAccSat = 4455,

+    OpSUDotAccSatKHR = 4455,

+    OpTypeRayQueryKHR = 4472,

+    OpRayQueryInitializeKHR = 4473,

+    OpRayQueryTerminateKHR = 4474,

+    OpRayQueryGenerateIntersectionKHR = 4475,

+    OpRayQueryConfirmIntersectionKHR = 4476,

+    OpRayQueryProceedKHR = 4477,

+    OpRayQueryGetIntersectionTypeKHR = 4479,

+    OpGroupIAddNonUniformAMD = 5000,

+    OpGroupFAddNonUniformAMD = 5001,

+    OpGroupFMinNonUniformAMD = 5002,

+    OpGroupUMinNonUniformAMD = 5003,

+    OpGroupSMinNonUniformAMD = 5004,

+    OpGroupFMaxNonUniformAMD = 5005,

+    OpGroupUMaxNonUniformAMD = 5006,

+    OpGroupSMaxNonUniformAMD = 5007,

+    OpFragmentMaskFetchAMD = 5011,

+    OpFragmentFetchAMD = 5012,

+    OpReadClockKHR = 5056,

+    OpImageSampleFootprintNV = 5283,

+    OpGroupNonUniformPartitionNV = 5296,

+    OpWritePackedPrimitiveIndices4x8NV = 5299,

+    OpReportIntersectionKHR = 5334,

+    OpReportIntersectionNV = 5334,

+    OpIgnoreIntersectionNV = 5335,

+    OpTerminateRayNV = 5336,

+    OpTraceNV = 5337,

+    OpTraceMotionNV = 5338,

+    OpTraceRayMotionNV = 5339,

+    OpTypeAccelerationStructureKHR = 5341,

+    OpTypeAccelerationStructureNV = 5341,

+    OpExecuteCallableNV = 5344,

+    OpTypeCooperativeMatrixNV = 5358,

+    OpCooperativeMatrixLoadNV = 5359,

+    OpCooperativeMatrixStoreNV = 5360,

+    OpCooperativeMatrixMulAddNV = 5361,

+    OpCooperativeMatrixLengthNV = 5362,

+    OpBeginInvocationInterlockEXT = 5364,

+    OpEndInvocationInterlockEXT = 5365,

+    OpDemoteToHelperInvocation = 5380,

+    OpDemoteToHelperInvocationEXT = 5380,

+    OpIsHelperInvocationEXT = 5381,

+    OpConvertUToImageNV = 5391,

+    OpConvertUToSamplerNV = 5392,

+    OpConvertImageToUNV = 5393,

+    OpConvertSamplerToUNV = 5394,

+    OpConvertUToSampledImageNV = 5395,

+    OpConvertSampledImageToUNV = 5396,

+    OpSamplerImageAddressingModeNV = 5397,

+    OpSubgroupShuffleINTEL = 5571,

+    OpSubgroupShuffleDownINTEL = 5572,

+    OpSubgroupShuffleUpINTEL = 5573,

+    OpSubgroupShuffleXorINTEL = 5574,

+    OpSubgroupBlockReadINTEL = 5575,

+    OpSubgroupBlockWriteINTEL = 5576,

+    OpSubgroupImageBlockReadINTEL = 5577,

+    OpSubgroupImageBlockWriteINTEL = 5578,

+    OpSubgroupImageMediaBlockReadINTEL = 5580,

+    OpSubgroupImageMediaBlockWriteINTEL = 5581,

+    OpUCountLeadingZerosINTEL = 5585,

+    OpUCountTrailingZerosINTEL = 5586,

+    OpAbsISubINTEL = 5587,

+    OpAbsUSubINTEL = 5588,

+    OpIAddSatINTEL = 5589,

+    OpUAddSatINTEL = 5590,

+    OpIAverageINTEL = 5591,

+    OpUAverageINTEL = 5592,

+    OpIAverageRoundedINTEL = 5593,

+    OpUAverageRoundedINTEL = 5594,

+    OpISubSatINTEL = 5595,

+    OpUSubSatINTEL = 5596,

+    OpIMul32x16INTEL = 5597,

+    OpUMul32x16INTEL = 5598,

+    OpConstantFunctionPointerINTEL = 5600,

+    OpFunctionPointerCallINTEL = 5601,

+    OpAsmTargetINTEL = 5609,

+    OpAsmINTEL = 5610,

+    OpAsmCallINTEL = 5611,

+    OpAtomicFMinEXT = 5614,

+    OpAtomicFMaxEXT = 5615,

+    OpAssumeTrueKHR = 5630,

+    OpExpectKHR = 5631,

+    OpDecorateString = 5632,

+    OpDecorateStringGOOGLE = 5632,

+    OpMemberDecorateString = 5633,

+    OpMemberDecorateStringGOOGLE = 5633,

+    OpVmeImageINTEL = 5699,

+    OpTypeVmeImageINTEL = 5700,

+    OpTypeAvcImePayloadINTEL = 5701,

+    OpTypeAvcRefPayloadINTEL = 5702,

+    OpTypeAvcSicPayloadINTEL = 5703,

+    OpTypeAvcMcePayloadINTEL = 5704,

+    OpTypeAvcMceResultINTEL = 5705,

+    OpTypeAvcImeResultINTEL = 5706,

+    OpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707,

+    OpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708,

+    OpTypeAvcImeSingleReferenceStreaminINTEL = 5709,

+    OpTypeAvcImeDualReferenceStreaminINTEL = 5710,

+    OpTypeAvcRefResultINTEL = 5711,

+    OpTypeAvcSicResultINTEL = 5712,

+    OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713,

+    OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714,

+    OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715,

+    OpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716,

+    OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717,

+    OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718,

+    OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719,

+    OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720,

+    OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721,

+    OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722,

+    OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723,

+    OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724,

+    OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725,

+    OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726,

+    OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727,

+    OpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728,

+    OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729,

+    OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730,

+    OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731,

+    OpSubgroupAvcMceConvertToImePayloadINTEL = 5732,

+    OpSubgroupAvcMceConvertToImeResultINTEL = 5733,

+    OpSubgroupAvcMceConvertToRefPayloadINTEL = 5734,

+    OpSubgroupAvcMceConvertToRefResultINTEL = 5735,

+    OpSubgroupAvcMceConvertToSicPayloadINTEL = 5736,

+    OpSubgroupAvcMceConvertToSicResultINTEL = 5737,

+    OpSubgroupAvcMceGetMotionVectorsINTEL = 5738,

+    OpSubgroupAvcMceGetInterDistortionsINTEL = 5739,

+    OpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740,

+    OpSubgroupAvcMceGetInterMajorShapeINTEL = 5741,

+    OpSubgroupAvcMceGetInterMinorShapeINTEL = 5742,

+    OpSubgroupAvcMceGetInterDirectionsINTEL = 5743,

+    OpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744,

+    OpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745,

+    OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746,

+    OpSubgroupAvcImeInitializeINTEL = 5747,

+    OpSubgroupAvcImeSetSingleReferenceINTEL = 5748,

+    OpSubgroupAvcImeSetDualReferenceINTEL = 5749,

+    OpSubgroupAvcImeRefWindowSizeINTEL = 5750,

+    OpSubgroupAvcImeAdjustRefOffsetINTEL = 5751,

+    OpSubgroupAvcImeConvertToMcePayloadINTEL = 5752,

+    OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753,

+    OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754,

+    OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755,

+    OpSubgroupAvcImeSetWeightedSadINTEL = 5756,

+    OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757,

+    OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758,

+    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759,

+    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760,

+    OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761,

+    OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762,

+    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763,

+    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764,

+    OpSubgroupAvcImeConvertToMceResultINTEL = 5765,

+    OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766,

+    OpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767,

+    OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768,

+    OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769,

+    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770,

+    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771,

+    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772,

+    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773,

+    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774,

+    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775,

+    OpSubgroupAvcImeGetBorderReachedINTEL = 5776,

+    OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777,

+    OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778,

+    OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779,

+    OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780,

+    OpSubgroupAvcFmeInitializeINTEL = 5781,

+    OpSubgroupAvcBmeInitializeINTEL = 5782,

+    OpSubgroupAvcRefConvertToMcePayloadINTEL = 5783,

+    OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784,

+    OpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785,

+    OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786,

+    OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787,

+    OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788,

+    OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789,

+    OpSubgroupAvcRefConvertToMceResultINTEL = 5790,

+    OpSubgroupAvcSicInitializeINTEL = 5791,

+    OpSubgroupAvcSicConfigureSkcINTEL = 5792,

+    OpSubgroupAvcSicConfigureIpeLumaINTEL = 5793,

+    OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794,

+    OpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795,

+    OpSubgroupAvcSicConvertToMcePayloadINTEL = 5796,

+    OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797,

+    OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798,

+    OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799,

+    OpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800,

+    OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801,

+    OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802,

+    OpSubgroupAvcSicEvaluateIpeINTEL = 5803,

+    OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804,

+    OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805,

+    OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806,

+    OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807,

+    OpSubgroupAvcSicConvertToMceResultINTEL = 5808,

+    OpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809,

+    OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810,

+    OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811,

+    OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812,

+    OpSubgroupAvcSicGetIpeChromaModeINTEL = 5813,

+    OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,

+    OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,

+    OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,

+    OpVariableLengthArrayINTEL = 5818,

+    OpSaveMemoryINTEL = 5819,

+    OpRestoreMemoryINTEL = 5820,

+    OpArbitraryFloatSinCosPiINTEL = 5840,

+    OpArbitraryFloatCastINTEL = 5841,

+    OpArbitraryFloatCastFromIntINTEL = 5842,

+    OpArbitraryFloatCastToIntINTEL = 5843,

+    OpArbitraryFloatAddINTEL = 5846,

+    OpArbitraryFloatSubINTEL = 5847,

+    OpArbitraryFloatMulINTEL = 5848,

+    OpArbitraryFloatDivINTEL = 5849,

+    OpArbitraryFloatGTINTEL = 5850,

+    OpArbitraryFloatGEINTEL = 5851,

+    OpArbitraryFloatLTINTEL = 5852,

+    OpArbitraryFloatLEINTEL = 5853,

+    OpArbitraryFloatEQINTEL = 5854,

+    OpArbitraryFloatRecipINTEL = 5855,

+    OpArbitraryFloatRSqrtINTEL = 5856,

+    OpArbitraryFloatCbrtINTEL = 5857,

+    OpArbitraryFloatHypotINTEL = 5858,

+    OpArbitraryFloatSqrtINTEL = 5859,

+    OpArbitraryFloatLogINTEL = 5860,

+    OpArbitraryFloatLog2INTEL = 5861,

+    OpArbitraryFloatLog10INTEL = 5862,

+    OpArbitraryFloatLog1pINTEL = 5863,

+    OpArbitraryFloatExpINTEL = 5864,

+    OpArbitraryFloatExp2INTEL = 5865,

+    OpArbitraryFloatExp10INTEL = 5866,

+    OpArbitraryFloatExpm1INTEL = 5867,

+    OpArbitraryFloatSinINTEL = 5868,

+    OpArbitraryFloatCosINTEL = 5869,

+    OpArbitraryFloatSinCosINTEL = 5870,

+    OpArbitraryFloatSinPiINTEL = 5871,

+    OpArbitraryFloatCosPiINTEL = 5872,

+    OpArbitraryFloatASinINTEL = 5873,

+    OpArbitraryFloatASinPiINTEL = 5874,

+    OpArbitraryFloatACosINTEL = 5875,

+    OpArbitraryFloatACosPiINTEL = 5876,

+    OpArbitraryFloatATanINTEL = 5877,

+    OpArbitraryFloatATanPiINTEL = 5878,

+    OpArbitraryFloatATan2INTEL = 5879,

+    OpArbitraryFloatPowINTEL = 5880,

+    OpArbitraryFloatPowRINTEL = 5881,

+    OpArbitraryFloatPowNINTEL = 5882,

+    OpLoopControlINTEL = 5887,

+    OpFixedSqrtINTEL = 5923,

+    OpFixedRecipINTEL = 5924,

+    OpFixedRsqrtINTEL = 5925,

+    OpFixedSinINTEL = 5926,

+    OpFixedCosINTEL = 5927,

+    OpFixedSinCosINTEL = 5928,

+    OpFixedSinPiINTEL = 5929,

+    OpFixedCosPiINTEL = 5930,

+    OpFixedSinCosPiINTEL = 5931,

+    OpFixedLogINTEL = 5932,

+    OpFixedExpINTEL = 5933,

+    OpPtrCastToCrossWorkgroupINTEL = 5934,

+    OpCrossWorkgroupCastToPtrINTEL = 5938,

+    OpReadPipeBlockingINTEL = 5946,

+    OpWritePipeBlockingINTEL = 5947,

+    OpFPGARegINTEL = 5949,

+    OpRayQueryGetRayTMinKHR = 6016,

+    OpRayQueryGetRayFlagsKHR = 6017,

+    OpRayQueryGetIntersectionTKHR = 6018,

+    OpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019,

+    OpRayQueryGetIntersectionInstanceIdKHR = 6020,

+    OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021,

+    OpRayQueryGetIntersectionGeometryIndexKHR = 6022,

+    OpRayQueryGetIntersectionPrimitiveIndexKHR = 6023,

+    OpRayQueryGetIntersectionBarycentricsKHR = 6024,

+    OpRayQueryGetIntersectionFrontFaceKHR = 6025,

+    OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026,

+    OpRayQueryGetIntersectionObjectRayDirectionKHR = 6027,

+    OpRayQueryGetIntersectionObjectRayOriginKHR = 6028,

+    OpRayQueryGetWorldRayDirectionKHR = 6029,

+    OpRayQueryGetWorldRayOriginKHR = 6030,

+    OpRayQueryGetIntersectionObjectToWorldKHR = 6031,

+    OpRayQueryGetIntersectionWorldToObjectKHR = 6032,

+    OpAtomicFAddEXT = 6035,

+    OpTypeBufferSurfaceINTEL = 6086,

+    OpTypeStructContinuedINTEL = 6090,

+    OpConstantCompositeContinuedINTEL = 6091,

+    OpSpecConstantCompositeContinuedINTEL = 6092,

+    OpMax = 0x7fffffff,

+};

+

+#ifdef SPV_ENABLE_UTILITY_CODE

+inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {

+    *hasResult = *hasResultType = false;

+    switch (opcode) {

+    default: /* unknown opcode */ break;

+    case OpNop: *hasResult = false; *hasResultType = false; break;

+    case OpUndef: *hasResult = true; *hasResultType = true; break;

+    case OpSourceContinued: *hasResult = false; *hasResultType = false; break;

+    case OpSource: *hasResult = false; *hasResultType = false; break;

+    case OpSourceExtension: *hasResult = false; *hasResultType = false; break;

+    case OpName: *hasResult = false; *hasResultType = false; break;

+    case OpMemberName: *hasResult = false; *hasResultType = false; break;

+    case OpString: *hasResult = true; *hasResultType = false; break;

+    case OpLine: *hasResult = false; *hasResultType = false; break;

+    case OpExtension: *hasResult = false; *hasResultType = false; break;

+    case OpExtInstImport: *hasResult = true; *hasResultType = false; break;

+    case OpExtInst: *hasResult = true; *hasResultType = true; break;

+    case OpMemoryModel: *hasResult = false; *hasResultType = false; break;

+    case OpEntryPoint: *hasResult = false; *hasResultType = false; break;

+    case OpExecutionMode: *hasResult = false; *hasResultType = false; break;

+    case OpCapability: *hasResult = false; *hasResultType = false; break;

+    case OpTypeVoid: *hasResult = true; *hasResultType = false; break;

+    case OpTypeBool: *hasResult = true; *hasResultType = false; break;

+    case OpTypeInt: *hasResult = true; *hasResultType = false; break;

+    case OpTypeFloat: *hasResult = true; *hasResultType = false; break;

+    case OpTypeVector: *hasResult = true; *hasResultType = false; break;

+    case OpTypeMatrix: *hasResult = true; *hasResultType = false; break;

+    case OpTypeImage: *hasResult = true; *hasResultType = false; break;

+    case OpTypeSampler: *hasResult = true; *hasResultType = false; break;

+    case OpTypeSampledImage: *hasResult = true; *hasResultType = false; break;

+    case OpTypeArray: *hasResult = true; *hasResultType = false; break;

+    case OpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break;

+    case OpTypeStruct: *hasResult = true; *hasResultType = false; break;

+    case OpTypeOpaque: *hasResult = true; *hasResultType = false; break;

+    case OpTypePointer: *hasResult = true; *hasResultType = false; break;

+    case OpTypeFunction: *hasResult = true; *hasResultType = false; break;

+    case OpTypeEvent: *hasResult = true; *hasResultType = false; break;

+    case OpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break;

+    case OpTypeReserveId: *hasResult = true; *hasResultType = false; break;

+    case OpTypeQueue: *hasResult = true; *hasResultType = false; break;

+    case OpTypePipe: *hasResult = true; *hasResultType = false; break;

+    case OpTypeForwardPointer: *hasResult = false; *hasResultType = false; break;

+    case OpConstantTrue: *hasResult = true; *hasResultType = true; break;

+    case OpConstantFalse: *hasResult = true; *hasResultType = true; break;

+    case OpConstant: *hasResult = true; *hasResultType = true; break;

+    case OpConstantComposite: *hasResult = true; *hasResultType = true; break;

+    case OpConstantSampler: *hasResult = true; *hasResultType = true; break;

+    case OpConstantNull: *hasResult = true; *hasResultType = true; break;

+    case OpSpecConstantTrue: *hasResult = true; *hasResultType = true; break;

+    case OpSpecConstantFalse: *hasResult = true; *hasResultType = true; break;

+    case OpSpecConstant: *hasResult = true; *hasResultType = true; break;

+    case OpSpecConstantComposite: *hasResult = true; *hasResultType = true; break;

+    case OpSpecConstantOp: *hasResult = true; *hasResultType = true; break;

+    case OpFunction: *hasResult = true; *hasResultType = true; break;

+    case OpFunctionParameter: *hasResult = true; *hasResultType = true; break;

+    case OpFunctionEnd: *hasResult = false; *hasResultType = false; break;

+    case OpFunctionCall: *hasResult = true; *hasResultType = true; break;

+    case OpVariable: *hasResult = true; *hasResultType = true; break;

+    case OpImageTexelPointer: *hasResult = true; *hasResultType = true; break;

+    case OpLoad: *hasResult = true; *hasResultType = true; break;

+    case OpStore: *hasResult = false; *hasResultType = false; break;

+    case OpCopyMemory: *hasResult = false; *hasResultType = false; break;

+    case OpCopyMemorySized: *hasResult = false; *hasResultType = false; break;

+    case OpAccessChain: *hasResult = true; *hasResultType = true; break;

+    case OpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break;

+    case OpPtrAccessChain: *hasResult = true; *hasResultType = true; break;

+    case OpArrayLength: *hasResult = true; *hasResultType = true; break;

+    case OpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break;

+    case OpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break;

+    case OpDecorate: *hasResult = false; *hasResultType = false; break;

+    case OpMemberDecorate: *hasResult = false; *hasResultType = false; break;

+    case OpDecorationGroup: *hasResult = true; *hasResultType = false; break;

+    case OpGroupDecorate: *hasResult = false; *hasResultType = false; break;

+    case OpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break;

+    case OpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break;

+    case OpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break;

+    case OpVectorShuffle: *hasResult = true; *hasResultType = true; break;

+    case OpCompositeConstruct: *hasResult = true; *hasResultType = true; break;

+    case OpCompositeExtract: *hasResult = true; *hasResultType = true; break;

+    case OpCompositeInsert: *hasResult = true; *hasResultType = true; break;

+    case OpCopyObject: *hasResult = true; *hasResultType = true; break;

+    case OpTranspose: *hasResult = true; *hasResultType = true; break;

+    case OpSampledImage: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageFetch: *hasResult = true; *hasResultType = true; break;

+    case OpImageGather: *hasResult = true; *hasResultType = true; break;

+    case OpImageDrefGather: *hasResult = true; *hasResultType = true; break;

+    case OpImageRead: *hasResult = true; *hasResultType = true; break;

+    case OpImageWrite: *hasResult = false; *hasResultType = false; break;

+    case OpImage: *hasResult = true; *hasResultType = true; break;

+    case OpImageQueryFormat: *hasResult = true; *hasResultType = true; break;

+    case OpImageQueryOrder: *hasResult = true; *hasResultType = true; break;

+    case OpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageQuerySize: *hasResult = true; *hasResultType = true; break;

+    case OpImageQueryLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageQueryLevels: *hasResult = true; *hasResultType = true; break;

+    case OpImageQuerySamples: *hasResult = true; *hasResultType = true; break;

+    case OpConvertFToU: *hasResult = true; *hasResultType = true; break;

+    case OpConvertFToS: *hasResult = true; *hasResultType = true; break;

+    case OpConvertSToF: *hasResult = true; *hasResultType = true; break;

+    case OpConvertUToF: *hasResult = true; *hasResultType = true; break;

+    case OpUConvert: *hasResult = true; *hasResultType = true; break;

+    case OpSConvert: *hasResult = true; *hasResultType = true; break;

+    case OpFConvert: *hasResult = true; *hasResultType = true; break;

+    case OpQuantizeToF16: *hasResult = true; *hasResultType = true; break;

+    case OpConvertPtrToU: *hasResult = true; *hasResultType = true; break;

+    case OpSatConvertSToU: *hasResult = true; *hasResultType = true; break;

+    case OpSatConvertUToS: *hasResult = true; *hasResultType = true; break;

+    case OpConvertUToPtr: *hasResult = true; *hasResultType = true; break;

+    case OpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break;

+    case OpGenericCastToPtr: *hasResult = true; *hasResultType = true; break;

+    case OpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break;

+    case OpBitcast: *hasResult = true; *hasResultType = true; break;

+    case OpSNegate: *hasResult = true; *hasResultType = true; break;

+    case OpFNegate: *hasResult = true; *hasResultType = true; break;

+    case OpIAdd: *hasResult = true; *hasResultType = true; break;

+    case OpFAdd: *hasResult = true; *hasResultType = true; break;

+    case OpISub: *hasResult = true; *hasResultType = true; break;

+    case OpFSub: *hasResult = true; *hasResultType = true; break;

+    case OpIMul: *hasResult = true; *hasResultType = true; break;

+    case OpFMul: *hasResult = true; *hasResultType = true; break;

+    case OpUDiv: *hasResult = true; *hasResultType = true; break;

+    case OpSDiv: *hasResult = true; *hasResultType = true; break;

+    case OpFDiv: *hasResult = true; *hasResultType = true; break;

+    case OpUMod: *hasResult = true; *hasResultType = true; break;

+    case OpSRem: *hasResult = true; *hasResultType = true; break;

+    case OpSMod: *hasResult = true; *hasResultType = true; break;

+    case OpFRem: *hasResult = true; *hasResultType = true; break;

+    case OpFMod: *hasResult = true; *hasResultType = true; break;

+    case OpVectorTimesScalar: *hasResult = true; *hasResultType = true; break;

+    case OpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break;

+    case OpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break;

+    case OpMatrixTimesVector: *hasResult = true; *hasResultType = true; break;

+    case OpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break;

+    case OpOuterProduct: *hasResult = true; *hasResultType = true; break;

+    case OpDot: *hasResult = true; *hasResultType = true; break;

+    case OpIAddCarry: *hasResult = true; *hasResultType = true; break;

+    case OpISubBorrow: *hasResult = true; *hasResultType = true; break;

+    case OpUMulExtended: *hasResult = true; *hasResultType = true; break;

+    case OpSMulExtended: *hasResult = true; *hasResultType = true; break;

+    case OpAny: *hasResult = true; *hasResultType = true; break;

+    case OpAll: *hasResult = true; *hasResultType = true; break;

+    case OpIsNan: *hasResult = true; *hasResultType = true; break;

+    case OpIsInf: *hasResult = true; *hasResultType = true; break;

+    case OpIsFinite: *hasResult = true; *hasResultType = true; break;

+    case OpIsNormal: *hasResult = true; *hasResultType = true; break;

+    case OpSignBitSet: *hasResult = true; *hasResultType = true; break;

+    case OpLessOrGreater: *hasResult = true; *hasResultType = true; break;

+    case OpOrdered: *hasResult = true; *hasResultType = true; break;

+    case OpUnordered: *hasResult = true; *hasResultType = true; break;

+    case OpLogicalEqual: *hasResult = true; *hasResultType = true; break;

+    case OpLogicalNotEqual: *hasResult = true; *hasResultType = true; break;

+    case OpLogicalOr: *hasResult = true; *hasResultType = true; break;

+    case OpLogicalAnd: *hasResult = true; *hasResultType = true; break;

+    case OpLogicalNot: *hasResult = true; *hasResultType = true; break;

+    case OpSelect: *hasResult = true; *hasResultType = true; break;

+    case OpIEqual: *hasResult = true; *hasResultType = true; break;

+    case OpINotEqual: *hasResult = true; *hasResultType = true; break;

+    case OpUGreaterThan: *hasResult = true; *hasResultType = true; break;

+    case OpSGreaterThan: *hasResult = true; *hasResultType = true; break;

+    case OpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpULessThan: *hasResult = true; *hasResultType = true; break;

+    case OpSLessThan: *hasResult = true; *hasResultType = true; break;

+    case OpULessThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpSLessThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFOrdEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFUnordEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFOrdNotEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFUnordNotEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFOrdLessThan: *hasResult = true; *hasResultType = true; break;

+    case OpFUnordLessThan: *hasResult = true; *hasResultType = true; break;

+    case OpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break;

+    case OpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break;

+    case OpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break;

+    case OpShiftRightLogical: *hasResult = true; *hasResultType = true; break;

+    case OpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break;

+    case OpShiftLeftLogical: *hasResult = true; *hasResultType = true; break;

+    case OpBitwiseOr: *hasResult = true; *hasResultType = true; break;

+    case OpBitwiseXor: *hasResult = true; *hasResultType = true; break;

+    case OpBitwiseAnd: *hasResult = true; *hasResultType = true; break;

+    case OpNot: *hasResult = true; *hasResultType = true; break;

+    case OpBitFieldInsert: *hasResult = true; *hasResultType = true; break;

+    case OpBitFieldSExtract: *hasResult = true; *hasResultType = true; break;

+    case OpBitFieldUExtract: *hasResult = true; *hasResultType = true; break;

+    case OpBitReverse: *hasResult = true; *hasResultType = true; break;

+    case OpBitCount: *hasResult = true; *hasResultType = true; break;

+    case OpDPdx: *hasResult = true; *hasResultType = true; break;

+    case OpDPdy: *hasResult = true; *hasResultType = true; break;

+    case OpFwidth: *hasResult = true; *hasResultType = true; break;

+    case OpDPdxFine: *hasResult = true; *hasResultType = true; break;

+    case OpDPdyFine: *hasResult = true; *hasResultType = true; break;

+    case OpFwidthFine: *hasResult = true; *hasResultType = true; break;

+    case OpDPdxCoarse: *hasResult = true; *hasResultType = true; break;

+    case OpDPdyCoarse: *hasResult = true; *hasResultType = true; break;

+    case OpFwidthCoarse: *hasResult = true; *hasResultType = true; break;

+    case OpEmitVertex: *hasResult = false; *hasResultType = false; break;

+    case OpEndPrimitive: *hasResult = false; *hasResultType = false; break;

+    case OpEmitStreamVertex: *hasResult = false; *hasResultType = false; break;

+    case OpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break;

+    case OpControlBarrier: *hasResult = false; *hasResultType = false; break;

+    case OpMemoryBarrier: *hasResult = false; *hasResultType = false; break;

+    case OpAtomicLoad: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicStore: *hasResult = false; *hasResultType = false; break;

+    case OpAtomicExchange: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicIIncrement: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicIDecrement: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicIAdd: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicISub: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicSMin: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicUMin: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicSMax: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicUMax: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicAnd: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicOr: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicXor: *hasResult = true; *hasResultType = true; break;

+    case OpPhi: *hasResult = true; *hasResultType = true; break;

+    case OpLoopMerge: *hasResult = false; *hasResultType = false; break;

+    case OpSelectionMerge: *hasResult = false; *hasResultType = false; break;

+    case OpLabel: *hasResult = true; *hasResultType = false; break;

+    case OpBranch: *hasResult = false; *hasResultType = false; break;

+    case OpBranchConditional: *hasResult = false; *hasResultType = false; break;

+    case OpSwitch: *hasResult = false; *hasResultType = false; break;

+    case OpKill: *hasResult = false; *hasResultType = false; break;

+    case OpReturn: *hasResult = false; *hasResultType = false; break;

+    case OpReturnValue: *hasResult = false; *hasResultType = false; break;

+    case OpUnreachable: *hasResult = false; *hasResultType = false; break;

+    case OpLifetimeStart: *hasResult = false; *hasResultType = false; break;

+    case OpLifetimeStop: *hasResult = false; *hasResultType = false; break;

+    case OpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break;

+    case OpGroupWaitEvents: *hasResult = false; *hasResultType = false; break;

+    case OpGroupAll: *hasResult = true; *hasResultType = true; break;

+    case OpGroupAny: *hasResult = true; *hasResultType = true; break;

+    case OpGroupBroadcast: *hasResult = true; *hasResultType = true; break;

+    case OpGroupIAdd: *hasResult = true; *hasResultType = true; break;

+    case OpGroupFAdd: *hasResult = true; *hasResultType = true; break;

+    case OpGroupFMin: *hasResult = true; *hasResultType = true; break;

+    case OpGroupUMin: *hasResult = true; *hasResultType = true; break;

+    case OpGroupSMin: *hasResult = true; *hasResultType = true; break;

+    case OpGroupFMax: *hasResult = true; *hasResultType = true; break;

+    case OpGroupUMax: *hasResult = true; *hasResultType = true; break;

+    case OpGroupSMax: *hasResult = true; *hasResultType = true; break;

+    case OpReadPipe: *hasResult = true; *hasResultType = true; break;

+    case OpWritePipe: *hasResult = true; *hasResultType = true; break;

+    case OpReservedReadPipe: *hasResult = true; *hasResultType = true; break;

+    case OpReservedWritePipe: *hasResult = true; *hasResultType = true; break;

+    case OpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;

+    case OpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;

+    case OpCommitReadPipe: *hasResult = false; *hasResultType = false; break;

+    case OpCommitWritePipe: *hasResult = false; *hasResultType = false; break;

+    case OpIsValidReserveId: *hasResult = true; *hasResultType = true; break;

+    case OpGetNumPipePackets: *hasResult = true; *hasResultType = true; break;

+    case OpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break;

+    case OpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;

+    case OpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;

+    case OpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break;

+    case OpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break;

+    case OpEnqueueMarker: *hasResult = true; *hasResultType = true; break;

+    case OpEnqueueKernel: *hasResult = true; *hasResultType = true; break;

+    case OpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break;

+    case OpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break;

+    case OpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break;

+    case OpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break;

+    case OpRetainEvent: *hasResult = false; *hasResultType = false; break;

+    case OpReleaseEvent: *hasResult = false; *hasResultType = false; break;

+    case OpCreateUserEvent: *hasResult = true; *hasResultType = true; break;

+    case OpIsValidEvent: *hasResult = true; *hasResultType = true; break;

+    case OpSetUserEventStatus: *hasResult = false; *hasResultType = false; break;

+    case OpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break;

+    case OpGetDefaultQueue: *hasResult = true; *hasResultType = true; break;

+    case OpBuildNDRange: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseFetch: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseGather: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break;

+    case OpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break;

+    case OpNoLine: *hasResult = false; *hasResultType = false; break;

+    case OpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicFlagClear: *hasResult = false; *hasResultType = false; break;

+    case OpImageSparseRead: *hasResult = true; *hasResultType = true; break;

+    case OpSizeOf: *hasResult = true; *hasResultType = true; break;

+    case OpTypePipeStorage: *hasResult = true; *hasResultType = false; break;

+    case OpConstantPipeStorage: *hasResult = true; *hasResultType = true; break;

+    case OpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break;

+    case OpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break;

+    case OpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break;

+    case OpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break;

+    case OpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break;

+    case OpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break;

+    case OpModuleProcessed: *hasResult = false; *hasResultType = false; break;

+    case OpExecutionModeId: *hasResult = false; *hasResultType = false; break;

+    case OpDecorateId: *hasResult = false; *hasResultType = false; break;

+    case OpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;

+    case OpCopyLogical: *hasResult = true; *hasResultType = true; break;

+    case OpPtrEqual: *hasResult = true; *hasResultType = true; break;

+    case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;

+    case OpPtrDiff: *hasResult = true; *hasResultType = true; break;

+    case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;

+    case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;

+    case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;

+    case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;

+    case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;

+    case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;

+    case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;

+    case OpSDot: *hasResult = true; *hasResultType = true; break;

+    case OpUDot: *hasResult = true; *hasResultType = true; break;

+    case OpSUDot: *hasResult = true; *hasResultType = true; break;

+    case OpSDotAccSat: *hasResult = true; *hasResultType = true; break;

+    case OpUDotAccSat: *hasResult = true; *hasResultType = true; break;

+    case OpSUDotAccSat: *hasResult = true; *hasResultType = true; break;

+    case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;

+    case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;

+    case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;

+    case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;

+    case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;

+    case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;

+    case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;

+    case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break;

+    case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break;

+    case OpReadClockKHR: *hasResult = true; *hasResultType = true; break;

+    case OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break;

+    case OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break;

+    case OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break;

+    case OpReportIntersectionNV: *hasResult = true; *hasResultType = true; break;

+    case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;

+    case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;

+    case OpTraceNV: *hasResult = false; *hasResultType = false; break;

+    case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;

+    case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;

+    case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;

+    case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;

+    case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;

+    case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;

+    case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break;

+    case OpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break;

+    case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;

+    case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;

+    case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;

+    case OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break;

+    case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break;

+    case OpConvertUToImageNV: *hasResult = true; *hasResultType = true; break;

+    case OpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break;

+    case OpConvertImageToUNV: *hasResult = true; *hasResultType = true; break;

+    case OpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break;

+    case OpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break;

+    case OpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break;

+    case OpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break;

+    case OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpUAddSatINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpIAverageINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpUAverageINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpISubSatINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpAsmINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break;

+    case OpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break;

+    case OpExpectKHR: *hasResult = true; *hasResultType = true; break;

+    case OpDecorateString: *hasResult = false; *hasResultType = false; break;

+    case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;

+    case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedSinINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedCosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedLogINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFixedExpINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;

+    case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;

+    case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;

+    case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;

+    case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;

+    case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;

+    }

+}

+#endif /* SPV_ENABLE_UTILITY_CODE */

+

+// Overload operator| for mask bit combining

+

+inline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); }

+inline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); }

+inline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); }

+inline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); }

+inline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); }

+inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); }

+inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }

+inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }

+inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }

+inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }

+

+}  // end namespace spv

+

+#endif  // #ifndef spirv_HPP

+

diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
index 486e80d..5249a5b 100644
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -111,27 +111,23 @@
 
     void addStringOperand(const char* str)
     {
-        unsigned int word;
-        char* wordString = (char*)&word;
-        char* wordPtr = wordString;
-        int charCount = 0;
+        unsigned int word = 0;
+        unsigned int shiftAmount = 0;
         char c;
+
         do {
             c = *(str++);
-            *(wordPtr++) = c;
-            ++charCount;
-            if (charCount == 4) {
+            word |= ((unsigned int)c) << shiftAmount;
+            shiftAmount += 8;
+            if (shiftAmount == 32) {
                 addImmediateOperand(word);
-                wordPtr = wordString;
-                charCount = 0;
+                word = 0;
+                shiftAmount = 0;
             }
         } while (c != 0);
 
         // deal with partial last word
-        if (charCount > 0) {
-            // pad with 0s
-            for (; charCount < 4; ++charCount)
-                *(wordPtr++) = 0;
+        if (shiftAmount > 0) {
             addImmediateOperand(word);
         }
     }
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 23e510c..37282f2 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -177,6 +177,8 @@
 const char* variableName = nullptr;
 bool HlslEnable16BitTypes = false;
 bool HlslDX9compatible = false;
+bool HlslDxPositionW = false;
+bool EnhancedMsgs = false;
 bool DumpBuiltinSymbols = false;
 std::vector<std::string> IncludeDirectoryList;
 
@@ -190,6 +192,9 @@
 glslang::EShTargetLanguage TargetLanguage = glslang::EShTargetNone;
 glslang::EShTargetLanguageVersion TargetVersion;     // not valid until TargetLanguage is set
 
+// GLSL version
+int GlslVersion = 0; // GLSL version specified on CLI, overrides #version in shader source
+
 std::vector<std::string> Processes;                     // what should be recorded by OpModuleProcessed, or equivalent
 
 // Per descriptor-set binding base data
@@ -652,6 +657,48 @@
                                lowerword == "flatten-uniform-array"  ||
                                lowerword == "fua") {
                         Options |= EOptionFlattenUniformArrays;
+                    } else if (lowerword == "glsl-version") {
+                        if (argc > 1) {
+                            if (strcmp(argv[1], "100") == 0) {
+                                GlslVersion = 100;
+                            } else if (strcmp(argv[1], "110") == 0) {
+                                GlslVersion = 110;
+                            } else if (strcmp(argv[1], "120") == 0) {
+                                GlslVersion = 120;
+                            } else if (strcmp(argv[1], "130") == 0) {
+                                GlslVersion = 130;
+                            } else if (strcmp(argv[1], "140") == 0) {
+                                GlslVersion = 140;
+                            } else if (strcmp(argv[1], "150") == 0) {
+                                GlslVersion = 150;
+                            } else if (strcmp(argv[1], "300es") == 0) {
+                                GlslVersion = 300;
+                            } else if (strcmp(argv[1], "310es") == 0) {
+                                GlslVersion = 310;
+                            } else if (strcmp(argv[1], "320es") == 0) {
+                                GlslVersion = 320;
+                            } else if (strcmp(argv[1], "330") == 0) {
+                                GlslVersion = 330;
+                            } else if (strcmp(argv[1], "400") == 0) {
+                                GlslVersion = 400;
+                            } else if (strcmp(argv[1], "410") == 0) {
+                                GlslVersion = 410;
+                            } else if (strcmp(argv[1], "420") == 0) {
+                                GlslVersion = 420;
+                            } else if (strcmp(argv[1], "430") == 0) {
+                                GlslVersion = 430;
+                            } else if (strcmp(argv[1], "440") == 0) {
+                                GlslVersion = 440;
+                            } else if (strcmp(argv[1], "450") == 0) {
+                                GlslVersion = 450;
+                            } else if (strcmp(argv[1], "460") == 0) {
+                                GlslVersion = 460;
+                            } else
+                                Error("--glsl-version expected one of: 100, 110, 120, 130, 140, 150,\n"
+                                      "300es, 310es, 320es, 330\n"
+                                      "400, 410, 420, 430, 440, 450, 460");
+                        }
+                        bumpArg();
                     } else if (lowerword == "hlsl-offsets") {
                         Options |= EOptionHlslOffsets;
                     } else if (lowerword == "hlsl-iomap" ||
@@ -662,6 +709,10 @@
                         HlslEnable16BitTypes = true;
                     } else if (lowerword == "hlsl-dx9-compatible") {
                         HlslDX9compatible = true;
+                    } else if (lowerword == "hlsl-dx-position-w") {
+                        HlslDxPositionW = true;
+                    } else if (lowerword == "enhanced-msgs") {
+                        EnhancedMsgs = true;
                     } else if (lowerword == "auto-sampled-textures") { 
                         autoSampledTextures = true;
                     } else if (lowerword == "invert-y" ||  // synonyms
@@ -764,6 +815,9 @@
                             } else if (strcmp(argv[1], "vulkan1.2") == 0) {
                                 setVulkanSpv();
                                 ClientVersion = glslang::EShTargetVulkan_1_2;
+                            } else if (strcmp(argv[1], "vulkan1.3") == 0) {
+                                setVulkanSpv();
+                                ClientVersion = glslang::EShTargetVulkan_1_3;
                             } else if (strcmp(argv[1], "opengl") == 0) {
                                 setOpenGlSpv();
                                 ClientVersion = glslang::EShTargetOpenGL_450;
@@ -785,9 +839,13 @@
                             } else if (strcmp(argv[1], "spirv1.5") == 0) {
                                 TargetLanguage = glslang::EShTargetSpv;
                                 TargetVersion = glslang::EShTargetSpv_1_5;
+                            } else if (strcmp(argv[1], "spirv1.6") == 0) {
+                                TargetLanguage = glslang::EShTargetSpv;
+                                TargetVersion = glslang::EShTargetSpv_1_6;
                             } else
-                                Error("--target-env expected one of: vulkan1.0, vulkan1.1, vulkan1.2, opengl,\n"
-                                      "spirv1.0, spirv1.1, spirv1.2, spirv1.3, spirv1.4, or spirv1.5");
+                                Error("--target-env expected one of: vulkan1.0, vulkan1.1, vulkan1.2,\n"
+                                      "vulkan1.3, opengl, spirv1.0, spirv1.1, spirv1.2, spirv1.3,\n"
+                                      "spirv1.4, spirv1.5 or spirv1.6");
                         }
                         bumpArg();
                     } else if (lowerword == "undef-macro" ||
@@ -1012,6 +1070,10 @@
             TargetLanguage = glslang::EShTargetSpv;
             TargetVersion = glslang::EShTargetSpv_1_5;
             break;
+        case glslang::EShTargetVulkan_1_3:
+            TargetLanguage = glslang::EShTargetSpv;
+            TargetVersion = glslang::EShTargetSpv_1_6;
+            break;
         case glslang::EShTargetOpenGL_450:
             TargetLanguage = glslang::EShTargetSpv;
             TargetVersion = glslang::EShTargetSpv_1_0;
@@ -1059,6 +1121,8 @@
         messages = (EShMessages)(messages | EShMsgHlslDX9Compatible);
     if (DumpBuiltinSymbols)
         messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable);
+    if (EnhancedMsgs)
+        messages = (EShMessages)(messages | EShMsgEnhanced);
 }
 
 //
@@ -1149,6 +1213,27 @@
     }
 };
 
+// Writes a string into a depfile, escaping some special characters following the Makefile rules.
+static void writeEscapedDepString(std::ofstream& file, const std::string& str)
+{
+    for (char c : str) {
+        switch (c) {
+        case ' ':
+        case ':':
+        case '#':
+        case '[':
+        case ']':
+        case '\\':
+            file << '\\';
+            break;
+        case '$':
+            file << '$';
+            break;
+        }
+        file << c;
+    }
+}
+
 // Writes a depfile similar to gcc -MMD foo.c
 bool writeDepFile(std::string depfile, std::vector<std::string>& binaryFiles, const std::vector<std::string>& sources)
 {
@@ -1156,10 +1241,12 @@
     if (file.fail())
         return false;
 
-    for (auto it = binaryFiles.begin(); it != binaryFiles.end(); it++) {
-        file << *it << ":";
-        for (auto it = sources.begin(); it != sources.end(); it++) {
-            file << " " << *it;
+    for (auto binaryFile = binaryFiles.begin(); binaryFile != binaryFiles.end(); binaryFile++) {
+        writeEscapedDepString(file, *binaryFile);
+        file << ":";
+        for (auto sourceFile = sources.begin(); sourceFile != sources.end(); sourceFile++) {
+            file << " ";
+            writeEscapedDepString(file, *sourceFile);
         }
         file << std::endl;
     }
@@ -1209,6 +1296,8 @@
             shader->setSourceEntryPoint(sourceEntryPointName);
         }
 
+        shader->setOverrideVersion(GlslVersion);
+
         std::string intrinsicString = getIntrinsic(compUnit.text, compUnit.count);
 
         PreambleString = "";
@@ -1284,6 +1373,12 @@
         if (Options & EOptionInvertY)
             shader->setInvertY(true);
 
+        if (HlslDxPositionW)
+            shader->setDxPositionW(true);
+
+        if (EnhancedMsgs)
+            shader->setEnhancedMsgs();
+
         // Set up the environment, some subsettings take precedence over earlier
         // ways of setting things.
         if (Options & EOptionSpv) {
@@ -1840,6 +1935,11 @@
            "  -dumpfullversion | -dumpversion   print bare major.minor.patchlevel\n"
            "  --flatten-uniform-arrays | --fua  flatten uniform texture/sampler arrays to\n"
            "                                    scalars\n"
+           "  --glsl-version {100 | 110 | 120 | 130 | 140 | 150 |\n"
+           "                300es | 310es | 320es | 330\n"
+           "                400 | 410 | 420 | 430 | 440 | 450 | 460}\n"
+           "                                    set GLSL version, overrides #version\n"
+           "                                    in shader sourcen\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"
@@ -1847,7 +1947,10 @@
            "  --hlsl-dx9-compatible             interprets sampler declarations as a\n"
            "                                    texture/sampler combo like DirectX9 would,\n"
            "                                    and recognizes DirectX9-specific semantics\n"
+           "  --hlsl-dx-position-w              W component of SV_Position in HLSL fragment\n"
+           "                                    shaders compatible with DirectX\n"
            "  --invert-y | --iy                 invert position.Y output in vertex shader\n"
+           "  --enhanced-msgs                   print more readable error messages (GLSL only)\n"
            "  --keep-uncalled | --ku            don't eliminate uncalled functions\n"
            "  --nan-clamp                       favor non-NaN operand in min, max, and clamp\n"
            "  --no-storage-format | --nsf       use Unknown image format\n"
@@ -1922,8 +2025,9 @@
            "  --sep                             synonym for --source-entrypoint\n"
            "  --stdin                           read from stdin instead of from a file;\n"
            "                                    requires providing the shader stage using -S\n"
-           "  --target-env {vulkan1.0 | vulkan1.1 | vulkan1.2 | opengl | \n"
-           "                spirv1.0 | spirv1.1 | spirv1.2 | spirv1.3 | spirv1.4 | spirv1.5}\n"
+           "  --target-env {vulkan1.0 | vulkan1.1 | vulkan1.2 | vulkan1.3 | opengl |\n"
+           "                spirv1.0 | spirv1.1 | spirv1.2 | spirv1.3 | spirv1.4 |\n"
+           "                spirv1.5 | spirv1.6}\n"
            "                                    Set the execution environment that the\n"
            "                                    generated code will be executed in.\n"
            "                                    Defaults to:\n"
@@ -1932,6 +2036,7 @@
            "                                     * spirv1.0  under --target-env vulkan1.0\n"
            "                                     * spirv1.3  under --target-env vulkan1.1\n"
            "                                     * spirv1.5  under --target-env vulkan1.2\n"
+           "                                     * spirv1.6  under --target-env vulkan1.3\n"
            "                                    Multiple --target-env can be specified.\n"
            "  --variable-name <name>\n"
            "  --vn <name>                       creates a C header file that contains a\n"
diff --git a/Test/150.frag b/Test/150.frag
index 228e4f0..90b1e27 100644
--- a/Test/150.frag
+++ b/Test/150.frag
@@ -111,8 +111,8 @@
     vec2 pf2;

     vec3 pf3;

 

-    lod = textureQueryLod(samp1D, pf);      // ERROR, extension GL_ARB_texture_query_lod needed

-    lod = textureQueryLod(samp2Ds, pf2);    // ERROR, extension GL_ARB_texture_query_lod needed

+    lod = textureQueryLOD(samp1D, pf);      // ERROR, extension GL_ARB_texture_query_lod needed

+    lod = textureQueryLOD(samp2Ds, pf2);    // ERROR, extension GL_ARB_texture_query_lod needed

 }

 

 #extension GL_ARB_texture_query_lod : enable

@@ -138,21 +138,21 @@
     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(samp1D, pf);

+    lod = textureQueryLOD(isamp2D, pf2);

+    lod = textureQueryLOD(usamp3D, pf3);

+    lod = textureQueryLOD(sampCube, pf3);

+    lod = textureQueryLOD(isamp1DA, pf);

+    lod = textureQueryLOD(usamp2DA, pf2);

 

-    lod = textureQueryLod(samp1Ds, pf);

-    lod = textureQueryLod(samp2Ds, pf2);

-    lod = textureQueryLod(sampCubes, pf3);

-    lod = textureQueryLod(samp1DAs, pf);

-    lod = textureQueryLod(samp2DAs, pf2);

+    lod = textureQueryLOD(samp1Ds, pf);

+    lod = textureQueryLOD(samp2Ds, pf2);

+    lod = textureQueryLOD(sampCubes, pf3);

+    lod = textureQueryLOD(samp1DAs, pf);

+    lod = textureQueryLOD(samp2DAs, pf2);

 

-    lod = textureQueryLod(sampBuf, pf);     // ERROR

-    lod = textureQueryLod(sampRect, pf2);   // ERROR

+    lod = textureQueryLOD(sampBuf, pf);     // ERROR

+    lod = textureQueryLOD(sampRect, pf2);   // ERROR

 }

 

 // Test extension GL_EXT_shader_integer_mix

diff --git a/Test/BestMatchFunction.vert b/Test/BestMatchFunction.vert
new file mode 100644
index 0000000..eb09233
--- /dev/null
+++ b/Test/BestMatchFunction.vert
@@ -0,0 +1,20 @@
+#version 150
+#extension GL_ARB_gpu_shader5 : require
+
+uniform ivec4 u1;
+uniform uvec4 u2;
+out     vec4  result;
+vec4 f(in vec4 a, in vec4 b){ return a * b;}           // choice 1
+vec4 f(in uvec4 a, in uvec4 b){ return vec4(a - b);}   // choice 2
+
+void main()
+{
+    result = f(u1, u2); // should match choice 2. which have less implicit conversion. 
+    switch (gl_VertexID)
+    {
+      case 0: gl_Position = vec4(-1.0, 1.0, 0.0, 1.0); break;
+      case 1: gl_Position = vec4( 1.0, 1.0, 0.0, 1.0); break;
+      case 2: gl_Position = vec4(-1.0,-1.0, 0.0, 1.0); break;
+      case 3: gl_Position = vec4( 1.0,-1.0, 0.0, 1.0); break;
+    }
+}
diff --git a/Test/EndStreamPrimitive.geom b/Test/EndStreamPrimitive.geom
new file mode 100644
index 0000000..a654ebc
--- /dev/null
+++ b/Test/EndStreamPrimitive.geom
@@ -0,0 +1,20 @@
+#version 150 core
+#extension GL_ARB_gpu_shader5 : require
+layout(points) in;
+layout(points, max_vertices = 1) out;
+layout(stream=0) out float output1;
+layout(stream=0) out float output2;
+layout(stream=1) out float output3;
+layout(stream=1) out float output4;
+uniform uint stream;
+void main() {
+
+    output1 = 1.0;
+    output2 = 2.0;
+    EmitStreamVertex(0);
+    EndStreamPrimitive(0);
+    output3 = 3.0;
+    output4 = 4.0;
+    EmitStreamVertex(1);
+    EndStreamPrimitive(1);
+}
\ No newline at end of file
diff --git a/Test/GL_ARB_fragment_coord_conventions.vert b/Test/GL_ARB_fragment_coord_conventions.vert
new file mode 100644
index 0000000..962734f
--- /dev/null
+++ b/Test/GL_ARB_fragment_coord_conventions.vert
@@ -0,0 +1,27 @@
+#version 140
+
+#extension GL_ARB_fragment_coord_conventions: require
+#extension GL_ARB_explicit_attrib_location : enable
+
+
+#if !defined GL_ARB_fragment_coord_conventions
+#  error GL_ARB_fragment_coord_conventions is not defined
+#elif GL_ARB_fragment_coord_conventions != 1
+#  error GL_ARB_fragment_coord_conventions is not equal to 1
+#endif
+
+
+layout (location = 0) in vec4 pos;
+out vec4 i;
+
+uniform float gtf_windowWidth;
+uniform float gtf_windowHeight;
+uniform float n;
+uniform float f;
+
+void main()
+{
+  gl_Position = pos;
+  i = vec4((pos.x+1.0)*0.5*gtf_windowWidth, (pos.y+1.0)*0.5*gtf_windowHeight, (f-n)*0.5*pos.z + (f+n)*0.5, pos.w);
+}
+
diff --git a/Test/baseLegalResults/hlsl.flattenSubset.frag.out b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
index 0edf712..46d3afb 100644
--- a/Test/baseLegalResults/hlsl.flattenSubset.frag.out
+++ b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
@@ -6,19 +6,17 @@
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 47 50
+                              EntryPoint Fragment 4  "main" 50
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
                               Name 21  "samp"
                               Name 33  "tex"
-                              Name 47  "vpos"
                               Name 50  "@entryPointOutput"
                               Decorate 21(samp) DescriptorSet 0
                               Decorate 21(samp) Binding 0
                               Decorate 33(tex) DescriptorSet 0
                               Decorate 33(tex) Binding 1
-                              Decorate 47(vpos) Location 0
                               Decorate 50(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -34,8 +32,6 @@
               39:             TypeVector 6(float) 2
               40:    6(float) Constant 1056964608
               41:   39(fvec2) ConstantComposite 40 40
-              46:             TypePointer Input 7(fvec4)
-        47(vpos):     46(ptr) Variable Input
               49:             TypePointer Output 7(fvec4)
 50(@entryPointOutput):     49(ptr) Variable Output
          4(main):           2 Function None 3
diff --git a/Test/baseLegalResults/hlsl.flattenSubset2.frag.out b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
index 00bd55b..408c0ea 100644
--- a/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
+++ b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
@@ -6,13 +6,11 @@
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 49 52
+                              EntryPoint Fragment 4  "main" 52
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
-                              Name 49  "vpos"
                               Name 52  "@entryPointOutput"
-                              Decorate 49(vpos) Location 0
                               Decorate 52(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -20,8 +18,6 @@
                7:             TypeVector 6(float) 4
               43:    6(float) Constant 0
               44:    7(fvec4) ConstantComposite 43 43 43 43
-              48:             TypePointer Input 7(fvec4)
-        49(vpos):     48(ptr) Variable Input
               51:             TypePointer Output 7(fvec4)
 52(@entryPointOutput):     51(ptr) Variable Output
          4(main):           2 Function None 3
diff --git a/Test/baseResults/150.frag.out b/Test/baseResults/150.frag.out
index 2192e14..ba15b5c 100644
--- a/Test/baseResults/150.frag.out
+++ b/Test/baseResults/150.frag.out
@@ -2,22 +2,23 @@
 ERROR: 0:4: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord
 ERROR: 0:5: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord
 ERROR: 0:6: 'layout qualifier' : can only apply origin_upper_left and pixel_center_origin to gl_FragCoord 
-ERROR: 0:14: 'gl_FragCoord' : cannot redeclare after use 
 ERROR: 0:50: 'gl_PerFragment' : undeclared identifier 
 ERROR: 0:53: 'double' : Reserved word. 
 ERROR: 0:53: 'double' : not supported for this version or the enabled extensions 
 ERROR: 0:53: 'double' : must be qualified as flat in
 ERROR: 0:57: '=' :  cannot convert from ' global double' to ' global int'
-ERROR: 0:80: 'floatBitsToInt' : required extension not requested: GL_ARB_shader_bit_encoding
+ERROR: 0:80: 'floatBitsToInt' : required extension not requested: Possible extensions include:
+GL_ARB_shader_bit_encoding
+GL_ARB_gpu_shader5
 ERROR: 0:100: 'packSnorm2x16' : required extension not requested: GL_ARB_shading_language_packing
-ERROR: 0:114: 'textureQueryLod' : required extension not requested: GL_ARB_texture_query_lod
-ERROR: 0:115: 'textureQueryLod' : required extension not requested: GL_ARB_texture_query_lod
-ERROR: 0:154: 'textureQueryLod' : no matching overloaded function found 
+ERROR: 0:114: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod
+ERROR: 0:115: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod
+ERROR: 0:154: 'textureQueryLOD' : no matching overloaded function found 
 ERROR: 0:154: 'assign' :  cannot convert from ' const float' to ' temp 2-component vector of float'
-ERROR: 0:155: 'textureQueryLod' : no matching overloaded function found 
+ERROR: 0:155: 'textureQueryLOD' : no matching overloaded function found 
 ERROR: 0:155: 'assign' :  cannot convert from ' const float' to ' temp 2-component vector of float'
 ERROR: 0:183: 'mix' : required extension not requested: GL_EXT_shader_integer_mix
-ERROR: 18 compilation errors.  No code generated.
+ERROR: 17 compilation errors.  No code generated.
 
 
 Shader version: 150
diff --git a/Test/baseResults/150.geom.out b/Test/baseResults/150.geom.out
index 92b8e1a..c5a31f5 100644
--- a/Test/baseResults/150.geom.out
+++ b/Test/baseResults/150.geom.out
@@ -2,8 +2,8 @@
 ERROR: 0:15: 'fromVertex' : block instance name redefinition 
 ERROR: 0:19: 'fromVertex' : redefinition 
 ERROR: 0:21: 'fooC' : block instance name redefinition 
-ERROR: 0:29: 'EmitStreamVertex' : no matching overloaded function found 
-ERROR: 0:30: 'EndStreamPrimitive' : no matching overloaded function found 
+ERROR: 0:29: 'if the verison is 150 , the EmitStreamVertex and EndStreamPrimitive only support at extension GL_ARB_gpu_shader5' : required extension not requested: GL_ARB_gpu_shader5
+ERROR: 0:30: 'if the verison is 150 , the EmitStreamVertex and EndStreamPrimitive only support at extension GL_ARB_gpu_shader5' : required extension not requested: GL_ARB_gpu_shader5
 ERROR: 0:44: 'stream' : can only be used on an output 
 ERROR: 0:45: 'stream' : can only be used on an output 
 ERROR: 0:46: 'stream' : can only be used on an output 
@@ -49,10 +49,12 @@
 0:27    Sequence
 0:27      EmitVertex ( global void)
 0:28      EndPrimitive ( global void)
-0:29      Constant:
-0:29        0.000000
-0:30      Constant:
-0:30        0.000000
+0:29      EmitStreamVertex ( global void)
+0:29        Constant:
+0:29          1 (const int)
+0:30      EndStreamPrimitive ( global void)
+0:30        Constant:
+0:30          0 (const int)
 0:32      move second child to first child ( temp 3-component vector of float)
 0:32        color: direct index for structure (layout( stream=0) out 3-component vector of float)
 0:32          'anon@0' (layout( stream=0) out block{layout( stream=0) out 3-component vector of float color})
@@ -190,10 +192,12 @@
 0:27    Sequence
 0:27      EmitVertex ( global void)
 0:28      EndPrimitive ( global void)
-0:29      Constant:
-0:29        0.000000
-0:30      Constant:
-0:30        0.000000
+0:29      EmitStreamVertex ( global void)
+0:29        Constant:
+0:29          1 (const int)
+0:30      EndStreamPrimitive ( global void)
+0:30        Constant:
+0:30          0 (const int)
 0:32      move second child to first child ( temp 3-component vector of float)
 0:32        color: direct index for structure (layout( stream=0) out 3-component vector of float)
 0:32          'anon@0' (layout( stream=0) out block{layout( stream=0) out 3-component vector of float color})
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 535a8a6..78b32da 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -627,7 +627,7 @@
 ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
-ERROR: 0:26: 'gl_PointSize' : no such field in structure 
+ERROR: 0:26: 'gl_PointSize' : no such field in structure 'gl_out'
 ERROR: 0:26: 'assign' :  cannot convert from ' temp float' to ' temp block{ out 4-component vector of float Position gl_Position}'
 ERROR: 0:29: 'out' : type must be an array: outf
 ERROR: 0:43: 'vertices' : must be greater than 0 
@@ -940,8 +940,9 @@
     main(
 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:
-    outa: " global 4-element array of int" versus " global 1-element array of int"
+ERROR: Linking tessellation control and tessellation control stages: Array sizes must be compatible:
+    tessellation control stage: " int outa[4]"
+    tessellation control stage: " int outa[1]"
 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:
     main(
@@ -951,8 +952,9 @@
     foo(
 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 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}"
+ERROR: Linking tessellation control and tessellation control stages: tessellation control block member has no corresponding member in tessellation control block:
+    tessellation control stage: Block: gl_PerVertex, Member: gl_PointSize
+    tessellation control stage: Block: gl_PerVertex, Member: n/a 
 
 Linked tessellation evaluation stage:
 
diff --git a/Test/baseResults/310.geom.out b/Test/baseResults/310.geom.out
index b0dabc3..2fa5d11 100644
--- a/Test/baseResults/310.geom.out
+++ b/Test/baseResults/310.geom.out
@@ -6,7 +6,7 @@
 ERROR: 0:44: 'EndStreamPrimitive' : no matching overloaded function found 
 ERROR: 0:47: 'gl_ClipDistance' : undeclared identifier 
 ERROR: 0:47: 'gl_ClipDistance' :  left of '[' is not of type array, matrix, or vector  
-ERROR: 0:48: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:48: 'gl_ClipDistance' : no such field in structure 'gl_in'
 ERROR: 0:48: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:47: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:55: 'selecting output stream' : not supported with this profile: es
diff --git a/Test/baseResults/310.tesc.out b/Test/baseResults/310.tesc.out
index 25ce6ee..bd4c1bd 100644
--- a/Test/baseResults/310.tesc.out
+++ b/Test/baseResults/310.tesc.out
@@ -6,12 +6,12 @@
 ERROR: 0:26: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
 GL_OES_tessellation_point_size
-ERROR: 0:27: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:27: 'gl_ClipDistance' : no such field in structure 'gl_in'
 ERROR: 0:27: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:34: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
 GL_OES_tessellation_point_size
-ERROR: 0:35: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:35: 'gl_ClipDistance' : no such field in structure 'gl_out'
 ERROR: 0:35: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:35: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:41: '' : tessellation control barrier() cannot be placed within flow control 
diff --git a/Test/baseResults/310.tese.out b/Test/baseResults/310.tese.out
index 2f23d9b..5eecaff 100644
--- a/Test/baseResults/310.tese.out
+++ b/Test/baseResults/310.tese.out
@@ -10,7 +10,7 @@
 ERROR: 0:37: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
 GL_OES_tessellation_point_size
-ERROR: 0:38: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:38: 'gl_ClipDistance' : no such field in structure 'gl_in'
 ERROR: 0:38: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:47: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
@@ -43,7 +43,7 @@
 ERROR: 0:103: 'location' : overlapping use of location 24
 ERROR: 0:105: 'gl_TessLevelOuter' : identifiers starting with "gl_" are reserved 
 ERROR: 0:113: 'sample' : Reserved word. 
-ERROR: 0:119: 'gl_PointSize' : no such field in structure 
+ERROR: 0:119: 'gl_PointSize' : no such field in structure 'gl_in'
 ERROR: 0:119: '=' :  cannot convert from ' temp block{ in highp 4-component vector of float Position gl_Position}' to ' temp highp float'
 ERROR: 0:127: 'gl_BoundingBoxOES' : undeclared identifier 
 ERROR: 43 compilation errors.  No code generated.
diff --git a/Test/baseResults/320.geom.out b/Test/baseResults/320.geom.out
index f333766..cdaacb9 100644
--- a/Test/baseResults/320.geom.out
+++ b/Test/baseResults/320.geom.out
@@ -6,7 +6,7 @@
 ERROR: 0:34: 'EndStreamPrimitive' : no matching overloaded function found 
 ERROR: 0:37: 'gl_ClipDistance' : undeclared identifier 
 ERROR: 0:37: 'gl_ClipDistance' :  left of '[' is not of type array, matrix, or vector  
-ERROR: 0:38: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:38: 'gl_ClipDistance' : no such field in structure 'gl_in'
 ERROR: 0:38: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:37: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:45: 'selecting output stream' : not supported with this profile: es
diff --git a/Test/baseResults/320.tesc.out b/Test/baseResults/320.tesc.out
index 6bb52b3..67848d9 100644
--- a/Test/baseResults/320.tesc.out
+++ b/Test/baseResults/320.tesc.out
@@ -6,12 +6,12 @@
 ERROR: 0:24: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
 GL_OES_tessellation_point_size
-ERROR: 0:25: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:25: 'gl_ClipDistance' : no such field in structure 'gl_in'
 ERROR: 0:25: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:32: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
 GL_OES_tessellation_point_size
-ERROR: 0:33: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:33: 'gl_ClipDistance' : no such field in structure 'gl_out'
 ERROR: 0:33: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:33: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:39: '' : tessellation control barrier() cannot be placed within flow control 
diff --git a/Test/baseResults/320.tese.out b/Test/baseResults/320.tese.out
index 014eeb0..ba51b9c 100644
--- a/Test/baseResults/320.tese.out
+++ b/Test/baseResults/320.tese.out
@@ -10,7 +10,7 @@
 ERROR: 0:33: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
 GL_OES_tessellation_point_size
-ERROR: 0:34: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:34: 'gl_ClipDistance' : no such field in structure 'gl_in'
 ERROR: 0:34: 'expression' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:43: 'gl_PointSize' : required extension not requested: Possible extensions include:
 GL_EXT_tessellation_point_size
diff --git a/Test/baseResults/410.geom.out b/Test/baseResults/410.geom.out
index 498da5a..3cc7900 100644
--- a/Test/baseResults/410.geom.out
+++ b/Test/baseResults/410.geom.out
@@ -2,7 +2,7 @@
 ERROR: 0:8: 'myIn' : cannot redeclare a built-in block with a user name 
 ERROR: 0:12: 'gl_myIn' : no declaration found for redeclaration 
 ERROR: 0:20: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
-ERROR: 0:32: 'gl_Position' : no such field in structure 
+ERROR: 0:32: 'gl_Position' : no such field in structure 'gl_in'
 ERROR: 0:32: '=' :  cannot convert from ' temp block{ in float PointSize gl_PointSize}' to ' temp 4-component vector of float'
 ERROR: 0:33: 'gl_Position' : member of nameless block was not redeclared 
 ERROR: 0:33: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out
index a1f881c..4410c84 100644
--- a/Test/baseResults/420.tesc.out
+++ b/Test/baseResults/420.tesc.out
@@ -2,7 +2,7 @@
 ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
-ERROR: 0:26: 'gl_PointSize' : no such field in structure 
+ERROR: 0:26: 'gl_PointSize' : no such field in structure 'gl_out'
 ERROR: 0:26: 'assign' :  cannot convert from ' temp float' to ' temp block{ out 4-component vector of float Position gl_Position}'
 ERROR: 0:29: 'out' : type must be an array: outf
 ERROR: 0:43: 'vertices' : must be greater than 0 
diff --git a/Test/baseResults/450.geom.out b/Test/baseResults/450.geom.out
index e75bf93..b51a674 100644
--- a/Test/baseResults/450.geom.out
+++ b/Test/baseResults/450.geom.out
@@ -1,6 +1,6 @@
 450.geom
 ERROR: 0:15: '[' :  array index out of range '3'
-ERROR: 0:15: 'gl_Position' : no such field in structure 
+ERROR: 0:15: 'gl_Position' : no such field in structure 'gl_in'
 ERROR: 0:19: 'points' : can only apply to a standalone qualifier 
 ERROR: 3 compilation errors.  No code generated.
 
diff --git a/Test/baseResults/BestMatchFunction.vert.out b/Test/baseResults/BestMatchFunction.vert.out
new file mode 100644
index 0000000..843ffd7
--- /dev/null
+++ b/Test/baseResults/BestMatchFunction.vert.out
@@ -0,0 +1,206 @@
+BestMatchFunction.vert
+WARNING: 0:2: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:7  Function Definition: f(vf4;vf4; ( global 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'a' ( in 4-component vector of float)
+0:7      'b' ( in 4-component vector of float)
+0:7    Sequence
+0:7      Branch: Return with expression
+0:7        component-wise multiply ( temp 4-component vector of float)
+0:7          'a' ( in 4-component vector of float)
+0:7          'b' ( in 4-component vector of float)
+0:8  Function Definition: f(vu4;vu4; ( global 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'a' ( in 4-component vector of uint)
+0:8      'b' ( in 4-component vector of uint)
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        Convert uint to float ( temp 4-component vector of float)
+0:8          subtract ( temp 4-component vector of uint)
+0:8            'a' ( in 4-component vector of uint)
+0:8            'b' ( in 4-component vector of uint)
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        'result' ( smooth out 4-component vector of float)
+0:12        Function Call: f(vu4;vu4; ( global 4-component vector of float)
+0:12          Convert int to uint ( temp 4-component vector of uint)
+0:12            'u1' ( uniform 4-component vector of int)
+0:12          'u2' ( uniform 4-component vector of uint)
+0:13      switch
+0:13      condition
+0:13        'gl_VertexID' ( gl_VertexId int VertexId)
+0:13      body
+0:13        Sequence
+0:15          case:  with expression
+0:15            Constant:
+0:15              0 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp 4-component vector of float)
+0:15              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:15                '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})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              Constant:
+0:15                -1.000000
+0:15                1.000000
+0:15                0.000000
+0:15                1.000000
+0:15            Branch: Break
+0:16          case:  with expression
+0:16            Constant:
+0:16              1 (const int)
+0:?           Sequence
+0:16            move second child to first child ( temp 4-component vector of float)
+0:16              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:16                '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})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              Constant:
+0:16                1.000000
+0:16                1.000000
+0:16                0.000000
+0:16                1.000000
+0:16            Branch: Break
+0:17          case:  with expression
+0:17            Constant:
+0:17              2 (const int)
+0:?           Sequence
+0:17            move second child to first child ( temp 4-component vector of float)
+0:17              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:17                '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})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              Constant:
+0:17                -1.000000
+0:17                -1.000000
+0:17                0.000000
+0:17                1.000000
+0:17            Branch: Break
+0:18          case:  with expression
+0:18            Constant:
+0:18              3 (const int)
+0:?           Sequence
+0:18            move second child to first child ( temp 4-component vector of float)
+0:18              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:18                '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})
+0:18                Constant:
+0:18                  0 (const uint)
+0:18              Constant:
+0:18                1.000000
+0:18                -1.000000
+0:18                0.000000
+0:18                1.000000
+0:18            Branch: Break
+0:?   Linker Objects
+0:?     'u1' ( uniform 4-component vector of int)
+0:?     'u2' ( uniform 4-component vector of uint)
+0:?     'result' ( smooth 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 unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:8  Function Definition: f(vu4;vu4; ( global 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'a' ( in 4-component vector of uint)
+0:8      'b' ( in 4-component vector of uint)
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        Convert uint to float ( temp 4-component vector of float)
+0:8          subtract ( temp 4-component vector of uint)
+0:8            'a' ( in 4-component vector of uint)
+0:8            'b' ( in 4-component vector of uint)
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        'result' ( smooth out 4-component vector of float)
+0:12        Function Call: f(vu4;vu4; ( global 4-component vector of float)
+0:12          Convert int to uint ( temp 4-component vector of uint)
+0:12            'u1' ( uniform 4-component vector of int)
+0:12          'u2' ( uniform 4-component vector of uint)
+0:13      switch
+0:13      condition
+0:13        'gl_VertexID' ( gl_VertexId int VertexId)
+0:13      body
+0:13        Sequence
+0:15          case:  with expression
+0:15            Constant:
+0:15              0 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp 4-component vector of float)
+0:15              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:15                'anon@0' ( out block{ 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})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              Constant:
+0:15                -1.000000
+0:15                1.000000
+0:15                0.000000
+0:15                1.000000
+0:15            Branch: Break
+0:16          case:  with expression
+0:16            Constant:
+0:16              1 (const int)
+0:?           Sequence
+0:16            move second child to first child ( temp 4-component vector of float)
+0:16              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:16                'anon@0' ( out block{ 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})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              Constant:
+0:16                1.000000
+0:16                1.000000
+0:16                0.000000
+0:16                1.000000
+0:16            Branch: Break
+0:17          case:  with expression
+0:17            Constant:
+0:17              2 (const int)
+0:?           Sequence
+0:17            move second child to first child ( temp 4-component vector of float)
+0:17              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:17                'anon@0' ( out block{ 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})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              Constant:
+0:17                -1.000000
+0:17                -1.000000
+0:17                0.000000
+0:17                1.000000
+0:17            Branch: Break
+0:18          case:  with expression
+0:18            Constant:
+0:18              3 (const int)
+0:?           Sequence
+0:18            move second child to first child ( temp 4-component vector of float)
+0:18              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:18                'anon@0' ( out block{ 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})
+0:18                Constant:
+0:18                  0 (const uint)
+0:18              Constant:
+0:18                1.000000
+0:18                -1.000000
+0:18                0.000000
+0:18                1.000000
+0:18            Branch: Break
+0:?   Linker Objects
+0:?     'u1' ( uniform 4-component vector of int)
+0:?     'u2' ( uniform 4-component vector of uint)
+0:?     'result' ( smooth 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 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/EndStreamPrimitive.geom.out b/Test/baseResults/EndStreamPrimitive.geom.out
new file mode 100644
index 0000000..702c3f9
--- /dev/null
+++ b/Test/baseResults/EndStreamPrimitive.geom.out
@@ -0,0 +1,97 @@
+EndStreamPrimitive.geom
+WARNING: 0:2: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+invocations = -1
+max_vertices = 1
+input primitive = points
+output primitive = points
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp float)
+0:12        'output1' (layout( stream=0) out float)
+0:12        Constant:
+0:12          1.000000
+0:13      move second child to first child ( temp float)
+0:13        'output2' (layout( stream=0) out float)
+0:13        Constant:
+0:13          2.000000
+0:14      EmitStreamVertex ( global void)
+0:14        Constant:
+0:14          0 (const int)
+0:15      EndStreamPrimitive ( global void)
+0:15        Constant:
+0:15          0 (const int)
+0:16      move second child to first child ( temp float)
+0:16        'output3' (layout( stream=1) out float)
+0:16        Constant:
+0:16          3.000000
+0:17      move second child to first child ( temp float)
+0:17        'output4' (layout( stream=1) out float)
+0:17        Constant:
+0:17          4.000000
+0:18      EmitStreamVertex ( global void)
+0:18        Constant:
+0:18          1 (const int)
+0:19      EndStreamPrimitive ( global void)
+0:19        Constant:
+0:19          1 (const int)
+0:?   Linker Objects
+0:?     'output1' (layout( stream=0) out float)
+0:?     'output2' (layout( stream=0) out float)
+0:?     'output3' (layout( stream=1) out float)
+0:?     'output4' (layout( stream=1) out float)
+0:?     'stream' ( uniform uint)
+
+
+Linked geometry stage:
+
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+invocations = 1
+max_vertices = 1
+input primitive = points
+output primitive = points
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp float)
+0:12        'output1' (layout( stream=0) out float)
+0:12        Constant:
+0:12          1.000000
+0:13      move second child to first child ( temp float)
+0:13        'output2' (layout( stream=0) out float)
+0:13        Constant:
+0:13          2.000000
+0:14      EmitStreamVertex ( global void)
+0:14        Constant:
+0:14          0 (const int)
+0:15      EndStreamPrimitive ( global void)
+0:15        Constant:
+0:15          0 (const int)
+0:16      move second child to first child ( temp float)
+0:16        'output3' (layout( stream=1) out float)
+0:16        Constant:
+0:16          3.000000
+0:17      move second child to first child ( temp float)
+0:17        'output4' (layout( stream=1) out float)
+0:17        Constant:
+0:17          4.000000
+0:18      EmitStreamVertex ( global void)
+0:18        Constant:
+0:18          1 (const int)
+0:19      EndStreamPrimitive ( global void)
+0:19        Constant:
+0:19          1 (const int)
+0:?   Linker Objects
+0:?     'output1' (layout( stream=0) out float)
+0:?     'output2' (layout( stream=0) out float)
+0:?     'output3' (layout( stream=1) out float)
+0:?     'output4' (layout( stream=1) out float)
+0:?     'stream' ( uniform uint)
+
diff --git a/Test/baseResults/GL_ARB_fragment_coord_conventions.vert.out b/Test/baseResults/GL_ARB_fragment_coord_conventions.vert.out
new file mode 100644
index 0000000..3b55ae0
--- /dev/null
+++ b/Test/baseResults/GL_ARB_fragment_coord_conventions.vert.out
@@ -0,0 +1,143 @@
+GL_ARB_fragment_coord_conventions.vert
+Shader version: 140
+Requested GL_ARB_explicit_attrib_location
+Requested GL_ARB_fragment_coord_conventions
+0:? Sequence
+0:22  Function Definition: main( ( global void)
+0:22    Function Parameters: 
+0:24    Sequence
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        'gl_Position' ( gl_Position 4-component vector of float Position)
+0:24        'pos' (layout( location=0) in 4-component vector of float)
+0:25      move second child to first child ( temp 4-component vector of float)
+0:25        'i' ( smooth out 4-component vector of float)
+0:25        Construct vec4 ( temp 4-component vector of float)
+0:25          component-wise multiply ( temp float)
+0:25            component-wise multiply ( temp float)
+0:25              add ( temp float)
+0:25                direct index ( temp float)
+0:25                  'pos' (layout( location=0) in 4-component vector of float)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25                Constant:
+0:25                  1.000000
+0:25              Constant:
+0:25                0.500000
+0:25            'gtf_windowWidth' ( uniform float)
+0:25          component-wise multiply ( temp float)
+0:25            component-wise multiply ( temp float)
+0:25              add ( temp float)
+0:25                direct index ( temp float)
+0:25                  'pos' (layout( location=0) in 4-component vector of float)
+0:25                  Constant:
+0:25                    1 (const int)
+0:25                Constant:
+0:25                  1.000000
+0:25              Constant:
+0:25                0.500000
+0:25            'gtf_windowHeight' ( uniform float)
+0:25          add ( temp float)
+0:25            component-wise multiply ( temp float)
+0:25              component-wise multiply ( temp float)
+0:25                subtract ( temp float)
+0:25                  'f' ( uniform float)
+0:25                  'n' ( uniform float)
+0:25                Constant:
+0:25                  0.500000
+0:25              direct index ( temp float)
+0:25                'pos' (layout( location=0) in 4-component vector of float)
+0:25                Constant:
+0:25                  2 (const int)
+0:25            component-wise multiply ( temp float)
+0:25              add ( temp float)
+0:25                'f' ( uniform float)
+0:25                'n' ( uniform float)
+0:25              Constant:
+0:25                0.500000
+0:25          direct index ( temp float)
+0:25            'pos' (layout( location=0) in 4-component vector of float)
+0:25            Constant:
+0:25              3 (const int)
+0:?   Linker Objects
+0:?     'pos' (layout( location=0) in 4-component vector of float)
+0:?     'i' ( smooth out 4-component vector of float)
+0:?     'gtf_windowWidth' ( uniform float)
+0:?     'gtf_windowHeight' ( uniform float)
+0:?     'n' ( uniform float)
+0:?     'f' ( uniform float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 140
+Requested GL_ARB_explicit_attrib_location
+Requested GL_ARB_fragment_coord_conventions
+0:? Sequence
+0:22  Function Definition: main( ( global void)
+0:22    Function Parameters: 
+0:24    Sequence
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        'gl_Position' ( gl_Position 4-component vector of float Position)
+0:24        'pos' (layout( location=0) in 4-component vector of float)
+0:25      move second child to first child ( temp 4-component vector of float)
+0:25        'i' ( smooth out 4-component vector of float)
+0:25        Construct vec4 ( temp 4-component vector of float)
+0:25          component-wise multiply ( temp float)
+0:25            component-wise multiply ( temp float)
+0:25              add ( temp float)
+0:25                direct index ( temp float)
+0:25                  'pos' (layout( location=0) in 4-component vector of float)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25                Constant:
+0:25                  1.000000
+0:25              Constant:
+0:25                0.500000
+0:25            'gtf_windowWidth' ( uniform float)
+0:25          component-wise multiply ( temp float)
+0:25            component-wise multiply ( temp float)
+0:25              add ( temp float)
+0:25                direct index ( temp float)
+0:25                  'pos' (layout( location=0) in 4-component vector of float)
+0:25                  Constant:
+0:25                    1 (const int)
+0:25                Constant:
+0:25                  1.000000
+0:25              Constant:
+0:25                0.500000
+0:25            'gtf_windowHeight' ( uniform float)
+0:25          add ( temp float)
+0:25            component-wise multiply ( temp float)
+0:25              component-wise multiply ( temp float)
+0:25                subtract ( temp float)
+0:25                  'f' ( uniform float)
+0:25                  'n' ( uniform float)
+0:25                Constant:
+0:25                  0.500000
+0:25              direct index ( temp float)
+0:25                'pos' (layout( location=0) in 4-component vector of float)
+0:25                Constant:
+0:25                  2 (const int)
+0:25            component-wise multiply ( temp float)
+0:25              add ( temp float)
+0:25                'f' ( uniform float)
+0:25                'n' ( uniform float)
+0:25              Constant:
+0:25                0.500000
+0:25          direct index ( temp float)
+0:25            'pos' (layout( location=0) in 4-component vector of float)
+0:25            Constant:
+0:25              3 (const int)
+0:?   Linker Objects
+0:?     'pos' (layout( location=0) in 4-component vector of float)
+0:?     'i' ( smooth out 4-component vector of float)
+0:?     'gtf_windowWidth' ( uniform float)
+0:?     'gtf_windowHeight' ( uniform float)
+0:?     'n' ( uniform float)
+0:?     'f' ( uniform float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/constantUnaryConversion.comp.out b/Test/baseResults/constantUnaryConversion.comp.out
index fcaf6f2..78372f0 100644
--- a/Test/baseResults/constantUnaryConversion.comp.out
+++ b/Test/baseResults/constantUnaryConversion.comp.out
@@ -3,8 +3,8 @@
 Requested GL_EXT_shader_explicit_arithmetic_types
 local_size = (1, 1, 1)
 0:? Sequence
-0:48  Function Definition: main( ( global void)
-0:48    Function Parameters: 
+0:69  Function Definition: main( ( global void)
+0:69    Function Parameters: 
 0:?   Linker Objects
 0:?     'bool_init' ( const bool)
 0:?       true (const bool)
@@ -29,6 +29,12 @@
 0:?     'float32_t_init' ( const float)
 0:?       13.000000
 0:?     'float64_t_init' ( const double)
+0:?       4.000000
+0:?     'neg_float16_t_init' ( const float16_t)
+0:?       -42.000000
+0:?     'neg_float32_t_init' ( const float)
+0:?       -13.000000
+0:?     'neg_float64_t_init' ( const double)
 0:?       -4.000000
 0:?     'bool_to_bool' ( const bool)
 0:?       true (const bool)
@@ -77,7 +83,7 @@
 0:?     'float32_t_to_int8_t' ( const int8_t)
 0:?       13 (const int8_t)
 0:?     'float64_t_to_int8_t' ( const int8_t)
-0:?       -4 (const int8_t)
+0:?       4 (const int8_t)
 0:?     'bool_to_int16_t' ( const int16_t)
 0:?       1 (const int16_t)
 0:?     'int8_t_to_int16_t' ( const int16_t)
@@ -101,7 +107,7 @@
 0:?     'float32_t_to_int16_t' ( const int16_t)
 0:?       13 (const int16_t)
 0:?     'float64_t_to_int16_t' ( const int16_t)
-0:?       -4 (const int16_t)
+0:?       4 (const int16_t)
 0:?     'bool_to_int32_t' ( const int)
 0:?       1 (const int)
 0:?     'int8_t_to_int32_t' ( const int)
@@ -125,7 +131,7 @@
 0:?     'float32_t_to_int32_t' ( const int)
 0:?       13 (const int)
 0:?     'float64_t_to_int32_t' ( const int)
-0:?       -4 (const int)
+0:?       4 (const int)
 0:?     'bool_to_int64_t' ( const int64_t)
 0:?       1 (const int64_t)
 0:?     'int8_t_to_int64_t' ( const int64_t)
@@ -149,7 +155,7 @@
 0:?     'float32_t_to_int64_t' ( const int64_t)
 0:?       13 (const int64_t)
 0:?     'float64_t_to_int64_t' ( const int64_t)
-0:?       -4 (const int64_t)
+0:?       4 (const int64_t)
 0:?     'bool_to_uint8_t' ( const uint8_t)
 0:?       1 (const uint8_t)
 0:?     'int8_t_to_uint8_t' ( const uint8_t)
@@ -173,7 +179,7 @@
 0:?     'float32_t_to_uint8_t' ( const uint8_t)
 0:?       13 (const uint8_t)
 0:?     'float64_t_to_uint8_t' ( const uint8_t)
-0:?       252 (const uint8_t)
+0:?       4 (const uint8_t)
 0:?     'bool_to_uint16_t' ( const uint16_t)
 0:?       1 (const uint16_t)
 0:?     'int8_t_to_uint16_t' ( const uint16_t)
@@ -197,7 +203,7 @@
 0:?     'float32_t_to_uint16_t' ( const uint16_t)
 0:?       13 (const uint16_t)
 0:?     'float64_t_to_uint16_t' ( const uint16_t)
-0:?       65532 (const uint16_t)
+0:?       4 (const uint16_t)
 0:?     'bool_to_uint32_t' ( const uint)
 0:?       1 (const uint)
 0:?     'int8_t_to_uint32_t' ( const uint)
@@ -221,7 +227,7 @@
 0:?     'float32_t_to_uint32_t' ( const uint)
 0:?       13 (const uint)
 0:?     'float64_t_to_uint32_t' ( const uint)
-0:?       4294967292 (const uint)
+0:?       4 (const uint)
 0:?     'bool_to_uint64_t' ( const uint64_t)
 0:?       1 (const uint64_t)
 0:?     'int8_t_to_uint64_t' ( const uint64_t)
@@ -245,7 +251,7 @@
 0:?     'float32_t_to_uint64_t' ( const uint64_t)
 0:?       13 (const uint64_t)
 0:?     'float64_t_to_uint64_t' ( const uint64_t)
-0:?       18446744073709551612 (const uint64_t)
+0:?       4 (const uint64_t)
 0:?     'bool_to_float16_t' ( const float16_t)
 0:?       1.000000
 0:?     'int8_t_to_float16_t' ( const float16_t)
@@ -269,7 +275,7 @@
 0:?     'float32_t_to_float16_t' ( const float16_t)
 0:?       13.000000
 0:?     'float64_t_to_float16_t' ( const float16_t)
-0:?       -4.000000
+0:?       4.000000
 0:?     'bool_to_float32_t' ( const float)
 0:?       1.000000
 0:?     'int8_t_to_float32_t' ( const float)
@@ -293,7 +299,7 @@
 0:?     'float32_t_to_float32_t' ( const float)
 0:?       13.000000
 0:?     'float64_t_to_float32_t' ( const float)
-0:?       -4.000000
+0:?       4.000000
 0:?     'bool_to_float64_t' ( const double)
 0:?       1.000000
 0:?     'int8_t_to_float64_t' ( const double)
@@ -317,6 +323,54 @@
 0:?     'float32_t_to_float64_t' ( const double)
 0:?       13.000000
 0:?     'float64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'neg_float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'neg_float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'neg_float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'neg_float16_t_to_int8_t' ( const int8_t)
+0:?       -42 (const int8_t)
+0:?     'neg_float32_t_to_int8_t' ( const int8_t)
+0:?       -13 (const int8_t)
+0:?     'neg_float64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int8_t)
+0:?     'neg_float16_t_to_int16_t' ( const int16_t)
+0:?       -42 (const int16_t)
+0:?     'neg_float32_t_to_int16_t' ( const int16_t)
+0:?       -13 (const int16_t)
+0:?     'neg_float64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int16_t)
+0:?     'neg_float16_t_to_int32_t' ( const int)
+0:?       -42 (const int)
+0:?     'neg_float32_t_to_int32_t' ( const int)
+0:?       -13 (const int)
+0:?     'neg_float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'neg_float16_t_to_int64_t' ( const int64_t)
+0:?       -42 (const int64_t)
+0:?     'neg_float32_t_to_int64_t' ( const int64_t)
+0:?       -13 (const int64_t)
+0:?     'neg_float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'neg_float16_t_to_float16_t' ( const float16_t)
+0:?       -42.000000
+0:?     'neg_float32_t_to_float16_t' ( const float16_t)
+0:?       -13.000000
+0:?     'neg_float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'neg_float16_t_to_float32_t' ( const float)
+0:?       -42.000000
+0:?     'neg_float32_t_to_float32_t' ( const float)
+0:?       -13.000000
+0:?     'neg_float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'neg_float16_t_to_float64_t' ( const double)
+0:?       -42.000000
+0:?     'neg_float32_t_to_float64_t' ( const double)
+0:?       -13.000000
+0:?     'neg_float64_t_to_float64_t' ( const double)
 0:?       -4.000000
 
 
@@ -327,8 +381,8 @@
 Requested GL_EXT_shader_explicit_arithmetic_types
 local_size = (1, 1, 1)
 0:? Sequence
-0:48  Function Definition: main( ( global void)
-0:48    Function Parameters: 
+0:69  Function Definition: main( ( global void)
+0:69    Function Parameters: 
 0:?   Linker Objects
 0:?     'bool_init' ( const bool)
 0:?       true (const bool)
@@ -353,6 +407,12 @@
 0:?     'float32_t_init' ( const float)
 0:?       13.000000
 0:?     'float64_t_init' ( const double)
+0:?       4.000000
+0:?     'neg_float16_t_init' ( const float16_t)
+0:?       -42.000000
+0:?     'neg_float32_t_init' ( const float)
+0:?       -13.000000
+0:?     'neg_float64_t_init' ( const double)
 0:?       -4.000000
 0:?     'bool_to_bool' ( const bool)
 0:?       true (const bool)
@@ -401,7 +461,7 @@
 0:?     'float32_t_to_int8_t' ( const int8_t)
 0:?       13 (const int8_t)
 0:?     'float64_t_to_int8_t' ( const int8_t)
-0:?       -4 (const int8_t)
+0:?       4 (const int8_t)
 0:?     'bool_to_int16_t' ( const int16_t)
 0:?       1 (const int16_t)
 0:?     'int8_t_to_int16_t' ( const int16_t)
@@ -425,7 +485,7 @@
 0:?     'float32_t_to_int16_t' ( const int16_t)
 0:?       13 (const int16_t)
 0:?     'float64_t_to_int16_t' ( const int16_t)
-0:?       -4 (const int16_t)
+0:?       4 (const int16_t)
 0:?     'bool_to_int32_t' ( const int)
 0:?       1 (const int)
 0:?     'int8_t_to_int32_t' ( const int)
@@ -449,7 +509,7 @@
 0:?     'float32_t_to_int32_t' ( const int)
 0:?       13 (const int)
 0:?     'float64_t_to_int32_t' ( const int)
-0:?       -4 (const int)
+0:?       4 (const int)
 0:?     'bool_to_int64_t' ( const int64_t)
 0:?       1 (const int64_t)
 0:?     'int8_t_to_int64_t' ( const int64_t)
@@ -473,7 +533,7 @@
 0:?     'float32_t_to_int64_t' ( const int64_t)
 0:?       13 (const int64_t)
 0:?     'float64_t_to_int64_t' ( const int64_t)
-0:?       -4 (const int64_t)
+0:?       4 (const int64_t)
 0:?     'bool_to_uint8_t' ( const uint8_t)
 0:?       1 (const uint8_t)
 0:?     'int8_t_to_uint8_t' ( const uint8_t)
@@ -497,7 +557,7 @@
 0:?     'float32_t_to_uint8_t' ( const uint8_t)
 0:?       13 (const uint8_t)
 0:?     'float64_t_to_uint8_t' ( const uint8_t)
-0:?       252 (const uint8_t)
+0:?       4 (const uint8_t)
 0:?     'bool_to_uint16_t' ( const uint16_t)
 0:?       1 (const uint16_t)
 0:?     'int8_t_to_uint16_t' ( const uint16_t)
@@ -521,7 +581,7 @@
 0:?     'float32_t_to_uint16_t' ( const uint16_t)
 0:?       13 (const uint16_t)
 0:?     'float64_t_to_uint16_t' ( const uint16_t)
-0:?       65532 (const uint16_t)
+0:?       4 (const uint16_t)
 0:?     'bool_to_uint32_t' ( const uint)
 0:?       1 (const uint)
 0:?     'int8_t_to_uint32_t' ( const uint)
@@ -545,7 +605,7 @@
 0:?     'float32_t_to_uint32_t' ( const uint)
 0:?       13 (const uint)
 0:?     'float64_t_to_uint32_t' ( const uint)
-0:?       4294967292 (const uint)
+0:?       4 (const uint)
 0:?     'bool_to_uint64_t' ( const uint64_t)
 0:?       1 (const uint64_t)
 0:?     'int8_t_to_uint64_t' ( const uint64_t)
@@ -569,7 +629,7 @@
 0:?     'float32_t_to_uint64_t' ( const uint64_t)
 0:?       13 (const uint64_t)
 0:?     'float64_t_to_uint64_t' ( const uint64_t)
-0:?       18446744073709551612 (const uint64_t)
+0:?       4 (const uint64_t)
 0:?     'bool_to_float16_t' ( const float16_t)
 0:?       1.000000
 0:?     'int8_t_to_float16_t' ( const float16_t)
@@ -593,7 +653,7 @@
 0:?     'float32_t_to_float16_t' ( const float16_t)
 0:?       13.000000
 0:?     'float64_t_to_float16_t' ( const float16_t)
-0:?       -4.000000
+0:?       4.000000
 0:?     'bool_to_float32_t' ( const float)
 0:?       1.000000
 0:?     'int8_t_to_float32_t' ( const float)
@@ -617,7 +677,7 @@
 0:?     'float32_t_to_float32_t' ( const float)
 0:?       13.000000
 0:?     'float64_t_to_float32_t' ( const float)
-0:?       -4.000000
+0:?       4.000000
 0:?     'bool_to_float64_t' ( const double)
 0:?       1.000000
 0:?     'int8_t_to_float64_t' ( const double)
@@ -641,5 +701,53 @@
 0:?     'float32_t_to_float64_t' ( const double)
 0:?       13.000000
 0:?     'float64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'neg_float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'neg_float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'neg_float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'neg_float16_t_to_int8_t' ( const int8_t)
+0:?       -42 (const int8_t)
+0:?     'neg_float32_t_to_int8_t' ( const int8_t)
+0:?       -13 (const int8_t)
+0:?     'neg_float64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int8_t)
+0:?     'neg_float16_t_to_int16_t' ( const int16_t)
+0:?       -42 (const int16_t)
+0:?     'neg_float32_t_to_int16_t' ( const int16_t)
+0:?       -13 (const int16_t)
+0:?     'neg_float64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int16_t)
+0:?     'neg_float16_t_to_int32_t' ( const int)
+0:?       -42 (const int)
+0:?     'neg_float32_t_to_int32_t' ( const int)
+0:?       -13 (const int)
+0:?     'neg_float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'neg_float16_t_to_int64_t' ( const int64_t)
+0:?       -42 (const int64_t)
+0:?     'neg_float32_t_to_int64_t' ( const int64_t)
+0:?       -13 (const int64_t)
+0:?     'neg_float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'neg_float16_t_to_float16_t' ( const float16_t)
+0:?       -42.000000
+0:?     'neg_float32_t_to_float16_t' ( const float16_t)
+0:?       -13.000000
+0:?     'neg_float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'neg_float16_t_to_float32_t' ( const float)
+0:?       -42.000000
+0:?     'neg_float32_t_to_float32_t' ( const float)
+0:?       -13.000000
+0:?     'neg_float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'neg_float16_t_to_float64_t' ( const double)
+0:?       -42.000000
+0:?     'neg_float32_t_to_float64_t' ( const double)
+0:?       -13.000000
+0:?     'neg_float64_t_to_float64_t' ( const double)
 0:?       -4.000000
 
diff --git a/Test/baseResults/coord_conventions.frag.out b/Test/baseResults/coord_conventions.frag.out
new file mode 100644
index 0000000..656c608
--- /dev/null
+++ b/Test/baseResults/coord_conventions.frag.out
@@ -0,0 +1,255 @@
+coord_conventions.frag
+Shader version: 140
+Requested GL_ARB_explicit_attrib_location
+Requested GL_ARB_fragment_coord_conventions
+gl_FragCoord pixel center is integer
+gl_FragCoord origin is upper left
+0:? Sequence
+0:17  Function Definition: main( ( global void)
+0:17    Function Parameters: 
+0:19    Sequence
+0:19      move second child to first child ( temp 4-component vector of float)
+0:19        'myColor' (layout( location=0) out 4-component vector of float)
+0:19        Constant:
+0:19          0.200000
+0:19          0.200000
+0:19          0.200000
+0:19          0.200000
+0:20      Test condition and select ( temp void)
+0:20        Condition
+0:20        Compare Greater Than or Equal ( temp bool)
+0:20          direct index ( temp float)
+0:20            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            10.000000
+0:20        true case
+0:21        Sequence
+0:21          move second child to first child ( temp float)
+0:21            direct index ( temp float)
+0:21              'myColor' (layout( location=0) out 4-component vector of float)
+0:21              Constant:
+0:21                2 (const int)
+0:21            Constant:
+0:21              0.800000
+0:23      Test condition and select ( temp void)
+0:23        Condition
+0:23        Compare Equal ( temp bool)
+0:23          direct index ( temp float)
+0:23            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:23            Constant:
+0:23              1 (const int)
+0:23          trunc ( global float)
+0:23            direct index ( temp float)
+0:23              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:23              Constant:
+0:23                1 (const int)
+0:23        true case
+0:24        Sequence
+0:24          move second child to first child ( temp float)
+0:24            direct index ( temp float)
+0:24              'myColor' (layout( location=0) out 4-component vector of float)
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              0.800000
+0:26      Test condition and select ( temp void)
+0:26        Condition
+0:26        Compare Equal ( temp bool)
+0:26          direct index ( temp float)
+0:26            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:26            Constant:
+0:26              0 (const int)
+0:26          trunc ( global float)
+0:26            direct index ( temp float)
+0:26              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:26              Constant:
+0:26                0 (const int)
+0:26        true case
+0:27        Sequence
+0:27          move second child to first child ( temp float)
+0:27            direct index ( temp float)
+0:27              'myColor' (layout( location=0) out 4-component vector of float)
+0:27              Constant:
+0:27                0 (const int)
+0:27            Constant:
+0:27              0.800000
+0:30      Sequence
+0:30        move second child to first child ( temp 4-component vector of float)
+0:30          'diff' ( temp 4-component vector of float)
+0:30          subtract ( temp 4-component vector of float)
+0:30            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:30            'i' ( smooth in 4-component vector of float)
+0:31      Test condition and select ( temp void)
+0:31        Condition
+0:31        Compare Greater Than ( temp bool)
+0:31          Absolute value ( global float)
+0:31            direct index ( temp float)
+0:31              'diff' ( temp 4-component vector of float)
+0:31              Constant:
+0:31                2 (const int)
+0:31          Constant:
+0:31            0.001000
+0:31        true case
+0:32        move second child to first child ( temp float)
+0:32          direct index ( temp float)
+0:32            'myColor' (layout( location=0) out 4-component vector of float)
+0:32            Constant:
+0:32              2 (const int)
+0:32          Constant:
+0:32            0.500000
+0:33      Test condition and select ( temp void)
+0:33        Condition
+0:33        Compare Greater Than ( temp bool)
+0:33          Absolute value ( global float)
+0:33            direct index ( temp float)
+0:33              'diff' ( temp 4-component vector of float)
+0:33              Constant:
+0:33                3 (const int)
+0:33          Constant:
+0:33            0.001000
+0:33        true case
+0:34        move second child to first child ( temp float)
+0:34          direct index ( temp float)
+0:34            'myColor' (layout( location=0) out 4-component vector of float)
+0:34            Constant:
+0:34              3 (const int)
+0:34          Constant:
+0:34            0.500000
+0:?   Linker Objects
+0:?     'i' ( smooth in 4-component vector of float)
+0:?     'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:?     'myColor' (layout( location=0) out 4-component vector of float)
+0:?     'eps' ( const float)
+0:?       0.001000
+
+
+Linked fragment stage:
+
+
+Shader version: 140
+Requested GL_ARB_explicit_attrib_location
+Requested GL_ARB_fragment_coord_conventions
+gl_FragCoord pixel center is integer
+gl_FragCoord origin is upper left
+0:? Sequence
+0:17  Function Definition: main( ( global void)
+0:17    Function Parameters: 
+0:19    Sequence
+0:19      move second child to first child ( temp 4-component vector of float)
+0:19        'myColor' (layout( location=0) out 4-component vector of float)
+0:19        Constant:
+0:19          0.200000
+0:19          0.200000
+0:19          0.200000
+0:19          0.200000
+0:20      Test condition and select ( temp void)
+0:20        Condition
+0:20        Compare Greater Than or Equal ( temp bool)
+0:20          direct index ( temp float)
+0:20            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            10.000000
+0:20        true case
+0:21        Sequence
+0:21          move second child to first child ( temp float)
+0:21            direct index ( temp float)
+0:21              'myColor' (layout( location=0) out 4-component vector of float)
+0:21              Constant:
+0:21                2 (const int)
+0:21            Constant:
+0:21              0.800000
+0:23      Test condition and select ( temp void)
+0:23        Condition
+0:23        Compare Equal ( temp bool)
+0:23          direct index ( temp float)
+0:23            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:23            Constant:
+0:23              1 (const int)
+0:23          trunc ( global float)
+0:23            direct index ( temp float)
+0:23              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:23              Constant:
+0:23                1 (const int)
+0:23        true case
+0:24        Sequence
+0:24          move second child to first child ( temp float)
+0:24            direct index ( temp float)
+0:24              'myColor' (layout( location=0) out 4-component vector of float)
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              0.800000
+0:26      Test condition and select ( temp void)
+0:26        Condition
+0:26        Compare Equal ( temp bool)
+0:26          direct index ( temp float)
+0:26            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:26            Constant:
+0:26              0 (const int)
+0:26          trunc ( global float)
+0:26            direct index ( temp float)
+0:26              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:26              Constant:
+0:26                0 (const int)
+0:26        true case
+0:27        Sequence
+0:27          move second child to first child ( temp float)
+0:27            direct index ( temp float)
+0:27              'myColor' (layout( location=0) out 4-component vector of float)
+0:27              Constant:
+0:27                0 (const int)
+0:27            Constant:
+0:27              0.800000
+0:30      Sequence
+0:30        move second child to first child ( temp 4-component vector of float)
+0:30          'diff' ( temp 4-component vector of float)
+0:30          subtract ( temp 4-component vector of float)
+0:30            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:30            'i' ( smooth in 4-component vector of float)
+0:31      Test condition and select ( temp void)
+0:31        Condition
+0:31        Compare Greater Than ( temp bool)
+0:31          Absolute value ( global float)
+0:31            direct index ( temp float)
+0:31              'diff' ( temp 4-component vector of float)
+0:31              Constant:
+0:31                2 (const int)
+0:31          Constant:
+0:31            0.001000
+0:31        true case
+0:32        move second child to first child ( temp float)
+0:32          direct index ( temp float)
+0:32            'myColor' (layout( location=0) out 4-component vector of float)
+0:32            Constant:
+0:32              2 (const int)
+0:32          Constant:
+0:32            0.500000
+0:33      Test condition and select ( temp void)
+0:33        Condition
+0:33        Compare Greater Than ( temp bool)
+0:33          Absolute value ( global float)
+0:33            direct index ( temp float)
+0:33              'diff' ( temp 4-component vector of float)
+0:33              Constant:
+0:33                3 (const int)
+0:33          Constant:
+0:33            0.001000
+0:33        true case
+0:34        move second child to first child ( temp float)
+0:34          direct index ( temp float)
+0:34            'myColor' (layout( location=0) out 4-component vector of float)
+0:34            Constant:
+0:34              3 (const int)
+0:34          Constant:
+0:34            0.500000
+0:?   Linker Objects
+0:?     'i' ( smooth in 4-component vector of float)
+0:?     'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:?     'myColor' (layout( location=0) out 4-component vector of float)
+0:?     'eps' ( const float)
+0:?       0.001000
+
diff --git a/Test/baseResults/enhanced.0.frag.out b/Test/baseResults/enhanced.0.frag.out
new file mode 100644
index 0000000..1171bfa
--- /dev/null
+++ b/Test/baseResults/enhanced.0.frag.out
@@ -0,0 +1,6 @@
+enhanced.0.frag
+ERROR: enhanced.0.frag:7: ' vec4 constructor' : not enough data provided for construction 
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.1.frag.out b/Test/baseResults/enhanced.1.frag.out
new file mode 100644
index 0000000..42f5b72
--- /dev/null
+++ b/Test/baseResults/enhanced.1.frag.out
@@ -0,0 +1,6 @@
+enhanced.1.frag
+ERROR: enhanced.1.frag:9: 'v2' : no such field in structure 'vVert'
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.2.frag.out b/Test/baseResults/enhanced.2.frag.out
new file mode 100644
index 0000000..a7e48de
--- /dev/null
+++ b/Test/baseResults/enhanced.2.frag.out
@@ -0,0 +1,6 @@
+enhanced.2.frag
+ERROR: enhanced.2.frag:5: ' vec3 constructor' : too many arguments 
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.3.link.out b/Test/baseResults/enhanced.3.link.out
new file mode 100644
index 0000000..c0e6a20
--- /dev/null
+++ b/Test/baseResults/enhanced.3.link.out
@@ -0,0 +1,8 @@
+enhanced.3.vert
+enhanced.3.frag
+ERROR: Linking vertex and fragment stages: Member names and types must match:
+    Block: VS_OUT
+        vertex stage: " vec2 TexCoords"
+        fragment stage: " vec2 foobar"
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.4.link.out b/Test/baseResults/enhanced.4.link.out
new file mode 100644
index 0000000..2c0acf4
--- /dev/null
+++ b/Test/baseResults/enhanced.4.link.out
@@ -0,0 +1,7 @@
+enhanced.4.vert
+enhanced.4.frag
+ERROR: Linking vertex and fragment stages: Layout location qualifier must match:
+    vertex stage: Block: VS_OUT Instance: vs_out: "layout( location=0) out"
+    fragment stage: Block: VS_OUT Instance: fs_in: "layout( location=1) in"
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.5.link.out b/Test/baseResults/enhanced.5.link.out
new file mode 100644
index 0000000..929cfce
--- /dev/null
+++ b/Test/baseResults/enhanced.5.link.out
@@ -0,0 +1,8 @@
+enhanced.5.vert
+enhanced.5.frag
+ERROR: Linking vertex and fragment stages: Member names and types must match:
+    Block: VS_OUT
+        vertex stage: " vec2 TexCoords"
+        fragment stage: " vec3 TexCoords"
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.6.link.out b/Test/baseResults/enhanced.6.link.out
new file mode 100644
index 0000000..9962628
--- /dev/null
+++ b/Test/baseResults/enhanced.6.link.out
@@ -0,0 +1,7 @@
+enhanced.6.vert
+enhanced.6.frag
+ERROR: Linking vertex and fragment stages: Array sizes must be compatible:
+    vertex stage: " VS_OUT{ vec2 TexCoords} vs_out[2]"
+    fragment stage: " VS_OUT{ vec2 TexCoords} fs_in[1]"
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/enhanced.7.link.out b/Test/baseResults/enhanced.7.link.out
new file mode 100644
index 0000000..a6333be
--- /dev/null
+++ b/Test/baseResults/enhanced.7.link.out
@@ -0,0 +1,7 @@
+enhanced.7.vert
+enhanced.7.frag
+ERROR: Linking vertex and fragment stages: vertex block member has no corresponding member in fragment block:
+    vertex stage: Block: Vertex, Member: ii
+    fragment stage: Block: Vertex, Member: n/a 
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/floatBitsToInt.vert.out b/Test/baseResults/floatBitsToInt.vert.out
new file mode 100644
index 0000000..6d5185c
--- /dev/null
+++ b/Test/baseResults/floatBitsToInt.vert.out
@@ -0,0 +1,217 @@
+floatBitsToInt.vert
+WARNING: 0:2: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'result' ( smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      Sequence
+0:9        move second child to first child ( temp int)
+0:9          'ret_val' ( temp int)
+0:9          floatBitsToInt ( global int)
+0:9            'value' ( uniform float)
+0:10      Test condition and select ( temp void)
+0:10        Condition
+0:10        Compare Not Equal ( temp bool)
+0:10          'expected_value' ( uniform int)
+0:10          'ret_val' ( temp int)
+0:10        true case
+0:10        Sequence
+0:10          move second child to first child ( temp 4-component vector of float)
+0:10            'result' ( smooth out 4-component vector of float)
+0:10            Constant:
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:12      switch
+0:12      condition
+0:12        'gl_VertexID' ( gl_VertexId int VertexId)
+0:12      body
+0:12        Sequence
+0:13          case:  with expression
+0:13            Constant:
+0:13              0 (const int)
+0:?           Sequence
+0:13            move second child to first child ( temp 4-component vector of float)
+0:13              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13                '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})
+0:13                Constant:
+0:13                  0 (const uint)
+0:13              Constant:
+0:13                -1.000000
+0:13                1.000000
+0:13                0.000000
+0:13                1.000000
+0:13            Branch: Break
+0:14          case:  with expression
+0:14            Constant:
+0:14              1 (const int)
+0:?           Sequence
+0:14            move second child to first child ( temp 4-component vector of float)
+0:14              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:14                '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})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              Constant:
+0:14                1.000000
+0:14                1.000000
+0:14                0.000000
+0:14                1.000000
+0:14            Branch: Break
+0:15          case:  with expression
+0:15            Constant:
+0:15              2 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp 4-component vector of float)
+0:15              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:15                '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})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              Constant:
+0:15                -1.000000
+0:15                -1.000000
+0:15                0.000000
+0:15                1.000000
+0:15            Branch: Break
+0:16          case:  with expression
+0:16            Constant:
+0:16              3 (const int)
+0:?           Sequence
+0:16            move second child to first child ( temp 4-component vector of float)
+0:16              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:16                '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})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              Constant:
+0:16                1.000000
+0:16                -1.000000
+0:16                0.000000
+0:16                1.000000
+0:16            Branch: Break
+0:?   Linker Objects
+0:?     'expected_value' ( uniform int)
+0:?     'value' ( uniform float)
+0:?     'result' ( smooth 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 unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'result' ( smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      Sequence
+0:9        move second child to first child ( temp int)
+0:9          'ret_val' ( temp int)
+0:9          floatBitsToInt ( global int)
+0:9            'value' ( uniform float)
+0:10      Test condition and select ( temp void)
+0:10        Condition
+0:10        Compare Not Equal ( temp bool)
+0:10          'expected_value' ( uniform int)
+0:10          'ret_val' ( temp int)
+0:10        true case
+0:10        Sequence
+0:10          move second child to first child ( temp 4-component vector of float)
+0:10            'result' ( smooth out 4-component vector of float)
+0:10            Constant:
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:12      switch
+0:12      condition
+0:12        'gl_VertexID' ( gl_VertexId int VertexId)
+0:12      body
+0:12        Sequence
+0:13          case:  with expression
+0:13            Constant:
+0:13              0 (const int)
+0:?           Sequence
+0:13            move second child to first child ( temp 4-component vector of float)
+0:13              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13                'anon@0' ( out block{ 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})
+0:13                Constant:
+0:13                  0 (const uint)
+0:13              Constant:
+0:13                -1.000000
+0:13                1.000000
+0:13                0.000000
+0:13                1.000000
+0:13            Branch: Break
+0:14          case:  with expression
+0:14            Constant:
+0:14              1 (const int)
+0:?           Sequence
+0:14            move second child to first child ( temp 4-component vector of float)
+0:14              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:14                'anon@0' ( out block{ 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})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              Constant:
+0:14                1.000000
+0:14                1.000000
+0:14                0.000000
+0:14                1.000000
+0:14            Branch: Break
+0:15          case:  with expression
+0:15            Constant:
+0:15              2 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp 4-component vector of float)
+0:15              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:15                'anon@0' ( out block{ 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})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              Constant:
+0:15                -1.000000
+0:15                -1.000000
+0:15                0.000000
+0:15                1.000000
+0:15            Branch: Break
+0:16          case:  with expression
+0:16            Constant:
+0:16              3 (const int)
+0:?           Sequence
+0:16            move second child to first child ( temp 4-component vector of float)
+0:16              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:16                'anon@0' ( out block{ 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})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              Constant:
+0:16                1.000000
+0:16                -1.000000
+0:16                0.000000
+0:16                1.000000
+0:16            Branch: Break
+0:?   Linker Objects
+0:?     'expected_value' ( uniform int)
+0:?     'value' ( uniform float)
+0:?     'result' ( smooth 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 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/gl_FragCoord.frag.out b/Test/baseResults/gl_FragCoord.frag.out
new file mode 100644
index 0000000..da9e8dc
--- /dev/null
+++ b/Test/baseResults/gl_FragCoord.frag.out
@@ -0,0 +1,269 @@
+gl_FragCoord.frag
+Shader version: 150
+Requested GL_ARB_explicit_attrib_location
+gl_FragCoord pixel center is integer
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Sequence
+0:9    move second child to first child ( temp float)
+0:9      'myGlobalVar' ( global float)
+0:9      direct index ( temp float)
+0:9        'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:9        Constant:
+0:9          0 (const int)
+0:16  Function Definition: main( ( global void)
+0:16    Function Parameters: 
+0:17    Sequence
+0:17      move second child to first child ( temp 4-component vector of float)
+0:17        'myColor' (layout( location=0) out 4-component vector of float)
+0:17        Constant:
+0:17          0.200000
+0:17          0.200000
+0:17          0.200000
+0:17          0.200000
+0:18      Test condition and select ( temp void)
+0:18        Condition
+0:18        Compare Greater Than or Equal ( temp bool)
+0:18          direct index ( temp float)
+0:18            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:18            Constant:
+0:18              1 (const int)
+0:18          Constant:
+0:18            10.000000
+0:18        true case
+0:19        Sequence
+0:19          move second child to first child ( temp float)
+0:19            direct index ( temp float)
+0:19              'myColor' (layout( location=0) out 4-component vector of float)
+0:19              Constant:
+0:19                2 (const int)
+0:19            Constant:
+0:19              0.800000
+0:21      Test condition and select ( temp void)
+0:21        Condition
+0:21        Compare Equal ( temp bool)
+0:21          direct index ( temp float)
+0:21            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:21            Constant:
+0:21              1 (const int)
+0:21          trunc ( global float)
+0:21            direct index ( temp float)
+0:21              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:21              Constant:
+0:21                1 (const int)
+0:21        true case
+0:22        Sequence
+0:22          move second child to first child ( temp float)
+0:22            direct index ( temp float)
+0:22              'myColor' (layout( location=0) out 4-component vector of float)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              0.800000
+0:24      Test condition and select ( temp void)
+0:24        Condition
+0:24        Compare Equal ( temp bool)
+0:24          direct index ( temp float)
+0:24            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:24            Constant:
+0:24              0 (const int)
+0:24          trunc ( global float)
+0:24            direct index ( temp float)
+0:24              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:24              Constant:
+0:24                0 (const int)
+0:24        true case
+0:25        Sequence
+0:25          move second child to first child ( temp float)
+0:25            direct index ( temp float)
+0:25              'myColor' (layout( location=0) out 4-component vector of float)
+0:25              Constant:
+0:25                0 (const int)
+0:25            Constant:
+0:25              0.800000
+0:28      Sequence
+0:28        move second child to first child ( temp 4-component vector of float)
+0:28          'diff' ( temp 4-component vector of float)
+0:28          subtract ( temp 4-component vector of float)
+0:28            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:28            'i' ( smooth in 4-component vector of float)
+0:29      Test condition and select ( temp void)
+0:29        Condition
+0:29        Compare Greater Than ( temp bool)
+0:29          Absolute value ( global float)
+0:29            direct index ( temp float)
+0:29              'diff' ( temp 4-component vector of float)
+0:29              Constant:
+0:29                2 (const int)
+0:29          Constant:
+0:29            0.001000
+0:29        true case
+0:29        move second child to first child ( temp float)
+0:29          direct index ( temp float)
+0:29            'myColor' (layout( location=0) out 4-component vector of float)
+0:29            Constant:
+0:29              2 (const int)
+0:29          Constant:
+0:29            0.500000
+0:30      Test condition and select ( temp void)
+0:30        Condition
+0:30        Compare Greater Than ( temp bool)
+0:30          Absolute value ( global float)
+0:30            direct index ( temp float)
+0:30              'diff' ( temp 4-component vector of float)
+0:30              Constant:
+0:30                3 (const int)
+0:30          Constant:
+0:30            0.001000
+0:30        true case
+0:30        move second child to first child ( temp float)
+0:30          direct index ( temp float)
+0:30            'myColor' (layout( location=0) out 4-component vector of float)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0.500000
+0:?   Linker Objects
+0:?     'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:?     'myGlobalVar' ( global float)
+0:?     'i' ( smooth in 4-component vector of float)
+0:?     'myColor' (layout( location=0) out 4-component vector of float)
+0:?     'eps' ( const float)
+0:?       0.001000
+
+
+Linked fragment stage:
+
+
+Shader version: 150
+Requested GL_ARB_explicit_attrib_location
+gl_FragCoord pixel center is integer
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Sequence
+0:9    move second child to first child ( temp float)
+0:9      'myGlobalVar' ( global float)
+0:9      direct index ( temp float)
+0:9        'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:9        Constant:
+0:9          0 (const int)
+0:16  Function Definition: main( ( global void)
+0:16    Function Parameters: 
+0:17    Sequence
+0:17      move second child to first child ( temp 4-component vector of float)
+0:17        'myColor' (layout( location=0) out 4-component vector of float)
+0:17        Constant:
+0:17          0.200000
+0:17          0.200000
+0:17          0.200000
+0:17          0.200000
+0:18      Test condition and select ( temp void)
+0:18        Condition
+0:18        Compare Greater Than or Equal ( temp bool)
+0:18          direct index ( temp float)
+0:18            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:18            Constant:
+0:18              1 (const int)
+0:18          Constant:
+0:18            10.000000
+0:18        true case
+0:19        Sequence
+0:19          move second child to first child ( temp float)
+0:19            direct index ( temp float)
+0:19              'myColor' (layout( location=0) out 4-component vector of float)
+0:19              Constant:
+0:19                2 (const int)
+0:19            Constant:
+0:19              0.800000
+0:21      Test condition and select ( temp void)
+0:21        Condition
+0:21        Compare Equal ( temp bool)
+0:21          direct index ( temp float)
+0:21            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:21            Constant:
+0:21              1 (const int)
+0:21          trunc ( global float)
+0:21            direct index ( temp float)
+0:21              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:21              Constant:
+0:21                1 (const int)
+0:21        true case
+0:22        Sequence
+0:22          move second child to first child ( temp float)
+0:22            direct index ( temp float)
+0:22              'myColor' (layout( location=0) out 4-component vector of float)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              0.800000
+0:24      Test condition and select ( temp void)
+0:24        Condition
+0:24        Compare Equal ( temp bool)
+0:24          direct index ( temp float)
+0:24            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:24            Constant:
+0:24              0 (const int)
+0:24          trunc ( global float)
+0:24            direct index ( temp float)
+0:24              'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:24              Constant:
+0:24                0 (const int)
+0:24        true case
+0:25        Sequence
+0:25          move second child to first child ( temp float)
+0:25            direct index ( temp float)
+0:25              'myColor' (layout( location=0) out 4-component vector of float)
+0:25              Constant:
+0:25                0 (const int)
+0:25            Constant:
+0:25              0.800000
+0:28      Sequence
+0:28        move second child to first child ( temp 4-component vector of float)
+0:28          'diff' ( temp 4-component vector of float)
+0:28          subtract ( temp 4-component vector of float)
+0:28            'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:28            'i' ( smooth in 4-component vector of float)
+0:29      Test condition and select ( temp void)
+0:29        Condition
+0:29        Compare Greater Than ( temp bool)
+0:29          Absolute value ( global float)
+0:29            direct index ( temp float)
+0:29              'diff' ( temp 4-component vector of float)
+0:29              Constant:
+0:29                2 (const int)
+0:29          Constant:
+0:29            0.001000
+0:29        true case
+0:29        move second child to first child ( temp float)
+0:29          direct index ( temp float)
+0:29            'myColor' (layout( location=0) out 4-component vector of float)
+0:29            Constant:
+0:29              2 (const int)
+0:29          Constant:
+0:29            0.500000
+0:30      Test condition and select ( temp void)
+0:30        Condition
+0:30        Compare Greater Than ( temp bool)
+0:30          Absolute value ( global float)
+0:30            direct index ( temp float)
+0:30              'diff' ( temp 4-component vector of float)
+0:30              Constant:
+0:30                3 (const int)
+0:30          Constant:
+0:30            0.001000
+0:30        true case
+0:30        move second child to first child ( temp float)
+0:30          direct index ( temp float)
+0:30            'myColor' (layout( location=0) out 4-component vector of float)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0.500000
+0:?   Linker Objects
+0:?     'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
+0:?     'myGlobalVar' ( global float)
+0:?     'i' ( smooth in 4-component vector of float)
+0:?     'myColor' (layout( location=0) out 4-component vector of float)
+0:?     'eps' ( const float)
+0:?       0.001000
+
diff --git a/Test/baseResults/glsl.versionOverride.comp.out b/Test/baseResults/glsl.versionOverride.comp.out
new file mode 100644
index 0000000..591ce4d
--- /dev/null
+++ b/Test/baseResults/glsl.versionOverride.comp.out
@@ -0,0 +1 @@
+glsl.versionOverride.comp
diff --git a/Test/baseResults/glsl.versionOverride.frag.out b/Test/baseResults/glsl.versionOverride.frag.out
new file mode 100644
index 0000000..b759a47
--- /dev/null
+++ b/Test/baseResults/glsl.versionOverride.frag.out
@@ -0,0 +1 @@
+glsl.versionOverride.frag
diff --git a/Test/baseResults/glsl.versionOverride.geom.out b/Test/baseResults/glsl.versionOverride.geom.out
new file mode 100644
index 0000000..758d9d4
--- /dev/null
+++ b/Test/baseResults/glsl.versionOverride.geom.out
@@ -0,0 +1 @@
+glsl.versionOverride.geom
diff --git a/Test/baseResults/glsl.versionOverride.tesc.out b/Test/baseResults/glsl.versionOverride.tesc.out
new file mode 100644
index 0000000..4aedf0d
--- /dev/null
+++ b/Test/baseResults/glsl.versionOverride.tesc.out
@@ -0,0 +1 @@
+glsl.versionOverride.tesc
diff --git a/Test/baseResults/glsl.versionOverride.tese.out b/Test/baseResults/glsl.versionOverride.tese.out
new file mode 100644
index 0000000..c3632e8
--- /dev/null
+++ b/Test/baseResults/glsl.versionOverride.tese.out
@@ -0,0 +1 @@
+glsl.versionOverride.tese
diff --git a/Test/baseResults/glsl.versionOverride.vert.out b/Test/baseResults/glsl.versionOverride.vert.out
new file mode 100644
index 0000000..d42dc3d
--- /dev/null
+++ b/Test/baseResults/glsl.versionOverride.vert.out
@@ -0,0 +1 @@
+glsl.versionOverride.vert
diff --git a/Test/baseResults/hlsl.namespace.frag.out b/Test/baseResults/hlsl.namespace.frag.out
index 5346c44..e224eb9 100644
--- a/Test/baseResults/hlsl.namespace.frag.out
+++ b/Test/baseResults/hlsl.namespace.frag.out
@@ -17,9 +17,8 @@
 0:?     Sequence
 0:12      Branch: Return with expression
 0:12        'v2' ( global 4-component vector of float)
-0:15  Function Definition: N2::N3::C1::getVec( ( temp 4-component vector of float)
+0:15  Function Definition: N2::N3::C1::getVec( ( global 4-component vector of float)
 0:15    Function Parameters: 
-0:15      '@this' ( temp structure{})
 0:?     Sequence
 0:15      Branch: Return with expression
 0:15        'v2' ( global 4-component vector of float)
@@ -34,7 +33,7 @@
 0:22              Function Call: N2::getVec( ( temp 4-component vector of float)
 0:22            Function Call: N2::N3::getVec( ( temp 4-component vector of float)
 0:22          vector-scale ( temp 4-component vector of float)
-0:22            Function Call: N2::N3::C1::getVec( ( temp 4-component vector of float)
+0:22            Function Call: N2::N3::C1::getVec( ( global 4-component vector of float)
 0:22            'N2::gf' ( global float)
 0:21  Function Definition: main( ( temp void)
 0:21    Function Parameters: 
@@ -70,9 +69,8 @@
 0:?     Sequence
 0:12      Branch: Return with expression
 0:12        'v2' ( global 4-component vector of float)
-0:15  Function Definition: N2::N3::C1::getVec( ( temp 4-component vector of float)
+0:15  Function Definition: N2::N3::C1::getVec( ( global 4-component vector of float)
 0:15    Function Parameters: 
-0:15      '@this' ( temp structure{})
 0:?     Sequence
 0:15      Branch: Return with expression
 0:15        'v2' ( global 4-component vector of float)
@@ -87,7 +85,7 @@
 0:22              Function Call: N2::getVec( ( temp 4-component vector of float)
 0:22            Function Call: N2::N3::getVec( ( temp 4-component vector of float)
 0:22          vector-scale ( temp 4-component vector of float)
-0:22            Function Call: N2::N3::C1::getVec( ( temp 4-component vector of float)
+0:22            Function Call: N2::N3::C1::getVec( ( global 4-component vector of float)
 0:22            'N2::gf' ( global float)
 0:21  Function Definition: main( ( temp void)
 0:21    Function Parameters: 
@@ -101,82 +99,75 @@
 0:?     'N2::gf' ( global float)
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 54
+// Id's are bound by 50
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 52
+                              EntryPoint Fragment 4  "main" 48
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "N1::getVec("
                               Name 11  "N2::getVec("
                               Name 13  "N2::N3::getVec("
-                              Name 15  "C1"
-                              Name 19  "N2::N3::C1::getVec("
-                              Name 18  "@this"
-                              Name 21  "@main("
-                              Name 24  "v1"
-                              Name 28  "v2"
-                              Name 45  "N2::gf"
-                              Name 52  "@entryPointOutput"
-                              Decorate 52(@entryPointOutput) Location 0
+                              Name 15  "N2::N3::C1::getVec("
+                              Name 17  "@main("
+                              Name 20  "v1"
+                              Name 24  "v2"
+                              Name 41  "N2::gf"
+                              Name 48  "@entryPointOutput"
+                              Decorate 48(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
                8:             TypeFunction 7(fvec4)
-          15(C1):             TypeStruct
-              16:             TypePointer Function 15(C1)
-              17:             TypeFunction 7(fvec4) 16(ptr)
-              23:             TypePointer Private 7(fvec4)
-          24(v1):     23(ptr) Variable Private
-          28(v2):     23(ptr) Variable Private
-              44:             TypePointer Private 6(float)
-      45(N2::gf):     44(ptr) Variable Private
-              51:             TypePointer Output 7(fvec4)
-52(@entryPointOutput):     51(ptr) Variable Output
+              19:             TypePointer Private 7(fvec4)
+          20(v1):     19(ptr) Variable Private
+          24(v2):     19(ptr) Variable Private
+              40:             TypePointer Private 6(float)
+      41(N2::gf):     40(ptr) Variable Private
+              47:             TypePointer Output 7(fvec4)
+48(@entryPointOutput):     47(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              53:    7(fvec4) FunctionCall 21(@main()
-                              Store 52(@entryPointOutput) 53
+              49:    7(fvec4) FunctionCall 17(@main()
+                              Store 48(@entryPointOutput) 49
                               Return
                               FunctionEnd
   9(N1::getVec():    7(fvec4) Function None 8
               10:             Label
-              25:    7(fvec4) Load 24(v1)
-                              ReturnValue 25
+              21:    7(fvec4) Load 20(v1)
+                              ReturnValue 21
                               FunctionEnd
  11(N2::getVec():    7(fvec4) Function None 8
               12:             Label
-              29:    7(fvec4) Load 28(v2)
-                              ReturnValue 29
+              25:    7(fvec4) Load 24(v2)
+                              ReturnValue 25
                               FunctionEnd
 13(N2::N3::getVec():    7(fvec4) Function None 8
               14:             Label
-              32:    7(fvec4) Load 28(v2)
-                              ReturnValue 32
+              28:    7(fvec4) Load 24(v2)
+                              ReturnValue 28
                               FunctionEnd
-19(N2::N3::C1::getVec():    7(fvec4) Function None 17
-       18(@this):     16(ptr) FunctionParameter
-              20:             Label
-              35:    7(fvec4) Load 28(v2)
-                              ReturnValue 35
+15(N2::N3::C1::getVec():    7(fvec4) Function None 8
+              16:             Label
+              31:    7(fvec4) Load 24(v2)
+                              ReturnValue 31
                               FunctionEnd
-      21(@main():    7(fvec4) Function None 8
-              22:             Label
-              38:    7(fvec4) FunctionCall 9(N1::getVec()
-              39:    7(fvec4) FunctionCall 11(N2::getVec()
-              40:    7(fvec4) FAdd 38 39
-              41:    7(fvec4) FunctionCall 13(N2::N3::getVec()
-              42:    7(fvec4) FAdd 40 41
-              43:    7(fvec4) FunctionCall 19(N2::N3::C1::getVec()
-              46:    6(float) Load 45(N2::gf)
-              47:    7(fvec4) VectorTimesScalar 43 46
-              48:    7(fvec4) FAdd 42 47
-                              ReturnValue 48
+      17(@main():    7(fvec4) Function None 8
+              18:             Label
+              34:    7(fvec4) FunctionCall 9(N1::getVec()
+              35:    7(fvec4) FunctionCall 11(N2::getVec()
+              36:    7(fvec4) FAdd 34 35
+              37:    7(fvec4) FunctionCall 13(N2::N3::getVec()
+              38:    7(fvec4) FAdd 36 37
+              39:    7(fvec4) FunctionCall 15(N2::N3::C1::getVec()
+              42:    6(float) Load 41(N2::gf)
+              43:    7(fvec4) VectorTimesScalar 39 42
+              44:    7(fvec4) FAdd 38 43
+                              ReturnValue 44
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.spv.1.6.discard.frag.out b/Test/baseResults/hlsl.spv.1.6.discard.frag.out
new file mode 100644
index 0000000..d521914
--- /dev/null
+++ b/Test/baseResults/hlsl.spv.1.6.discard.frag.out
@@ -0,0 +1,195 @@
+hlsl.spv.1.6.discard.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: foo(f1; ( temp void)
+0:2    Function Parameters: 
+0:2      'f' ( in float)
+0:?     Sequence
+0:3      Test condition and select ( temp void)
+0:3        Condition
+0:3        Compare Less Than ( temp bool)
+0:3          'f' ( in float)
+0:3          Constant:
+0:3            1.000000
+0:3        true case
+0:4        Branch: Kill
+0:8  Function Definition: @PixelShaderFunction(vf4; ( temp void)
+0:8    Function Parameters: 
+0:8      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:9      Function Call: foo(f1; ( temp void)
+0:9        direct index ( temp float)
+0:9          'input' ( in 4-component vector of float)
+0:9          Constant:
+0:9            2 (const int)
+0:10      Test condition and select ( temp void)
+0:10        Condition
+0:10        Convert float to bool ( temp bool)
+0:10          direct index ( temp float)
+0:10            'input' ( in 4-component vector of float)
+0:10            Constant:
+0:10              0 (const int)
+0:10        true case
+0:11        Branch: Kill
+0:12      Sequence
+0:12        move second child to first child ( temp float)
+0:12          'f' ( temp float)
+0:12          direct index ( temp float)
+0:12            'input' ( in 4-component vector of float)
+0:12            Constant:
+0:12              0 (const int)
+0:13      Branch: Kill
+0:8  Function Definition: PixelShaderFunction( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         'input' ( temp 4-component vector of float)
+0:?         'input' (layout( location=0) in 4-component vector of float)
+0:8      Function Call: @PixelShaderFunction(vf4; ( temp void)
+0:?         'input' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'input' (layout( location=0) in 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: foo(f1; ( temp void)
+0:2    Function Parameters: 
+0:2      'f' ( in float)
+0:?     Sequence
+0:3      Test condition and select ( temp void)
+0:3        Condition
+0:3        Compare Less Than ( temp bool)
+0:3          'f' ( in float)
+0:3          Constant:
+0:3            1.000000
+0:3        true case
+0:4        Branch: Kill
+0:8  Function Definition: @PixelShaderFunction(vf4; ( temp void)
+0:8    Function Parameters: 
+0:8      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:9      Function Call: foo(f1; ( temp void)
+0:9        direct index ( temp float)
+0:9          'input' ( in 4-component vector of float)
+0:9          Constant:
+0:9            2 (const int)
+0:10      Test condition and select ( temp void)
+0:10        Condition
+0:10        Convert float to bool ( temp bool)
+0:10          direct index ( temp float)
+0:10            'input' ( in 4-component vector of float)
+0:10            Constant:
+0:10              0 (const int)
+0:10        true case
+0:11        Branch: Kill
+0:12      Sequence
+0:12        move second child to first child ( temp float)
+0:12          'f' ( temp float)
+0:12          direct index ( temp float)
+0:12            'input' ( in 4-component vector of float)
+0:12            Constant:
+0:12              0 (const int)
+0:13      Branch: Kill
+0:8  Function Definition: PixelShaderFunction( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         'input' ( temp 4-component vector of float)
+0:?         'input' (layout( location=0) in 4-component vector of float)
+0:8      Function Call: @PixelShaderFunction(vf4; ( temp void)
+0:?         'input' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'input' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10600
+// Generated by (magic number): 8000a
+// Id's are bound by 47
+
+                              Capability Shader
+                              Capability DemoteToHelperInvocationEXT
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 42
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "PixelShaderFunction"
+                              Name 10  "foo(f1;"
+                              Name 9  "f"
+                              Name 16  "@PixelShaderFunction(vf4;"
+                              Name 15  "input"
+                              Name 24  "param"
+                              Name 37  "f"
+                              Name 40  "input"
+                              Name 42  "input"
+                              Name 44  "param"
+                              Decorate 42(input) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               8:             TypeFunction 2 7(ptr)
+              12:             TypeVector 6(float) 4
+              13:             TypePointer Function 12(fvec4)
+              14:             TypeFunction 2 13(ptr)
+              19:    6(float) Constant 1065353216
+              20:             TypeBool
+              25:             TypeInt 32 0
+              26:     25(int) Constant 2
+              30:     25(int) Constant 0
+              33:    6(float) Constant 0
+              41:             TypePointer Input 12(fvec4)
+       42(input):     41(ptr) Variable Input
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+       40(input):     13(ptr) Variable Function
+       44(param):     13(ptr) Variable Function
+              43:   12(fvec4) Load 42(input)
+                              Store 40(input) 43
+              45:   12(fvec4) Load 40(input)
+                              Store 44(param) 45
+              46:           2 FunctionCall 16(@PixelShaderFunction(vf4;) 44(param)
+                              Return
+                              FunctionEnd
+     10(foo(f1;):           2 Function None 8
+            9(f):      7(ptr) FunctionParameter
+              11:             Label
+              18:    6(float) Load 9(f)
+              21:    20(bool) FOrdLessThan 18 19
+                              SelectionMerge 23 None
+                              BranchConditional 21 22 23
+              22:               Label
+                                DemoteToHelperInvocationEXT
+                                Branch 23
+              23:             Label
+                              Return
+                              FunctionEnd
+16(@PixelShaderFunction(vf4;):           2 Function None 14
+       15(input):     13(ptr) FunctionParameter
+              17:             Label
+       24(param):      7(ptr) Variable Function
+           37(f):      7(ptr) Variable Function
+              27:      7(ptr) AccessChain 15(input) 26
+              28:    6(float) Load 27
+                              Store 24(param) 28
+              29:           2 FunctionCall 10(foo(f1;) 24(param)
+              31:      7(ptr) AccessChain 15(input) 30
+              32:    6(float) Load 31
+              34:    20(bool) FUnordNotEqual 32 33
+                              SelectionMerge 36 None
+                              BranchConditional 34 35 36
+              35:               Label
+                                DemoteToHelperInvocationEXT
+                                Branch 36
+              36:             Label
+              38:      7(ptr) AccessChain 15(input) 30
+              39:    6(float) Load 38
+                              Store 37(f) 39
+                              DemoteToHelperInvocationEXT
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.rwbyte2.comp.out b/Test/baseResults/hlsl.structbuffer.rwbyte2.comp.out
new file mode 100644
index 0000000..127d52c
--- /dev/null
+++ b/Test/baseResults/hlsl.structbuffer.rwbyte2.comp.out
@@ -0,0 +1,140 @@
+hlsl.structbuffer.rwbyte2.comp
+Shader version: 500
+local_size = (1, 1, 1)
+0:? Sequence
+0:6  Function Definition: @main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp uint)
+0:7          'f' ( temp uint)
+0:7          indirect index (layout( row_major std430) buffer uint)
+0:7            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7              'g_bbuf' (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            right-shift ( temp int)
+0:7              Constant:
+0:7                16 (const int)
+0:7              Constant:
+0:7                2 (const int)
+0:8      move second child to first child ( temp uint)
+0:8        direct index (layout( row_major std430) buffer uint)
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:8            'g_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          Constant:
+0:8            0 (const int)
+0:8        'f' ( temp uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'g_sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     'g_bbuf' (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 = (1, 1, 1)
+0:? Sequence
+0:6  Function Definition: @main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp uint)
+0:7          'f' ( temp uint)
+0:7          indirect index (layout( row_major std430) buffer uint)
+0:7            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7              'g_bbuf' (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            right-shift ( temp int)
+0:7              Constant:
+0:7                16 (const int)
+0:7              Constant:
+0:7                2 (const int)
+0:8      move second child to first child ( temp uint)
+0:8        direct index (layout( row_major std430) buffer uint)
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:8            'g_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          Constant:
+0:8            0 (const int)
+0:8        'f' ( temp uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'g_sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     'g_bbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 30
+
+                              Capability Shader
+               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 10  "f"
+                              Name 12  "g_bbuf"
+                              MemberName 12(g_bbuf) 0  "@data"
+                              Name 14  "g_bbuf"
+                              Name 24  "g_sbuf"
+                              MemberName 24(g_sbuf) 0  "@data"
+                              Name 26  "g_sbuf"
+                              Decorate 11 ArrayStride 4
+                              MemberDecorate 12(g_bbuf) 0 Offset 0
+                              Decorate 12(g_bbuf) BufferBlock
+                              Decorate 14(g_bbuf) DescriptorSet 0
+                              Decorate 14(g_bbuf) Binding 1
+                              Decorate 23 ArrayStride 4
+                              MemberDecorate 24(g_sbuf) 0 Offset 0
+                              Decorate 24(g_sbuf) BufferBlock
+                              Decorate 26(g_sbuf) DescriptorSet 0
+                              Decorate 26(g_sbuf) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               8:             TypeInt 32 0
+               9:             TypePointer Function 8(int)
+              11:             TypeRuntimeArray 8(int)
+      12(g_bbuf):             TypeStruct 11
+              13:             TypePointer Uniform 12(g_bbuf)
+      14(g_bbuf):     13(ptr) Variable Uniform
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:     15(int) Constant 16
+              18:     15(int) Constant 2
+              20:             TypePointer Uniform 8(int)
+              23:             TypeRuntimeArray 8(int)
+      24(g_sbuf):             TypeStruct 23
+              25:             TypePointer Uniform 24(g_sbuf)
+      26(g_sbuf):     25(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+              29:           2 FunctionCall 6(@main()
+                              Return
+                              FunctionEnd
+       6(@main():           2 Function None 3
+               7:             Label
+           10(f):      9(ptr) Variable Function
+              19:     15(int) ShiftRightArithmetic 17 18
+              21:     20(ptr) AccessChain 14(g_bbuf) 16 19
+              22:      8(int) Load 21
+                              Store 10(f) 22
+              27:      8(int) Load 10(f)
+              28:     20(ptr) AccessChain 26(g_sbuf) 16 16
+                              Store 28 27
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.w-recip.frag.out b/Test/baseResults/hlsl.w-recip.frag.out
new file mode 100644
index 0000000..b72f361
--- /dev/null
+++ b/Test/baseResults/hlsl.w-recip.frag.out
@@ -0,0 +1,268 @@
+hlsl.w-recip.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'vpos' ( in 4-component vector of float)
+0:?     Sequence
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of float)
+0:6          'vpos_t' ( temp 4-component vector of float)
+0:6          Construct vec4 ( temp 4-component vector of float)
+0:6            vector swizzle ( temp 3-component vector of float)
+0:6              'vpos' ( in 4-component vector of float)
+0:6              Sequence
+0:6                Constant:
+0:6                  0 (const int)
+0:6                Constant:
+0:6                  1 (const int)
+0:6                Constant:
+0:6                  2 (const int)
+0:6            divide ( temp float)
+0:6              Constant:
+0:6                1.000000
+0:6              direct index ( temp float)
+0:6                'vpos' ( in 4-component vector of float)
+0:6                Constant:
+0:6                  3 (const int)
+0:7      Test condition and select ( temp void)
+0:7        Condition
+0:7        Compare Less Than ( temp bool)
+0:7          direct index ( temp float)
+0:7            'vpos_t' ( temp 4-component vector of float)
+0:7            Constant:
+0:7              0 (const int)
+0:7          Constant:
+0:7            400.000000
+0:7        true case
+0:8        Branch: Return with expression
+0:8          AmbientColor: direct index for structure ( uniform 4-component vector of float)
+0:8            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:8            Constant:
+0:8              0 (const uint)
+0:7        false case
+0:10        Branch: Return with expression
+0:10          AmbientColor2: direct index for structure ( uniform 4-component vector of float)
+0:10            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:10            Constant:
+0:10              1 (const uint)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         'vpos' ( temp 4-component vector of float)
+0:5        Construct vec4 ( temp 4-component vector of float)
+0:5          vector swizzle ( temp 3-component vector of float)
+0:?             'vpos' ( in 4-component vector of float FragCoord)
+0:5            Sequence
+0:5              Constant:
+0:5                0 (const int)
+0:5              Constant:
+0:5                1 (const int)
+0:5              Constant:
+0:5                2 (const int)
+0:5          divide ( temp float)
+0:5            Constant:
+0:5              1.000000
+0:5            direct index ( temp float)
+0:?               'vpos' ( in 4-component vector of float FragCoord)
+0:5              Constant:
+0:5                3 (const int)
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:5        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'vpos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'vpos' ( in 4-component vector of float FragCoord)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'vpos' ( in 4-component vector of float)
+0:?     Sequence
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of float)
+0:6          'vpos_t' ( temp 4-component vector of float)
+0:6          Construct vec4 ( temp 4-component vector of float)
+0:6            vector swizzle ( temp 3-component vector of float)
+0:6              'vpos' ( in 4-component vector of float)
+0:6              Sequence
+0:6                Constant:
+0:6                  0 (const int)
+0:6                Constant:
+0:6                  1 (const int)
+0:6                Constant:
+0:6                  2 (const int)
+0:6            divide ( temp float)
+0:6              Constant:
+0:6                1.000000
+0:6              direct index ( temp float)
+0:6                'vpos' ( in 4-component vector of float)
+0:6                Constant:
+0:6                  3 (const int)
+0:7      Test condition and select ( temp void)
+0:7        Condition
+0:7        Compare Less Than ( temp bool)
+0:7          direct index ( temp float)
+0:7            'vpos_t' ( temp 4-component vector of float)
+0:7            Constant:
+0:7              0 (const int)
+0:7          Constant:
+0:7            400.000000
+0:7        true case
+0:8        Branch: Return with expression
+0:8          AmbientColor: direct index for structure ( uniform 4-component vector of float)
+0:8            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:8            Constant:
+0:8              0 (const uint)
+0:7        false case
+0:10        Branch: Return with expression
+0:10          AmbientColor2: direct index for structure ( uniform 4-component vector of float)
+0:10            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:10            Constant:
+0:10              1 (const uint)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         'vpos' ( temp 4-component vector of float)
+0:5        Construct vec4 ( temp 4-component vector of float)
+0:5          vector swizzle ( temp 3-component vector of float)
+0:?             'vpos' ( in 4-component vector of float FragCoord)
+0:5            Sequence
+0:5              Constant:
+0:5                0 (const int)
+0:5              Constant:
+0:5                1 (const int)
+0:5              Constant:
+0:5                2 (const int)
+0:5          divide ( temp float)
+0:5            Constant:
+0:5              1.000000
+0:5            direct index ( temp float)
+0:?               'vpos' ( in 4-component vector of float FragCoord)
+0:5              Constant:
+0:5                3 (const int)
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:5        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'vpos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'vpos' ( in 4-component vector of float FragCoord)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 69
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 53 65
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "vpos"
+                              Name 13  "vpos_t"
+                              Name 36  "$Global"
+                              MemberName 36($Global) 0  "AmbientColor"
+                              MemberName 36($Global) 1  "AmbientColor2"
+                              Name 38  ""
+                              Name 51  "vpos"
+                              Name 53  "vpos"
+                              Name 65  "@entryPointOutput"
+                              Name 66  "param"
+                              MemberDecorate 36($Global) 0 Offset 0
+                              MemberDecorate 36($Global) 1 Offset 16
+                              Decorate 36($Global) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 53(vpos) BuiltIn FragCoord
+                              Decorate 65(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              14:             TypeVector 6(float) 3
+              17:    6(float) Constant 1065353216
+              18:             TypeInt 32 0
+              19:     18(int) Constant 3
+              20:             TypePointer Function 6(float)
+              28:     18(int) Constant 0
+              31:    6(float) Constant 1137180672
+              32:             TypeBool
+     36($Global):             TypeStruct 7(fvec4) 7(fvec4)
+              37:             TypePointer Uniform 36($Global)
+              38:     37(ptr) Variable Uniform
+              39:             TypeInt 32 1
+              40:     39(int) Constant 0
+              41:             TypePointer Uniform 7(fvec4)
+              46:     39(int) Constant 1
+              52:             TypePointer Input 7(fvec4)
+        53(vpos):     52(ptr) Variable Input
+              56:             TypePointer Input 6(float)
+              64:             TypePointer Output 7(fvec4)
+65(@entryPointOutput):     64(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+        51(vpos):      8(ptr) Variable Function
+       66(param):      8(ptr) Variable Function
+              54:    7(fvec4) Load 53(vpos)
+              55:   14(fvec3) VectorShuffle 54 54 0 1 2
+              57:     56(ptr) AccessChain 53(vpos) 19
+              58:    6(float) Load 57
+              59:    6(float) FDiv 17 58
+              60:    6(float) CompositeExtract 55 0
+              61:    6(float) CompositeExtract 55 1
+              62:    6(float) CompositeExtract 55 2
+              63:    7(fvec4) CompositeConstruct 60 61 62 59
+                              Store 51(vpos) 63
+              67:    7(fvec4) Load 51(vpos)
+                              Store 66(param) 67
+              68:    7(fvec4) FunctionCall 11(@main(vf4;) 66(param)
+                              Store 65(@entryPointOutput) 68
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+        10(vpos):      8(ptr) FunctionParameter
+              12:             Label
+      13(vpos_t):      8(ptr) Variable Function
+              15:    7(fvec4) Load 10(vpos)
+              16:   14(fvec3) VectorShuffle 15 15 0 1 2
+              21:     20(ptr) AccessChain 10(vpos) 19
+              22:    6(float) Load 21
+              23:    6(float) FDiv 17 22
+              24:    6(float) CompositeExtract 16 0
+              25:    6(float) CompositeExtract 16 1
+              26:    6(float) CompositeExtract 16 2
+              27:    7(fvec4) CompositeConstruct 24 25 26 23
+                              Store 13(vpos_t) 27
+              29:     20(ptr) AccessChain 13(vpos_t) 28
+              30:    6(float) Load 29
+              33:    32(bool) FOrdLessThan 30 31
+                              SelectionMerge 35 None
+                              BranchConditional 33 34 45
+              34:               Label
+              42:     41(ptr)   AccessChain 38 40
+              43:    7(fvec4)   Load 42
+                                ReturnValue 43
+              45:               Label
+              47:     41(ptr)   AccessChain 38 46
+              48:    7(fvec4)   Load 47
+                                ReturnValue 48
+              35:             Label
+                              Unreachable
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.w-recip2.frag.out b/Test/baseResults/hlsl.w-recip2.frag.out
new file mode 100644
index 0000000..6fee15c
--- /dev/null
+++ b/Test/baseResults/hlsl.w-recip2.frag.out
@@ -0,0 +1,305 @@
+hlsl.w-recip2.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:13  Function Definition: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float)
+0:13    Function Parameters: 
+0:13      'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:?     Sequence
+0:14      Test condition and select ( temp void)
+0:14        Condition
+0:14        Compare Less Than ( temp bool)
+0:14          direct index ( temp float)
+0:14            PositionPS: direct index for structure ( temp 4-component vector of float)
+0:14              'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:14              Constant:
+0:14                0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            400.000000
+0:14        true case
+0:15        Branch: Return with expression
+0:15          AmbientColor: direct index for structure ( uniform 4-component vector of float)
+0:15            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:15            Constant:
+0:15              0 (const uint)
+0:14        false case
+0:17        Branch: Return with expression
+0:17          AmbientColor2: direct index for structure ( uniform 4-component vector of float)
+0:17            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:17            Constant:
+0:17              1 (const uint)
+0:13  Function Definition: main( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      Sequence
+0:13        Sequence
+0:13          move second child to first child ( temp 4-component vector of float)
+0:13            '@fragcoord' ( temp 4-component vector of float)
+0:?             'VSOut.PositionPS' ( in 4-component vector of float FragCoord)
+0:13          move second child to first child ( temp float)
+0:13            direct index ( in float FragCoord)
+0:13              '@fragcoord' ( temp 4-component vector of float)
+0:13              Constant:
+0:13                3 (const int)
+0:13            divide ( temp float)
+0:13              Constant:
+0:13                1.000000
+0:13              direct index ( in float FragCoord)
+0:13                '@fragcoord' ( temp 4-component vector of float)
+0:13                Constant:
+0:13                  3 (const int)
+0:13          move second child to first child ( temp 4-component vector of float)
+0:13            PositionPS: direct index for structure ( temp 4-component vector of float)
+0:?               'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13              Constant:
+0:13                0 (const int)
+0:13            '@fragcoord' ( temp 4-component vector of float)
+0:13        move second child to first child ( temp 3-component vector of float)
+0:13          PosInLightViewSpace: direct index for structure ( temp 3-component vector of float)
+0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13            Constant:
+0:13              1 (const int)
+0:?           'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float)
+0:13        move second child to first child ( temp 3-component vector of float)
+0:13          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13            Constant:
+0:13              2 (const int)
+0:?           'VSOut.NormalWS' (layout( location=1) in 3-component vector of float)
+0:13        move second child to first child ( temp 2-component vector of float)
+0:13          TexCoord: direct index for structure ( temp 2-component vector of float)
+0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13            Constant:
+0:13              3 (const int)
+0:?           'VSOut.TexCoord' (layout( location=2) in 2-component vector of float)
+0:13      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:13        Function Call: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float)
+0:?           'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'VSOut.PositionPS' ( in 4-component vector of float FragCoord)
+0:?     'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float)
+0:?     'VSOut.NormalWS' (layout( location=1) in 3-component vector of float)
+0:?     'VSOut.TexCoord' (layout( location=2) in 2-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:13  Function Definition: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float)
+0:13    Function Parameters: 
+0:13      'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:?     Sequence
+0:14      Test condition and select ( temp void)
+0:14        Condition
+0:14        Compare Less Than ( temp bool)
+0:14          direct index ( temp float)
+0:14            PositionPS: direct index for structure ( temp 4-component vector of float)
+0:14              'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:14              Constant:
+0:14                0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            400.000000
+0:14        true case
+0:15        Branch: Return with expression
+0:15          AmbientColor: direct index for structure ( uniform 4-component vector of float)
+0:15            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:15            Constant:
+0:15              0 (const uint)
+0:14        false case
+0:17        Branch: Return with expression
+0:17          AmbientColor2: direct index for structure ( uniform 4-component vector of float)
+0:17            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:17            Constant:
+0:17              1 (const uint)
+0:13  Function Definition: main( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      Sequence
+0:13        Sequence
+0:13          move second child to first child ( temp 4-component vector of float)
+0:13            '@fragcoord' ( temp 4-component vector of float)
+0:?             'VSOut.PositionPS' ( in 4-component vector of float FragCoord)
+0:13          move second child to first child ( temp float)
+0:13            direct index ( in float FragCoord)
+0:13              '@fragcoord' ( temp 4-component vector of float)
+0:13              Constant:
+0:13                3 (const int)
+0:13            divide ( temp float)
+0:13              Constant:
+0:13                1.000000
+0:13              direct index ( in float FragCoord)
+0:13                '@fragcoord' ( temp 4-component vector of float)
+0:13                Constant:
+0:13                  3 (const int)
+0:13          move second child to first child ( temp 4-component vector of float)
+0:13            PositionPS: direct index for structure ( temp 4-component vector of float)
+0:?               'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13              Constant:
+0:13                0 (const int)
+0:13            '@fragcoord' ( temp 4-component vector of float)
+0:13        move second child to first child ( temp 3-component vector of float)
+0:13          PosInLightViewSpace: direct index for structure ( temp 3-component vector of float)
+0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13            Constant:
+0:13              1 (const int)
+0:?           'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float)
+0:13        move second child to first child ( temp 3-component vector of float)
+0:13          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13            Constant:
+0:13              2 (const int)
+0:?           'VSOut.NormalWS' (layout( location=1) in 3-component vector of float)
+0:13        move second child to first child ( temp 2-component vector of float)
+0:13          TexCoord: direct index for structure ( temp 2-component vector of float)
+0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:13            Constant:
+0:13              3 (const int)
+0:?           'VSOut.TexCoord' (layout( location=2) in 2-component vector of float)
+0:13      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:13        Function Call: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float)
+0:?           'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord})
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'VSOut.PositionPS' ( in 4-component vector of float FragCoord)
+0:?     'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float)
+0:?     'VSOut.NormalWS' (layout( location=1) in 3-component vector of float)
+0:?     'VSOut.TexCoord' (layout( location=2) in 2-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 75
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 44 56 61 66 71
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 10  "VSOutput"
+                              MemberName 10(VSOutput) 0  "PositionPS"
+                              MemberName 10(VSOutput) 1  "PosInLightViewSpace"
+                              MemberName 10(VSOutput) 2  "NormalWS"
+                              MemberName 10(VSOutput) 3  "TexCoord"
+                              Name 14  "@main(struct-VSOutput-vf4-vf3-vf3-vf21;"
+                              Name 13  "VSOut"
+                              Name 28  "$Global"
+                              MemberName 28($Global) 0  "AmbientColor"
+                              MemberName 28($Global) 1  "AmbientColor2"
+                              Name 30  ""
+                              Name 42  "@fragcoord"
+                              Name 44  "VSOut.PositionPS"
+                              Name 52  "VSOut"
+                              Name 56  "VSOut.PosInLightViewSpace"
+                              Name 61  "VSOut.NormalWS"
+                              Name 66  "VSOut.TexCoord"
+                              Name 71  "@entryPointOutput"
+                              Name 72  "param"
+                              MemberDecorate 28($Global) 0 Offset 0
+                              MemberDecorate 28($Global) 1 Offset 16
+                              Decorate 28($Global) Block
+                              Decorate 30 DescriptorSet 0
+                              Decorate 30 Binding 0
+                              Decorate 44(VSOut.PositionPS) BuiltIn FragCoord
+                              Decorate 56(VSOut.PosInLightViewSpace) Location 0
+                              Decorate 61(VSOut.NormalWS) Location 1
+                              Decorate 66(VSOut.TexCoord) Location 2
+                              Decorate 71(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+               9:             TypeVector 6(float) 2
+    10(VSOutput):             TypeStruct 7(fvec4) 8(fvec3) 8(fvec3) 9(fvec2)
+              11:             TypePointer Function 10(VSOutput)
+              12:             TypeFunction 7(fvec4) 11(ptr)
+              16:             TypeInt 32 1
+              17:     16(int) Constant 0
+              18:             TypeInt 32 0
+              19:     18(int) Constant 0
+              20:             TypePointer Function 6(float)
+              23:    6(float) Constant 1137180672
+              24:             TypeBool
+     28($Global):             TypeStruct 7(fvec4) 7(fvec4)
+              29:             TypePointer Uniform 28($Global)
+              30:     29(ptr) Variable Uniform
+              31:             TypePointer Uniform 7(fvec4)
+              36:     16(int) Constant 1
+              41:             TypePointer Function 7(fvec4)
+              43:             TypePointer Input 7(fvec4)
+44(VSOut.PositionPS):     43(ptr) Variable Input
+              46:    6(float) Constant 1065353216
+              47:     18(int) Constant 3
+              55:             TypePointer Input 8(fvec3)
+56(VSOut.PosInLightViewSpace):     55(ptr) Variable Input
+              58:             TypePointer Function 8(fvec3)
+              60:     16(int) Constant 2
+61(VSOut.NormalWS):     55(ptr) Variable Input
+              64:     16(int) Constant 3
+              65:             TypePointer Input 9(fvec2)
+66(VSOut.TexCoord):     65(ptr) Variable Input
+              68:             TypePointer Function 9(fvec2)
+              70:             TypePointer Output 7(fvec4)
+71(@entryPointOutput):     70(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+  42(@fragcoord):     41(ptr) Variable Function
+       52(VSOut):     11(ptr) Variable Function
+       72(param):     11(ptr) Variable Function
+              45:    7(fvec4) Load 44(VSOut.PositionPS)
+                              Store 42(@fragcoord) 45
+              48:     20(ptr) AccessChain 42(@fragcoord) 47
+              49:    6(float) Load 48
+              50:    6(float) FDiv 46 49
+              51:     20(ptr) AccessChain 42(@fragcoord) 47
+                              Store 51 50
+              53:    7(fvec4) Load 42(@fragcoord)
+              54:     41(ptr) AccessChain 52(VSOut) 17
+                              Store 54 53
+              57:    8(fvec3) Load 56(VSOut.PosInLightViewSpace)
+              59:     58(ptr) AccessChain 52(VSOut) 36
+                              Store 59 57
+              62:    8(fvec3) Load 61(VSOut.NormalWS)
+              63:     58(ptr) AccessChain 52(VSOut) 60
+                              Store 63 62
+              67:    9(fvec2) Load 66(VSOut.TexCoord)
+              69:     68(ptr) AccessChain 52(VSOut) 64
+                              Store 69 67
+              73:10(VSOutput) Load 52(VSOut)
+                              Store 72(param) 73
+              74:    7(fvec4) FunctionCall 14(@main(struct-VSOutput-vf4-vf3-vf3-vf21;) 72(param)
+                              Store 71(@entryPointOutput) 74
+                              Return
+                              FunctionEnd
+14(@main(struct-VSOutput-vf4-vf3-vf3-vf21;):    7(fvec4) Function None 12
+       13(VSOut):     11(ptr) FunctionParameter
+              15:             Label
+              21:     20(ptr) AccessChain 13(VSOut) 17 19
+              22:    6(float) Load 21
+              25:    24(bool) FOrdLessThan 22 23
+                              SelectionMerge 27 None
+                              BranchConditional 25 26 35
+              26:               Label
+              32:     31(ptr)   AccessChain 30 17
+              33:    7(fvec4)   Load 32
+                                ReturnValue 33
+              35:               Label
+              37:     31(ptr)   AccessChain 30 36
+              38:    7(fvec4)   Load 37
+                                ReturnValue 38
+              27:             Label
+                              Unreachable
+                              FunctionEnd
diff --git a/Test/baseResults/iomap.blockOutVariableIn.2.vert.out b/Test/baseResults/iomap.blockOutVariableIn.2.vert.out
new file mode 100644
index 0000000..0b4c0ac
--- /dev/null
+++ b/Test/baseResults/iomap.blockOutVariableIn.2.vert.out
@@ -0,0 +1,413 @@
+iomap.blockOutVariableIn.2.vert
+Shader version: 440
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      move second child to first child ( temp 4-component vector of float)
+0:11        a1: direct index for structure ( out 4-component vector of float)
+0:11          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:11          Constant:
+0:11            0 (const uint)
+0:11        Constant:
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:12      move second child to first child ( temp 2-component vector of float)
+0:12        a2: direct index for structure ( out 2-component vector of float)
+0:12          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:12          Constant:
+0:12            1 (const uint)
+0:12        Constant:
+0:12          0.500000
+0:12          0.500000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13          'anon@1' ( 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})
+0:13          Constant:
+0:13            0 (const uint)
+0:13        Constant:
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:?     'anon@1' ( 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})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+iomap.blockOutVariableIn.geom
+Shader version: 440
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = triangle_strip
+0:? Sequence
+0:12  Function Definition: main( ( global void)
+0:12    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:14        direct index (layout( location=0) temp 4-component vector of float)
+0:14          'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:14          Constant:
+0:14            0 (const int)
+0:15      move second child to first child ( temp 2-component vector of float)
+0:15        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:15        direct index (layout( location=1) temp 2-component vector of float)
+0:15          'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:15          Constant:
+0:15            0 (const int)
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:16          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:16          Constant:
+0:16            0 (const uint)
+0:16        Constant:
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:17      EmitVertex ( global void)
+0:19      move second child to first child ( temp 4-component vector of float)
+0:19        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:19        direct index (layout( location=0) temp 4-component vector of float)
+0:19          'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:19          Constant:
+0:19            1 (const int)
+0:20      move second child to first child ( temp 2-component vector of float)
+0:20        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:20        direct index (layout( location=1) temp 2-component vector of float)
+0:20          'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:20          Constant:
+0:20            1 (const int)
+0:21      move second child to first child ( temp 4-component vector of float)
+0:21        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:21          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:21          Constant:
+0:21            0 (const uint)
+0:21        Constant:
+0:21          1.000000
+0:21          1.000000
+0:21          1.000000
+0:21          1.000000
+0:22      EmitVertex ( global void)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:24        direct index (layout( location=0) temp 4-component vector of float)
+0:24          'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:24          Constant:
+0:24            2 (const int)
+0:25      move second child to first child ( temp 2-component vector of float)
+0:25        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:25        direct index (layout( location=1) temp 2-component vector of float)
+0:25          'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:25          Constant:
+0:25            2 (const int)
+0:26      move second child to first child ( temp 4-component vector of float)
+0:26        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:26          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:26          Constant:
+0:26            0 (const uint)
+0:26        Constant:
+0:26          1.000000
+0:26          1.000000
+0:26          1.000000
+0:26          1.000000
+0:27      EmitVertex ( global void)
+0:?   Linker Objects
+0:?     'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:?     'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:?     'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:?     'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:?     'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+
+
+Linked vertex stage:
+
+
+Linked geometry stage:
+
+
+Shader version: 440
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      move second child to first child ( temp 4-component vector of float)
+0:11        a1: direct index for structure ( out 4-component vector of float)
+0:11          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:11          Constant:
+0:11            0 (const uint)
+0:11        Constant:
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:12      move second child to first child ( temp 2-component vector of float)
+0:12        a2: direct index for structure ( out 2-component vector of float)
+0:12          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:12          Constant:
+0:12            1 (const uint)
+0:12        Constant:
+0:12          0.500000
+0:12          0.500000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13          'anon@1' ( out block{ 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})
+0:13          Constant:
+0:13            0 (const uint)
+0:13        Constant:
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:?     'anon@1' ( out block{ 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})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 440
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = triangle_strip
+0:? Sequence
+0:12  Function Definition: main( ( global void)
+0:12    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:14        direct index (layout( location=0) temp 4-component vector of float)
+0:14          'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:14          Constant:
+0:14            0 (const int)
+0:15      move second child to first child ( temp 2-component vector of float)
+0:15        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:15        direct index (layout( location=1) temp 2-component vector of float)
+0:15          'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:15          Constant:
+0:15            0 (const int)
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:16          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:16          Constant:
+0:16            0 (const uint)
+0:16        Constant:
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:17      EmitVertex ( global void)
+0:19      move second child to first child ( temp 4-component vector of float)
+0:19        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:19        direct index (layout( location=0) temp 4-component vector of float)
+0:19          'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:19          Constant:
+0:19            1 (const int)
+0:20      move second child to first child ( temp 2-component vector of float)
+0:20        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:20        direct index (layout( location=1) temp 2-component vector of float)
+0:20          'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:20          Constant:
+0:20            1 (const int)
+0:21      move second child to first child ( temp 4-component vector of float)
+0:21        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:21          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:21          Constant:
+0:21            0 (const uint)
+0:21        Constant:
+0:21          1.000000
+0:21          1.000000
+0:21          1.000000
+0:21          1.000000
+0:22      EmitVertex ( global void)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:24        direct index (layout( location=0) temp 4-component vector of float)
+0:24          'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:24          Constant:
+0:24            2 (const int)
+0:25      move second child to first child ( temp 2-component vector of float)
+0:25        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:25        direct index (layout( location=1) temp 2-component vector of float)
+0:25          'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:25          Constant:
+0:25            2 (const int)
+0:26      move second child to first child ( temp 4-component vector of float)
+0:26        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:26          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:26          Constant:
+0:26            0 (const uint)
+0:26        Constant:
+0:26          1.000000
+0:26          1.000000
+0:26          1.000000
+0:26          1.000000
+0:27      EmitVertex ( global void)
+0:?   Linker Objects
+0:?     'in_a1' (layout( location=0) in 3-element array of 4-component vector of float)
+0:?     'in_a2' (layout( location=1) in 3-element array of 2-component vector of float)
+0:?     'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:?     'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:?     'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 33
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 11 28 31 32
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "Block"
+                              MemberName 9(Block) 0  "a1"
+                              MemberName 9(Block) 1  "a2"
+                              Name 11  ""
+                              Name 26  "gl_PerVertex"
+                              MemberName 26(gl_PerVertex) 0  "gl_Position"
+                              MemberName 26(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 26(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 28  ""
+                              Name 31  "gl_VertexID"
+                              Name 32  "gl_InstanceID"
+                              Decorate 9(Block) Block
+                              Decorate 11 Location 0
+                              MemberDecorate 26(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 26(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 26(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 26(gl_PerVertex) Block
+                              Decorate 31(gl_VertexID) BuiltIn VertexId
+                              Decorate 32(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 2
+        9(Block):             TypeStruct 7(fvec4) 8(fvec2)
+              10:             TypePointer Output 9(Block)
+              11:     10(ptr) Variable Output
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:    6(float) Constant 1065353216
+              15:    7(fvec4) ConstantComposite 14 14 14 14
+              16:             TypePointer Output 7(fvec4)
+              18:     12(int) Constant 1
+              19:    6(float) Constant 1056964608
+              20:    8(fvec2) ConstantComposite 19 19
+              21:             TypePointer Output 8(fvec2)
+              23:             TypeInt 32 0
+              24:     23(int) Constant 1
+              25:             TypeArray 6(float) 24
+26(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 25
+              27:             TypePointer Output 26(gl_PerVertex)
+              28:     27(ptr) Variable Output
+              30:             TypePointer Input 12(int)
+ 31(gl_VertexID):     30(ptr) Variable Input
+32(gl_InstanceID):     30(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              17:     16(ptr) AccessChain 11 13
+                              Store 17 15
+              22:     21(ptr) AccessChain 11 18
+                              Store 22 20
+              29:     16(ptr) AccessChain 28 13
+                              Store 29 15
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 49
+
+                              Capability Geometry
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 9 14 22 25 33
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputTriangleStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "a1"
+                              Name 14  "in_a1"
+                              Name 22  "a2"
+                              Name 25  "in_a2"
+                              Name 31  "gl_PerVertex"
+                              MemberName 31(gl_PerVertex) 0  "gl_Position"
+                              MemberName 31(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 31(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 33  ""
+                              Decorate 9(a1) Location 0
+                              Decorate 14(in_a1) Location 0
+                              Decorate 22(a2) Location 1
+                              Decorate 25(in_a2) Location 1
+                              MemberDecorate 31(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 31(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 31(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 31(gl_PerVertex) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+           9(a1):      8(ptr) Variable Output
+              10:             TypeInt 32 0
+              11:     10(int) Constant 3
+              12:             TypeArray 7(fvec4) 11
+              13:             TypePointer Input 12
+       14(in_a1):     13(ptr) Variable Input
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Input 7(fvec4)
+              20:             TypeVector 6(float) 2
+              21:             TypePointer Output 20(fvec2)
+          22(a2):     21(ptr) Variable Output
+              23:             TypeArray 20(fvec2) 11
+              24:             TypePointer Input 23
+       25(in_a2):     24(ptr) Variable Input
+              26:             TypePointer Input 20(fvec2)
+              29:     10(int) Constant 1
+              30:             TypeArray 6(float) 29
+31(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 30
+              32:             TypePointer Output 31(gl_PerVertex)
+              33:     32(ptr) Variable Output
+              34:    6(float) Constant 1065353216
+              35:    7(fvec4) ConstantComposite 34 34 34 34
+              37:     15(int) Constant 1
+              43:     15(int) Constant 2
+         4(main):           2 Function None 3
+               5:             Label
+              18:     17(ptr) AccessChain 14(in_a1) 16
+              19:    7(fvec4) Load 18
+                              Store 9(a1) 19
+              27:     26(ptr) AccessChain 25(in_a2) 16
+              28:   20(fvec2) Load 27
+                              Store 22(a2) 28
+              36:      8(ptr) AccessChain 33 16
+                              Store 36 35
+                              EmitVertex
+              38:     17(ptr) AccessChain 14(in_a1) 37
+              39:    7(fvec4) Load 38
+                              Store 9(a1) 39
+              40:     26(ptr) AccessChain 25(in_a2) 37
+              41:   20(fvec2) Load 40
+                              Store 22(a2) 41
+              42:      8(ptr) AccessChain 33 16
+                              Store 42 35
+                              EmitVertex
+              44:     17(ptr) AccessChain 14(in_a1) 43
+              45:    7(fvec4) Load 44
+                              Store 9(a1) 45
+              46:     26(ptr) AccessChain 25(in_a2) 43
+              47:   20(fvec2) Load 46
+                              Store 22(a2) 47
+              48:      8(ptr) AccessChain 33 16
+                              Store 48 35
+                              EmitVertex
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/iomap.blockOutVariableIn.vert.out b/Test/baseResults/iomap.blockOutVariableIn.vert.out
new file mode 100644
index 0000000..dd12cbc
--- /dev/null
+++ b/Test/baseResults/iomap.blockOutVariableIn.vert.out
@@ -0,0 +1,234 @@
+iomap.blockOutVariableIn.vert
+Shader version: 440
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      move second child to first child ( temp 4-component vector of float)
+0:11        a1: direct index for structure ( out 4-component vector of float)
+0:11          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:11          Constant:
+0:11            0 (const uint)
+0:11        Constant:
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:12      move second child to first child ( temp 2-component vector of float)
+0:12        a2: direct index for structure ( out 2-component vector of float)
+0:12          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:12          Constant:
+0:12            1 (const uint)
+0:12        Constant:
+0:12          0.500000
+0:12          0.500000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13          'anon@1' ( 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})
+0:13          Constant:
+0:13            0 (const uint)
+0:13        Constant:
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:?     'anon@1' ( 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})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+iomap.blockOutVariableIn.frag
+Shader version: 440
+0:? Sequence
+0:8  Function Definition: main( ( global void)
+0:8    Function Parameters: 
+0:10    Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        'color' (layout( location=0) out 4-component vector of float)
+0:10        Construct vec4 ( temp 4-component vector of float)
+0:10          vector swizzle ( temp 2-component vector of float)
+0:10            'a1' (layout( location=0) smooth in 4-component vector of float)
+0:10            Sequence
+0:10              Constant:
+0:10                0 (const int)
+0:10              Constant:
+0:10                1 (const int)
+0:10          'a2' (layout( location=1) smooth in 2-component vector of float)
+0:?   Linker Objects
+0:?     'a1' (layout( location=0) smooth in 4-component vector of float)
+0:?     'a2' (layout( location=1) smooth in 2-component vector of float)
+0:?     'color' (layout( location=0) out 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+
+Shader version: 440
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      move second child to first child ( temp 4-component vector of float)
+0:11        a1: direct index for structure ( out 4-component vector of float)
+0:11          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:11          Constant:
+0:11            0 (const uint)
+0:11        Constant:
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:12      move second child to first child ( temp 2-component vector of float)
+0:12        a2: direct index for structure ( out 2-component vector of float)
+0:12          'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:12          Constant:
+0:12            1 (const uint)
+0:12        Constant:
+0:12          0.500000
+0:12          0.500000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13          'anon@1' ( out block{ 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})
+0:13          Constant:
+0:13            0 (const uint)
+0:13        Constant:
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:13          1.000000
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=0) out block{ out 4-component vector of float a1,  out 2-component vector of float a2})
+0:?     'anon@1' ( out block{ 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})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 440
+0:? Sequence
+0:8  Function Definition: main( ( global void)
+0:8    Function Parameters: 
+0:10    Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        'color' (layout( location=0) out 4-component vector of float)
+0:10        Construct vec4 ( temp 4-component vector of float)
+0:10          vector swizzle ( temp 2-component vector of float)
+0:10            'a1' (layout( location=0) smooth in 4-component vector of float)
+0:10            Sequence
+0:10              Constant:
+0:10                0 (const int)
+0:10              Constant:
+0:10                1 (const int)
+0:10          'a2' (layout( location=1) smooth in 2-component vector of float)
+0:?   Linker Objects
+0:?     'a1' (layout( location=0) smooth in 4-component vector of float)
+0:?     'a2' (layout( location=1) smooth in 2-component vector of float)
+0:?     'color' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 33
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 11 28 31 32
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "Block"
+                              MemberName 9(Block) 0  "a1"
+                              MemberName 9(Block) 1  "a2"
+                              Name 11  ""
+                              Name 26  "gl_PerVertex"
+                              MemberName 26(gl_PerVertex) 0  "gl_Position"
+                              MemberName 26(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 26(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 28  ""
+                              Name 31  "gl_VertexID"
+                              Name 32  "gl_InstanceID"
+                              Decorate 9(Block) Block
+                              Decorate 11 Location 0
+                              MemberDecorate 26(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 26(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 26(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 26(gl_PerVertex) Block
+                              Decorate 31(gl_VertexID) BuiltIn VertexId
+                              Decorate 32(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 2
+        9(Block):             TypeStruct 7(fvec4) 8(fvec2)
+              10:             TypePointer Output 9(Block)
+              11:     10(ptr) Variable Output
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:    6(float) Constant 1065353216
+              15:    7(fvec4) ConstantComposite 14 14 14 14
+              16:             TypePointer Output 7(fvec4)
+              18:     12(int) Constant 1
+              19:    6(float) Constant 1056964608
+              20:    8(fvec2) ConstantComposite 19 19
+              21:             TypePointer Output 8(fvec2)
+              23:             TypeInt 32 0
+              24:     23(int) Constant 1
+              25:             TypeArray 6(float) 24
+26(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 25
+              27:             TypePointer Output 26(gl_PerVertex)
+              28:     27(ptr) Variable Output
+              30:             TypePointer Input 12(int)
+ 31(gl_VertexID):     30(ptr) Variable Input
+32(gl_InstanceID):     30(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              17:     16(ptr) AccessChain 11 13
+                              Store 17 15
+              22:     21(ptr) AccessChain 11 18
+                              Store 22 20
+              29:     16(ptr) AccessChain 28 13
+                              Store 29 15
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 23
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 11 16
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 11  "a1"
+                              Name 16  "a2"
+                              Decorate 9(color) Location 0
+                              Decorate 11(a1) Location 0
+                              Decorate 16(a2) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+          11(a1):     10(ptr) Variable Input
+              12:             TypeVector 6(float) 2
+              15:             TypePointer Input 12(fvec2)
+          16(a2):     15(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              13:    7(fvec4) Load 11(a1)
+              14:   12(fvec2) VectorShuffle 13 13 0 1
+              17:   12(fvec2) Load 16(a2)
+              18:    6(float) CompositeExtract 14 0
+              19:    6(float) CompositeExtract 14 1
+              20:    6(float) CompositeExtract 17 0
+              21:    6(float) CompositeExtract 17 1
+              22:    7(fvec4) CompositeConstruct 18 19 20 21
+                              Store 9(color) 22
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/iomap.crossStage.2.vert.out b/Test/baseResults/iomap.crossStage.2.vert.out
index 325c1b4..85139cc 100644
--- a/Test/baseResults/iomap.crossStage.2.vert.out
+++ b/Test/baseResults/iomap.crossStage.2.vert.out
@@ -207,8 +207,9 @@
 
 Linked fragment stage:
 
-WARNING: Linking unknown stage stage: Matched shader interfaces are using different instance names.
-    blockName1: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}" versus blockName2: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}"
+WARNING: Linking unknown stage and fragment stages: Matched shader interfaces are using different instance names.
+    unknown stage stage: Block: crossStageBlock2 Instance: blockName1: ""
+    fragment stage: Block: crossStageBlock2 Instance: blockName2: ""
 
 Shader version: 460
 0:? Sequence
diff --git a/Test/baseResults/iomap.crossStage.vert.out b/Test/baseResults/iomap.crossStage.vert.out
index 5338b80..13ff58c 100644
--- a/Test/baseResults/iomap.crossStage.vert.out
+++ b/Test/baseResults/iomap.crossStage.vert.out
@@ -133,8 +133,9 @@
 
 Linked fragment stage:
 
-WARNING: Linking unknown stage stage: Matched shader interfaces are using different instance names.
-    blockName1: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}" versus blockName2: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}"
+WARNING: Linking unknown stage and fragment stages: Matched shader interfaces are using different instance names.
+    unknown stage stage: Block: crossStageBlock2 Instance: blockName1: ""
+    fragment stage: Block: crossStageBlock2 Instance: blockName2: ""
 
 Shader version: 460
 0:? Sequence
diff --git a/Test/baseResults/iomap.crossStage.vk.vert.out b/Test/baseResults/iomap.crossStage.vk.vert.out
index e137bdf..0a2eae8 100644
--- a/Test/baseResults/iomap.crossStage.vk.vert.out
+++ b/Test/baseResults/iomap.crossStage.vk.vert.out
@@ -194,8 +194,9 @@
 
 Linked fragment stage:
 
-WARNING: Linking unknown stage stage: Matched shader interfaces are using different instance names.
-    blockName1: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b}" versus blockName2: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b}"
+WARNING: Linking unknown stage and fragment stages: Matched shader interfaces are using different instance names.
+    unknown stage stage: Block: crossStageBlock2 Instance: blockName1: ""
+    fragment stage: Block: crossStageBlock2 Instance: blockName2: ""
 
 Shader version: 460
 0:? Sequence
diff --git a/Test/baseResults/iomap.variableOutBlockIn.2.vert.out b/Test/baseResults/iomap.variableOutBlockIn.2.vert.out
new file mode 100644
index 0000000..6ef7d4e
--- /dev/null
+++ b/Test/baseResults/iomap.variableOutBlockIn.2.vert.out
@@ -0,0 +1,276 @@
+iomap.variableOutBlockIn.2.vert
+Shader version: 440
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'a1' (layout( location=0) smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      move second child to first child ( temp 2-component vector of float)
+0:9        'a2' (layout( location=1) smooth out 2-component vector of float)
+0:9        Constant:
+0:9          0.500000
+0:9          0.500000
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:10          '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})
+0:10          Constant:
+0:10            0 (const uint)
+0:10        Constant:
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:?   Linker Objects
+0:?     'a1' (layout( location=0) smooth out 4-component vector of float)
+0:?     'a2' (layout( location=1) smooth out 2-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 unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+iomap.variableOutBlockIn.geom
+Shader version: 440
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = triangle_strip
+0:? Sequence
+0:14  Function Definition: main( ( global void)
+0:14    Function Parameters: 
+0:16    Sequence
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:16        Constant:
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:17      move second child to first child ( temp 2-component vector of float)
+0:17        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:17        Constant:
+0:17          0.500000
+0:17          0.500000
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:18          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:18          Constant:
+0:18            0 (const uint)
+0:18        Constant:
+0:18          1.000000
+0:18          1.000000
+0:18          1.000000
+0:18          1.000000
+0:?   Linker Objects
+0:?     'gin' (layout( location=0) in 3-element array of block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:?     'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:?     'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:?     'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+
+
+Linked vertex stage:
+
+
+Linked geometry stage:
+
+
+Shader version: 440
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'a1' (layout( location=0) smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      move second child to first child ( temp 2-component vector of float)
+0:9        'a2' (layout( location=1) smooth out 2-component vector of float)
+0:9        Constant:
+0:9          0.500000
+0:9          0.500000
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:10          'anon@0' ( out block{ 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})
+0:10          Constant:
+0:10            0 (const uint)
+0:10        Constant:
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:?   Linker Objects
+0:?     'a1' (layout( location=0) smooth out 4-component vector of float)
+0:?     'a2' (layout( location=1) smooth out 2-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 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 440
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = triangle_strip
+0:? Sequence
+0:14  Function Definition: main( ( global void)
+0:14    Function Parameters: 
+0:16    Sequence
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:16        Constant:
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:17      move second child to first child ( temp 2-component vector of float)
+0:17        'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:17        Constant:
+0:17          0.500000
+0:17          0.500000
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:18          'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+0:18          Constant:
+0:18            0 (const uint)
+0:18        Constant:
+0:18          1.000000
+0:18          1.000000
+0:18          1.000000
+0:18          1.000000
+0:?   Linker Objects
+0:?     'gin' (layout( location=0) in 3-element array of block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:?     'a1' (layout( location=0 stream=0) out 4-component vector of float)
+0:?     'a2' (layout( location=1 stream=0) out 2-component vector of float)
+0:?     'anon@0' (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 1-element array of float ClipDistance gl_ClipDistance})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 29
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 14 22 27 28
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "a1"
+                              Name 14  "a2"
+                              Name 20  "gl_PerVertex"
+                              MemberName 20(gl_PerVertex) 0  "gl_Position"
+                              MemberName 20(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 20(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 22  ""
+                              Name 27  "gl_VertexID"
+                              Name 28  "gl_InstanceID"
+                              Decorate 9(a1) Location 0
+                              Decorate 14(a2) Location 1
+                              MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 20(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 20(gl_PerVertex) Block
+                              Decorate 27(gl_VertexID) BuiltIn VertexId
+                              Decorate 28(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+           9(a1):      8(ptr) Variable Output
+              10:    6(float) Constant 1065353216
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeVector 6(float) 2
+              13:             TypePointer Output 12(fvec2)
+          14(a2):     13(ptr) Variable Output
+              15:    6(float) Constant 1056964608
+              16:   12(fvec2) ConstantComposite 15 15
+              17:             TypeInt 32 0
+              18:     17(int) Constant 1
+              19:             TypeArray 6(float) 18
+20(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 19
+              21:             TypePointer Output 20(gl_PerVertex)
+              22:     21(ptr) Variable Output
+              23:             TypeInt 32 1
+              24:     23(int) Constant 0
+              26:             TypePointer Input 23(int)
+ 27(gl_VertexID):     26(ptr) Variable Input
+28(gl_InstanceID):     26(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(a1) 11
+                              Store 14(a2) 16
+              25:      8(ptr) AccessChain 22 24
+                              Store 25 11
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 31
+
+                              Capability Geometry
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 9 14 22 30
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputTriangleStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "a1"
+                              Name 14  "a2"
+                              Name 20  "gl_PerVertex"
+                              MemberName 20(gl_PerVertex) 0  "gl_Position"
+                              MemberName 20(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 20(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 22  ""
+                              Name 26  "Inputs"
+                              MemberName 26(Inputs) 0  "a1"
+                              MemberName 26(Inputs) 1  "a2"
+                              Name 30  "gin"
+                              Decorate 9(a1) Location 0
+                              Decorate 14(a2) Location 1
+                              MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 20(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 20(gl_PerVertex) Block
+                              Decorate 26(Inputs) Block
+                              Decorate 30(gin) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+           9(a1):      8(ptr) Variable Output
+              10:    6(float) Constant 1065353216
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeVector 6(float) 2
+              13:             TypePointer Output 12(fvec2)
+          14(a2):     13(ptr) Variable Output
+              15:    6(float) Constant 1056964608
+              16:   12(fvec2) ConstantComposite 15 15
+              17:             TypeInt 32 0
+              18:     17(int) Constant 1
+              19:             TypeArray 6(float) 18
+20(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 19
+              21:             TypePointer Output 20(gl_PerVertex)
+              22:     21(ptr) Variable Output
+              23:             TypeInt 32 1
+              24:     23(int) Constant 0
+      26(Inputs):             TypeStruct 7(fvec4) 12(fvec2)
+              27:     17(int) Constant 3
+              28:             TypeArray 26(Inputs) 27
+              29:             TypePointer Input 28
+         30(gin):     29(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(a1) 11
+                              Store 14(a2) 16
+              25:      8(ptr) AccessChain 22 24
+                              Store 25 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/iomap.variableOutBlockIn.vert.out b/Test/baseResults/iomap.variableOutBlockIn.vert.out
new file mode 100644
index 0000000..8fef640
--- /dev/null
+++ b/Test/baseResults/iomap.variableOutBlockIn.vert.out
@@ -0,0 +1,236 @@
+iomap.variableOutBlockIn.vert
+Shader version: 440
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'a1' (layout( location=0) smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      move second child to first child ( temp 2-component vector of float)
+0:9        'a2' (layout( location=1) smooth out 2-component vector of float)
+0:9        Constant:
+0:9          0.500000
+0:9          0.500000
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:10          '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})
+0:10          Constant:
+0:10            0 (const uint)
+0:10        Constant:
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:?   Linker Objects
+0:?     'a1' (layout( location=0) smooth out 4-component vector of float)
+0:?     'a2' (layout( location=1) smooth out 2-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 unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+iomap.variableOutBlockIn.frag
+Shader version: 440
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        'color' (layout( location=0) out 4-component vector of float)
+0:12        Construct vec4 ( temp 4-component vector of float)
+0:12          vector swizzle ( temp 2-component vector of float)
+0:12            a1: direct index for structure ( in 4-component vector of float)
+0:12              'anon@0' (layout( location=0) in block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:12              Constant:
+0:12                0 (const uint)
+0:12            Sequence
+0:12              Constant:
+0:12                0 (const int)
+0:12              Constant:
+0:12                1 (const int)
+0:12          a2: direct index for structure ( in 2-component vector of float)
+0:12            'anon@0' (layout( location=0) in block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:12            Constant:
+0:12              1 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=0) in block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:?     'color' (layout( location=0) out 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+
+Shader version: 440
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'a1' (layout( location=0) smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      move second child to first child ( temp 2-component vector of float)
+0:9        'a2' (layout( location=1) smooth out 2-component vector of float)
+0:9        Constant:
+0:9          0.500000
+0:9          0.500000
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:10          'anon@0' ( out block{ 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})
+0:10          Constant:
+0:10            0 (const uint)
+0:10        Constant:
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:?   Linker Objects
+0:?     'a1' (layout( location=0) smooth out 4-component vector of float)
+0:?     'a2' (layout( location=1) smooth out 2-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 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 440
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        'color' (layout( location=0) out 4-component vector of float)
+0:12        Construct vec4 ( temp 4-component vector of float)
+0:12          vector swizzle ( temp 2-component vector of float)
+0:12            a1: direct index for structure ( in 4-component vector of float)
+0:12              'anon@0' (layout( location=0) in block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:12              Constant:
+0:12                0 (const uint)
+0:12            Sequence
+0:12              Constant:
+0:12                0 (const int)
+0:12              Constant:
+0:12                1 (const int)
+0:12          a2: direct index for structure ( in 2-component vector of float)
+0:12            'anon@0' (layout( location=0) in block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:12            Constant:
+0:12              1 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=0) in block{ in 4-component vector of float a1,  in 2-component vector of float a2})
+0:?     'color' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 29
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 14 22 27 28
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "a1"
+                              Name 14  "a2"
+                              Name 20  "gl_PerVertex"
+                              MemberName 20(gl_PerVertex) 0  "gl_Position"
+                              MemberName 20(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 20(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 22  ""
+                              Name 27  "gl_VertexID"
+                              Name 28  "gl_InstanceID"
+                              Decorate 9(a1) Location 0
+                              Decorate 14(a2) Location 1
+                              MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 20(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 20(gl_PerVertex) Block
+                              Decorate 27(gl_VertexID) BuiltIn VertexId
+                              Decorate 28(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+           9(a1):      8(ptr) Variable Output
+              10:    6(float) Constant 1065353216
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeVector 6(float) 2
+              13:             TypePointer Output 12(fvec2)
+          14(a2):     13(ptr) Variable Output
+              15:    6(float) Constant 1056964608
+              16:   12(fvec2) ConstantComposite 15 15
+              17:             TypeInt 32 0
+              18:     17(int) Constant 1
+              19:             TypeArray 6(float) 18
+20(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 19
+              21:             TypePointer Output 20(gl_PerVertex)
+              22:     21(ptr) Variable Output
+              23:             TypeInt 32 1
+              24:     23(int) Constant 0
+              26:             TypePointer Input 23(int)
+ 27(gl_VertexID):     26(ptr) Variable Input
+28(gl_InstanceID):     26(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(a1) 11
+                              Store 14(a2) 16
+              25:      8(ptr) AccessChain 22 24
+                              Store 25 11
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 29
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 13
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 11  "Inputs"
+                              MemberName 11(Inputs) 0  "a1"
+                              MemberName 11(Inputs) 1  "a2"
+                              Name 13  ""
+                              Decorate 9(color) Location 0
+                              Decorate 11(Inputs) Block
+                              Decorate 13 Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeVector 6(float) 2
+      11(Inputs):             TypeStruct 7(fvec4) 10(fvec2)
+              12:             TypePointer Input 11(Inputs)
+              13:     12(ptr) Variable Input
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Input 7(fvec4)
+              20:     14(int) Constant 1
+              21:             TypePointer Input 10(fvec2)
+         4(main):           2 Function None 3
+               5:             Label
+              17:     16(ptr) AccessChain 13 15
+              18:    7(fvec4) Load 17
+              19:   10(fvec2) VectorShuffle 18 18 0 1
+              22:     21(ptr) AccessChain 13 20
+              23:   10(fvec2) Load 22
+              24:    6(float) CompositeExtract 19 0
+              25:    6(float) CompositeExtract 19 1
+              26:    6(float) CompositeExtract 23 0
+              27:    6(float) CompositeExtract 23 1
+              28:    7(fvec4) CompositeConstruct 24 25 26 27
+                              Store 9(color) 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/link.multiAnonBlocksInvalid.0.0.vert.out b/Test/baseResults/link.multiAnonBlocksInvalid.0.0.vert.out
index 404ae84..c34401c 100644
--- a/Test/baseResults/link.multiAnonBlocksInvalid.0.0.vert.out
+++ b/Test/baseResults/link.multiAnonBlocksInvalid.0.0.vert.out
@@ -92,15 +92,20 @@
 
 Linked vertex stage:
 
-ERROR: Linking vertex stage: Types must match:
-    anon@0: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float uProj}" versus anon@1: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform 4X4 matrix of float uWorld}"
-ERROR: Linking vertex stage: Types must match:
-    anon@2: " out block{ out 4-component vector of float v1}" versus " out block{ out 4-component vector of float v1,  out 4-component vector of float v2}"
-ERROR: Linking vertex stage: Types must match:
-    anon@1: "layout( column_major shared) buffer block{layout( column_major shared) buffer 4-component vector of float b}" versus anon@3: "layout( column_major shared) buffer block{layout( column_major shared) buffer 4-component vector of float a}"
-ERROR: Linking vertex stage: Matched Uniform or Storage blocks must all be anonymous, or all be named:
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    myName: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float m}" versus anon@4: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float m}"
+ERROR: Linking vertex and vertex stages: vertex block member has no corresponding member in vertex block:
+    vertex stage: Block: Block, Member: uWorld
+    vertex stage: Block: Block, Member: n/a 
+ERROR: Linking vertex and vertex stages: vertex block member has no corresponding member in vertex block:
+    vertex stage: Block: Vertex, Member: v2
+    vertex stage: Block: Vertex, Member: n/a 
+ERROR: Linking vertex and vertex stages: Member names and types must match:
+    Block: BufferBlock
+        vertex stage: " vec4 b"
+        vertex stage: " vec4 a"
+ERROR: Linking vertex and vertex stages: Matched Uniform or Storage blocks must all be anonymous, or all be named:
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: NamedBlock Instance: myName: ""
+    vertex stage: Block: NamedBlock Instance: anon@4: ""
 
 Shader version: 430
 ERROR: node is still EOpNull!
diff --git a/Test/baseResults/link.multiBlocksInvalid.0.0.vert.out b/Test/baseResults/link.multiBlocksInvalid.0.0.vert.out
index ad609e8..d94debb 100644
--- a/Test/baseResults/link.multiBlocksInvalid.0.0.vert.out
+++ b/Test/baseResults/link.multiBlocksInvalid.0.0.vert.out
@@ -89,19 +89,35 @@
 
 Linked vertex stage:
 
-ERROR: Linking vertex stage: Types must match:
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    uC: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float color1}" versus uColorB: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float color2}"
-ERROR: Linking vertex stage: Types must match:
-ERROR: Linking vertex stage: Storage qualifiers must match:
-ERROR: Linking vertex stage: Layout qualification must match:
-    uBufC: "layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer 4-component vector of float color1}" versus uColorB: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float color2}"
-ERROR: Linking vertex stage: Types must match:
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    uD: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float uProj}" versus uDefaultB: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float uWorld}"
-ERROR: Linking vertex stage: Types must match:
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    oV: " out block{ out 4-component vector of float v1}" versus oVert: " out block{ out 4-component vector of float v2}"
+ERROR: Linking vertex and vertex stages: Member names and types must match:
+    Block: ColorBlock
+        vertex stage: " vec4 color1"
+        vertex stage: " vec4 color2"
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: ColorBlock Instance: uC: ""
+    vertex stage: Block: ColorBlock Instance: uColorB: ""
+ERROR: Linking vertex and vertex stages: Member names and types must match:
+    Block: ColorBlock
+        vertex stage: " vec4 color1"
+        vertex stage: " vec4 color2"
+ERROR: Linking vertex and vertex stages: Storage qualifiers must match:
+ERROR: Linking vertex and vertex stages: Layout packing qualifier must match:
+    vertex stage: Block: ColorBlock Instance: uBufC: "layout( column_major std430) buffer"
+    vertex stage: Block: ColorBlock Instance: uColorB: "layout( column_major std140) uniform"
+ERROR: Linking vertex and vertex stages: Member names and types must match:
+    Block: Block
+        vertex stage: " mat4x4 uProj"
+        vertex stage: " mat4x4 uWorld"
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: Block Instance: uD: ""
+    vertex stage: Block: Block Instance: uDefaultB: ""
+ERROR: Linking vertex and vertex stages: Member names and types must match:
+    Block: Vertex
+        vertex stage: " vec4 v1"
+        vertex stage: " vec4 v2"
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: Vertex Instance: oV: ""
+    vertex stage: Block: Vertex Instance: oVert: ""
 
 Shader version: 430
 0:? Sequence
diff --git a/Test/baseResults/link.multiBlocksValid.1.0.vert.out b/Test/baseResults/link.multiBlocksValid.1.0.vert.out
index 0015cab..69513f0 100644
--- a/Test/baseResults/link.multiBlocksValid.1.0.vert.out
+++ b/Test/baseResults/link.multiBlocksValid.1.0.vert.out
@@ -83,12 +83,15 @@
 
 Linked vertex stage:
 
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    c: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float color1, layout( column_major std140 offset=16) uniform 4-component vector of float color2}" versus a: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float color1, layout( column_major std140 offset=16) uniform 4-component vector of float color2}"
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    a: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform 4X4 matrix of float uWorld}" versus b: "layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform 4X4 matrix of float uWorld}"
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    b: " out block{ out 4-component vector of float v1,  out 4-component vector of float v2}" versus c: " out block{ out 4-component vector of float v1,  out 4-component vector of float v2}"
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: ColorBlock Instance: c: ""
+    vertex stage: Block: ColorBlock Instance: a: ""
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: Block Instance: a: ""
+    vertex stage: Block: Block Instance: b: ""
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: Vertex Instance: b: ""
+    vertex stage: Block: Vertex Instance: c: ""
 
 Shader version: 430
 0:? Sequence
diff --git a/Test/baseResults/link.vk.differentPC.0.0.frag.out b/Test/baseResults/link.vk.differentPC.0.0.frag.out
index d7cfd22..d78ba54 100644
--- a/Test/baseResults/link.vk.differentPC.0.0.frag.out
+++ b/Test/baseResults/link.vk.differentPC.0.0.frag.out
@@ -52,8 +52,10 @@
 
 Linked fragment stage:
 
-ERROR: Linking fragment stage: Types must match:
-    uPC: "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale}" versus "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale2}"
+ERROR: Linking fragment and fragment stages: Member names and types must match:
+    Block: PushConstantBlock
+        fragment stage: " float scale"
+        fragment stage: " float scale2"
 
 Shader version: 450
 gl_FragCoord origin is upper left
diff --git a/Test/baseResults/link.vk.differentPC.1.0.frag.out b/Test/baseResults/link.vk.differentPC.1.0.frag.out
index 632f18b..07ed124 100644
--- a/Test/baseResults/link.vk.differentPC.1.0.frag.out
+++ b/Test/baseResults/link.vk.differentPC.1.0.frag.out
@@ -52,10 +52,12 @@
 
 Linked fragment stage:
 
-ERROR: Linking fragment stage: Types must match:
-    uPC: "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale, layout( column_major std430 offset=36) uniform highp float scale2}" versus "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale}"
-ERROR: Linking fragment stage: Types must match:
-    uPC: "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale, layout( column_major std430 offset=36) uniform highp float scale2}" versus "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale}"
+ERROR: Linking fragment and fragment stages: fragment block member has no corresponding member in fragment block:
+    fragment stage: Block: PushConstantBlock, Member: scale2
+    fragment stage: Block: PushConstantBlock, Member: n/a 
+ERROR: Linking fragment and fragment stages: fragment block member has no corresponding member in fragment block:
+    fragment stage: Block: PushConstantBlock, Member: scale2
+    fragment stage: Block: PushConstantBlock, Member: n/a 
 
 Shader version: 450
 gl_FragCoord origin is upper left
diff --git a/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out b/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
index bdabab1..29a4df0 100644
--- a/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
+++ b/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
@@ -87,14 +87,18 @@
 
 Linked vertex stage:
 
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    uC: "layout( binding=1 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4-component vector of float color1, layout( column_major std140 offset=16) uniform bool b, layout( column_major std140 offset=32) uniform highp 4-component vector of float color2, layout( column_major std140 offset=48) uniform highp 4-component vector of float color3}" versus uColor: "layout( binding=1 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4-component vector of float color1, layout( column_major std140 offset=16) uniform bool b, layout( column_major std140 offset=32) uniform highp 4-component vector of float color2, layout( column_major std140 offset=48) uniform highp 4-component vector of float color3}"
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    uBuf: "layout( binding=1 column_major std430) buffer block{layout( column_major std430 offset=0) buffer highp 4X4 matrix of float p}" versus uBuffer: "layout( binding=1 column_major std430) buffer block{layout( column_major std430 offset=0) buffer highp 4X4 matrix of float p}"
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    uM: "layout( binding=0 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform highp 4X4 matrix of float uWorld}" versus uMatrix: "layout( binding=0 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform highp 4X4 matrix of float uWorld}"
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    oV: " out block{ out highp 4-component vector of float v1,  out highp 4-component vector of float v2}" versus anon@0: " out block{ out highp 4-component vector of float v1,  out highp 4-component vector of float v2}"
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: ColorBlock Instance: uC: ""
+    vertex stage: Block: ColorBlock Instance: uColor: ""
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: BufferBlock Instance: uBuf: ""
+    vertex stage: Block: BufferBlock Instance: uBuffer: ""
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: MatrixBlock Instance: uM: ""
+    vertex stage: Block: MatrixBlock Instance: uMatrix: ""
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: Vertex Instance: oV: ""
+    vertex stage: Block: Vertex Instance: anon@0: ""
 
 Shader version: 430
 0:? Sequence
diff --git a/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out b/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
index b0456a0..4005f60 100644
--- a/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
+++ b/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
@@ -131,16 +131,21 @@
 
 Linked geometry stage:
 
-WARNING: Linking geometry stage: Matched shader interfaces are using different instance names.
-    uC: "layout( binding=1 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4-component vector of float color1, layout( column_major std140 offset=16) uniform bool b, layout( column_major std140 offset=32) uniform highp 4-component vector of float color2, layout( column_major std140 offset=48) uniform highp 4-component vector of float color3}" versus uColor: "layout( binding=1 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4-component vector of float color1, layout( column_major std140 offset=16) uniform bool b, layout( column_major std140 offset=32) uniform highp 4-component vector of float color2, layout( column_major std140 offset=48) uniform highp 4-component vector of float color3}"
-WARNING: Linking geometry stage: Matched shader interfaces are using different instance names.
-    uBuf: "layout( binding=1 column_major std430) buffer block{layout( column_major std430 offset=0) buffer highp 4X4 matrix of float p}" versus uBuffer: "layout( binding=1 column_major std430) buffer block{layout( column_major std430 offset=0) buffer highp 4X4 matrix of float p}"
-WARNING: Linking geometry stage: Matched shader interfaces are using different instance names.
-    uM: "layout( binding=0 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform highp 4X4 matrix of float uWorld}" versus uMatrix: "layout( binding=0 column_major std140) uniform block{layout( column_major std140 offset=0) uniform highp 4X4 matrix of float uProj, layout( column_major std140 offset=64) uniform highp 4X4 matrix of float uWorld}"
-WARNING: Linking geometry stage: Matched shader interfaces are using different instance names.
-    oV: "layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float val1}" versus anon@0: "layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float val1}"
-WARNING: Linking geometry stage: Matched shader interfaces are using different instance names.
-    iV: " in 3-element array of block{ in highp 4-component vector of float v1,  in highp 4-component vector of float v2}" versus iVV: " in 3-element array of block{ in highp 4-component vector of float v1,  in highp 4-component vector of float v2}"
+WARNING: Linking geometry and geometry stages: Matched shader interfaces are using different instance names.
+    geometry stage: Block: ColorBlock Instance: uC: ""
+    geometry stage: Block: ColorBlock Instance: uColor: ""
+WARNING: Linking geometry and geometry stages: Matched shader interfaces are using different instance names.
+    geometry stage: Block: BufferBlock Instance: uBuf: ""
+    geometry stage: Block: BufferBlock Instance: uBuffer: ""
+WARNING: Linking geometry and geometry stages: Matched shader interfaces are using different instance names.
+    geometry stage: Block: MatrixBlock Instance: uM: ""
+    geometry stage: Block: MatrixBlock Instance: uMatrix: ""
+WARNING: Linking geometry and geometry stages: Matched shader interfaces are using different instance names.
+    geometry stage: Block: Vertex Instance: oV: ""
+    geometry stage: Block: Vertex Instance: anon@0: ""
+WARNING: Linking geometry and geometry stages: Matched shader interfaces are using different instance names.
+    geometry stage: Block: Vertex Instance: iV: ""
+    geometry stage: Block: Vertex Instance: iVV: ""
 
 Shader version: 430
 invocations = 1
diff --git a/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out b/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out
index e1d5c88..f84877e 100644
--- a/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out
+++ b/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out
@@ -56,8 +56,9 @@
 
 Linked vertex stage:
 
-WARNING: Linking vertex stage: Matched shader interfaces are using different instance names.
-    a: "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4X4 matrix of float uWorld, layout( column_major std430 offset=64) uniform highp 4X4 matrix of float uProj, layout( column_major std430 offset=128) uniform highp 4-component vector of float color1, layout( column_major std430 offset=144) uniform highp 4-component vector of float color2}" versus b: "layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4X4 matrix of float uWorld, layout( column_major std430 offset=64) uniform highp 4X4 matrix of float uProj, layout( column_major std430 offset=128) uniform highp 4-component vector of float color1, layout( column_major std430 offset=144) uniform highp 4-component vector of float color2}"
+WARNING: Linking vertex and vertex stages: Matched shader interfaces are using different instance names.
+    vertex stage: Block: PCBlock Instance: a: ""
+    vertex stage: Block: PCBlock Instance: b: ""
 
 Shader version: 450
 0:? Sequence
diff --git a/Test/baseResults/noMatchingFunction.frag.out b/Test/baseResults/noMatchingFunction.frag.out
new file mode 100644
index 0000000..85aa3f6
--- /dev/null
+++ b/Test/baseResults/noMatchingFunction.frag.out
@@ -0,0 +1,52 @@
+noMatchingFunction.frag
+ERROR: 0:17: 'func' : no matching overloaded function found 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 330
+ERROR: node is still EOpNull!
+0:8  Function Definition: func(struct-S-f11; ( global float)
+0:8    Function Parameters: 
+0:8      's' ( in structure{ global float a})
+0:10    Sequence
+0:10      Branch: Return with expression
+0:10        a: direct index for structure ( global float)
+0:10          's' ( in structure{ global float a})
+0:10          Constant:
+0:10            0 (const int)
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:17    Sequence
+0:17      Sequence
+0:17        move second child to first child ( temp float)
+0:17          'c' ( temp float)
+0:17          Constant:
+0:17            0.000000
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        'o_color' (layout( location=0) out 4-component vector of float)
+0:18        Construct vec4 ( temp 4-component vector of float)
+0:18          'c' ( temp float)
+0:?   Linker Objects
+0:?     'o_color' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 330
+ERROR: node is still EOpNull!
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:17    Sequence
+0:17      Sequence
+0:17        move second child to first child ( temp float)
+0:17          'c' ( temp float)
+0:17          Constant:
+0:17            0.000000
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        'o_color' (layout( location=0) out 4-component vector of float)
+0:18        Construct vec4 ( temp 4-component vector of float)
+0:18          'c' ( temp float)
+0:?   Linker Objects
+0:?     'o_color' (layout( location=0) out 4-component vector of float)
+
diff --git a/Test/baseResults/spv.1.6.conditionalDiscard.frag.out b/Test/baseResults/spv.1.6.conditionalDiscard.frag.out
new file mode 100644
index 0000000..f538fd9
--- /dev/null
+++ b/Test/baseResults/spv.1.6.conditionalDiscard.frag.out
@@ -0,0 +1,60 @@
+spv.1.6.conditionalDiscard.frag
+// Module Version 10600
+// Generated by (magic number): 8000a
+// Id's are bound by 36
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 13 17 34
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 400
+                              Name 4  "main"
+                              Name 9  "v"
+                              Name 13  "tex"
+                              Name 17  "coord"
+                              Name 34  "gl_FragColor"
+                              Decorate 13(tex) DescriptorSet 0
+                              Decorate 13(tex) Binding 0
+                              Decorate 17(coord) Location 0
+                              Decorate 34(gl_FragColor) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypeImage 6(float) 2D sampled format:Unknown
+              11:             TypeSampledImage 10
+              12:             TypePointer UniformConstant 11
+         13(tex):     12(ptr) Variable UniformConstant
+              15:             TypeVector 6(float) 2
+              16:             TypePointer Input 15(fvec2)
+       17(coord):     16(ptr) Variable Input
+              21:    6(float) Constant 1036831949
+              22:    6(float) Constant 1045220557
+              23:    6(float) Constant 1050253722
+              24:    6(float) Constant 1053609165
+              25:    7(fvec4) ConstantComposite 21 22 23 24
+              26:             TypeBool
+              27:             TypeVector 26(bool) 4
+              33:             TypePointer Output 7(fvec4)
+34(gl_FragColor):     33(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+            9(v):      8(ptr) Variable Function
+              14:          11 Load 13(tex)
+              18:   15(fvec2) Load 17(coord)
+              19:    7(fvec4) ImageSampleImplicitLod 14 18
+                              Store 9(v) 19
+              20:    7(fvec4) Load 9(v)
+              28:   27(bvec4) FOrdEqual 20 25
+              29:    26(bool) All 28
+                              SelectionMerge 31 None
+                              BranchConditional 29 30 31
+              30:               Label
+                                TerminateInvocation
+              31:             Label
+              35:    7(fvec4) Load 9(v)
+                              Store 34(gl_FragColor) 35
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.1.6.helperInvocation.frag.out b/Test/baseResults/spv.1.6.helperInvocation.frag.out
new file mode 100644
index 0000000..7df2a2a
--- /dev/null
+++ b/Test/baseResults/spv.1.6.helperInvocation.frag.out
@@ -0,0 +1,41 @@
+spv.1.6.helperInvocation.frag
+// Module Version 10600
+// Generated by (magic number): 8000a
+// Id's are bound by 20
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 15
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 310
+                              Name 4  "main"
+                              Name 8  "gl_HelperInvocation"
+                              Name 15  "outp"
+                              Decorate 8(gl_HelperInvocation) BuiltIn HelperInvocation
+                              Decorate 8(gl_HelperInvocation) Volatile
+                              Decorate 15(outp) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeBool
+               7:             TypePointer Input 6(bool)
+8(gl_HelperInvocation):      7(ptr) Variable Input
+              12:             TypeFloat 32
+              13:             TypeVector 12(float) 4
+              14:             TypePointer Output 13(fvec4)
+        15(outp):     14(ptr) Variable Output
+              17:   12(float) Constant 1065353216
+         4(main):           2 Function None 3
+               5:             Label
+               9:     6(bool) Load 8(gl_HelperInvocation)
+                              SelectionMerge 11 None
+                              BranchConditional 9 10 11
+              10:               Label
+              16:   13(fvec4)   Load 15(outp)
+              18:   13(fvec4)   CompositeConstruct 17 17 17 17
+              19:   13(fvec4)   FAdd 16 18
+                                Store 15(outp) 19
+                                Branch 11
+              11:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.1.6.specConstant.comp.out b/Test/baseResults/spv.1.6.specConstant.comp.out
new file mode 100644
index 0000000..7485f04
--- /dev/null
+++ b/Test/baseResults/spv.1.6.specConstant.comp.out
@@ -0,0 +1,69 @@
+spv.1.6.specConstant.comp
+// Module Version 10600
+// Generated by (magic number): 8000a
+// Id's are bound by 39
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 18
+                              ExecutionModeId 4 LocalSizeId 7 8 9
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 14  "foo(vu3;"
+                              Name 13  "wgs"
+                              Name 16  "bn"
+                              MemberName 16(bn) 0  "a"
+                              Name 18  "bi"
+                              Name 37  "param"
+                              Decorate 7 SpecId 18
+                              Decorate 9 SpecId 19
+                              MemberDecorate 16(bn) 0 Offset 0
+                              Decorate 16(bn) Block
+                              Decorate 18(bi) DescriptorSet 0
+                              Decorate 18(bi) Binding 0
+                              Decorate 25 SpecId 18
+                              Decorate 26 SpecId 19
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:      6(int) SpecConstant 32
+               8:      6(int) Constant 32
+               9:      6(int) SpecConstant 1
+              10:             TypeVector 6(int) 3
+              11:             TypePointer Function 10(ivec3)
+              12:             TypeFunction 2 11(ptr)
+          16(bn):             TypeStruct 6(int)
+              17:             TypePointer StorageBuffer 16(bn)
+          18(bi):     17(ptr) Variable StorageBuffer
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              21:      6(int) Constant 0
+              22:             TypePointer Function 6(int)
+              25:      6(int) SpecConstant 32
+              26:      6(int) SpecConstant 1
+              27:   10(ivec3) SpecConstantComposite 25 8 26
+              28:      6(int) Constant 1
+              31:      6(int) Constant 2
+              35:             TypePointer StorageBuffer 6(int)
+         4(main):           2 Function None 3
+               5:             Label
+       37(param):     11(ptr) Variable Function
+                              Store 37(param) 27
+              38:           2 FunctionCall 14(foo(vu3;) 37(param)
+                              Return
+                              FunctionEnd
+    14(foo(vu3;):           2 Function None 12
+         13(wgs):     11(ptr) FunctionParameter
+              15:             Label
+              23:     22(ptr) AccessChain 13(wgs) 21
+              24:      6(int) Load 23
+              29:      6(int) CompositeExtract 27 1
+              30:      6(int) IMul 24 29
+              32:     22(ptr) AccessChain 13(wgs) 31
+              33:      6(int) Load 32
+              34:      6(int) IMul 30 33
+              36:     35(ptr) AccessChain 18(bi) 20
+                              Store 36 34
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out b/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out
index e89abb4..45679eb 100644
--- a/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out
+++ b/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out
@@ -21,7 +21,6 @@
                               Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV
                               Decorate 16(accEXT) DescriptorSet 0
                               Decorate 16(accEXT) Binding 0
-                              Decorate 32(incomingPayloadEXT) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.MissShaderMotion.rmiss.out b/Test/baseResults/spv.MissShaderMotion.rmiss.out
index 2f18338..185c934 100644
--- a/Test/baseResults/spv.MissShaderMotion.rmiss.out
+++ b/Test/baseResults/spv.MissShaderMotion.rmiss.out
@@ -21,7 +21,6 @@
                               Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV
                               Decorate 16(accEXT) DescriptorSet 0
                               Decorate 16(accEXT) Binding 0
-                              Decorate 32(localPayloadEXT) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.RayGenShaderMotion.rgen.out b/Test/baseResults/spv.RayGenShaderMotion.rgen.out
index f9b9fa5..a6af236 100644
--- a/Test/baseResults/spv.RayGenShaderMotion.rgen.out
+++ b/Test/baseResults/spv.RayGenShaderMotion.rgen.out
@@ -26,7 +26,6 @@
                               Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 29(accEXT) DescriptorSet 0
                               Decorate 29(accEXT) Binding 0
-                              Decorate 46(payloadEXT) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.constConstruct.vert.out b/Test/baseResults/spv.constConstruct.vert.out
index db637a9..a8d5097 100644
--- a/Test/baseResults/spv.constConstruct.vert.out
+++ b/Test/baseResults/spv.constConstruct.vert.out
@@ -1,12 +1,14 @@
 spv.constConstruct.vert
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 150
 
                               Capability Shader
+                              Capability Float16
                               Capability Float64
                               Capability Int64
+                              Capability Int16
+                              Capability Int8
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Vertex 4  "main"
diff --git a/Test/baseResults/spv.ext.AnyHitShader.rahit.out b/Test/baseResults/spv.ext.AnyHitShader.rahit.out
index 880be33..df779bd 100644
--- a/Test/baseResults/spv.ext.AnyHitShader.rahit.out
+++ b/Test/baseResults/spv.ext.AnyHitShader.rahit.out
@@ -69,7 +69,6 @@
                               Decorate 70(gl_GeometryIndexEXT) BuiltIn RayGeometryIndexKHR
                               Decorate 76(gl_ObjectToWorld3x4EXT) BuiltIn ObjectToWorldKHR
                               Decorate 80(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
-                              Decorate 84(incomingPayload) Location 1
                               Decorate 98(gl_SubgroupSize) RelaxedPrecision
                               Decorate 98(gl_SubgroupSize) BuiltIn SubgroupSize
                               Decorate 99 RelaxedPrecision
diff --git a/Test/baseResults/spv.ext.ClosestHitShader.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
index 40903e6..9a4eb28 100644
--- a/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
+++ b/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
@@ -70,8 +70,6 @@
                               Decorate 80(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
                               Decorate 85(accEXT) DescriptorSet 0
                               Decorate 85(accEXT) Binding 0
-                              Decorate 98(incomingPayload) Location 1
-                              Decorate 100(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
index 7f5af89..24ab4f4 100644
--- a/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
+++ b/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
@@ -34,7 +34,6 @@
                               Name 61  "gl_SMIDNV"
                               Decorate 8(accEXT) DescriptorSet 0
                               Decorate 8(accEXT) Binding 0
-                              Decorate 26(incomingPayload) Location 1
                               Decorate 28(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 28(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 29 RelaxedPrecision
diff --git a/Test/baseResults/spv.ext.MissShader.rmiss.out b/Test/baseResults/spv.ext.MissShader.rmiss.out
index d2dfc17..1acd5ae 100644
--- a/Test/baseResults/spv.ext.MissShader.rmiss.out
+++ b/Test/baseResults/spv.ext.MissShader.rmiss.out
@@ -53,7 +53,6 @@
                               Decorate 32(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
                               Decorate 36(accEXT) DescriptorSet 0
                               Decorate 36(accEXT) Binding 0
-                              Decorate 51(incomingPayload) Location 1
                               Decorate 53(gl_SubGroupSizeARB) BuiltIn SubgroupSize
                               Decorate 53(gl_SubGroupSizeARB) Volatile
                               Decorate 53(gl_SubGroupSizeARB) Coherent
@@ -67,7 +66,6 @@
                               Decorate 74(s2D) Binding 1
                               Decorate 78(c2) Location 2
                               Decorate 85(lodClamp) Location 3
-                              Decorate 89(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayCallable.rcall.out b/Test/baseResults/spv.ext.RayCallable.rcall.out
index d429116..50e7fd8 100644
--- a/Test/baseResults/spv.ext.RayCallable.rcall.out
+++ b/Test/baseResults/spv.ext.RayCallable.rcall.out
@@ -22,8 +22,6 @@
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 16(dataBlock) Block
-                              Decorate 18 Location 1
-                              Decorate 29(data0) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayConstants.rgen.out b/Test/baseResults/spv.ext.RayConstants.rgen.out
index afd5083..6ef9dd4 100644
--- a/Test/baseResults/spv.ext.RayConstants.rgen.out
+++ b/Test/baseResults/spv.ext.RayConstants.rgen.out
@@ -15,7 +15,6 @@
                               Name 26  "payload"
                               Decorate 8(accEXT) DescriptorSet 0
                               Decorate 8(accEXT) Binding 0
-                              Decorate 26(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeAccelerationStructureKHR
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
index 95d9213..88e3c00 100644
--- a/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
@@ -49,7 +49,6 @@
                               MemberDecorate 36(block) 9 Offset 120
                               MemberDecorate 36(block) 10 Offset 128
                               Decorate 36(block) Block
-                              Decorate 60(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
index f5e32c1..ce5c306 100644
--- a/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
@@ -49,7 +49,6 @@
                               MemberDecorate 36(block) 9 Offset 136
                               MemberDecorate 36(block) 10 Offset 144
                               Decorate 36(block) Block
-                              Decorate 60(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
index d952adf..7462abd 100644
--- a/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
@@ -49,7 +49,6 @@
                               MemberDecorate 36(block) 9 Offset 120
                               MemberDecorate 36(block) 10 Offset 128
                               Decorate 36(block) Block
-                              Decorate 60(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
index c6d6530..3573455 100644
--- a/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
@@ -50,7 +50,6 @@
                               MemberDecorate 36(block) 9 Offset 96
                               MemberDecorate 36(block) 10 Offset 104
                               Decorate 36(block) Block
-                              Decorate 60(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayGenShader.rgen.out b/Test/baseResults/spv.ext.RayGenShader.rgen.out
index bfaf64b..46f920a 100644
--- a/Test/baseResults/spv.ext.RayGenShader.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader.rgen.out
@@ -34,7 +34,6 @@
                               MemberDecorate 38(block) 0 Offset 0
                               MemberDecorate 38(block) 1 Offset 16
                               Decorate 38(block) Block
-                              Decorate 53(payload) Location 1
                               Decorate 54(accEXT1) DescriptorSet 0
                               Decorate 54(accEXT1) Binding 1
                               Decorate 57(imageu) DescriptorSet 0
diff --git a/Test/baseResults/spv.ext.RayGenShader11.rgen.out b/Test/baseResults/spv.ext.RayGenShader11.rgen.out
index 048b02b..b31ebd9 100644
--- a/Test/baseResults/spv.ext.RayGenShader11.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader11.rgen.out
@@ -30,7 +30,6 @@
                               MemberDecorate 37(block) 0 Offset 0
                               MemberDecorate 37(block) 1 Offset 16
                               Decorate 37(block) Block
-                              Decorate 52(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out b/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
index ee39e35..08f72b2 100644
--- a/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
@@ -43,7 +43,6 @@
                               MemberDecorate 36(block) 3 Offset 32
                               MemberDecorate 36(block) 4 Offset 40
                               Decorate 36(block) Block
-                              Decorate 61(payload) Location 1
                               Decorate 65(accEXT1) DescriptorSet 0
                               Decorate 65(accEXT1) Binding 1
                               Decorate 80 DecorationNonUniformEXT
diff --git a/Test/baseResults/spv.ext.World3x4.rahit.out b/Test/baseResults/spv.ext.World3x4.rahit.out
index 40d73d1..8c60912 100644
--- a/Test/baseResults/spv.ext.World3x4.rahit.out
+++ b/Test/baseResults/spv.ext.World3x4.rahit.out
@@ -28,7 +28,6 @@
                               Decorate 60(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
                               Decorate 78(result) DescriptorSet 0
                               Decorate 78(result) Binding 0
-                              Decorate 89(hitValue) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.float16NoRelaxed.vert.out b/Test/baseResults/spv.float16NoRelaxed.vert.out
new file mode 100644
index 0000000..8872b46
--- /dev/null
+++ b/Test/baseResults/spv.float16NoRelaxed.vert.out
@@ -0,0 +1,72 @@
+spv.float16NoRelaxed.vert
+// Module Version 10300
+// Generated by (magic number): 8000a
+// Id's are bound by 35
+
+                              Capability Shader
+                              Capability Float16
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformVote
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 11 30
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_subgroup_extended_types_float16"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_vote"
+                              Name 4  "main"
+                              Name 8  "valueNoEqual"
+                              Name 11  "gl_SubgroupInvocationID"
+                              Name 15  "tempRes"
+                              Name 26  "Buffer1"
+                              MemberName 26(Buffer1) 0  "result"
+                              Name 28  ""
+                              Name 30  "gl_VertexIndex"
+                              Decorate 11(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 11(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 12 RelaxedPrecision
+                              Decorate 25 ArrayStride 4
+                              MemberDecorate 26(Buffer1) 0 Offset 0
+                              Decorate 26(Buffer1) Block
+                              Decorate 28 DescriptorSet 0
+                              Decorate 28 Binding 0
+                              Decorate 30(gl_VertexIndex) BuiltIn VertexIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+               7:             TypePointer Function 6(float16_t)
+               9:             TypeInt 32 0
+              10:             TypePointer Input 9(int)
+11(gl_SubgroupInvocationID):     10(ptr) Variable Input
+              14:             TypePointer Function 9(int)
+              17:             TypeBool
+              18:      9(int) Constant 3
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:     20(int) Constant 16
+              25:             TypeRuntimeArray 9(int)
+     26(Buffer1):             TypeStruct 25
+              27:             TypePointer StorageBuffer 26(Buffer1)
+              28:     27(ptr) Variable StorageBuffer
+              29:             TypePointer Input 20(int)
+30(gl_VertexIndex):     29(ptr) Variable Input
+              33:             TypePointer StorageBuffer 9(int)
+         4(main):           2 Function None 3
+               5:             Label
+ 8(valueNoEqual):      7(ptr) Variable Function
+     15(tempRes):     14(ptr) Variable Function
+              12:      9(int) Load 11(gl_SubgroupInvocationID)
+              13:6(float16_t) ConvertUToF 12
+                              Store 8(valueNoEqual) 13
+              16:6(float16_t) Load 8(valueNoEqual)
+              19:    17(bool) GroupNonUniformAllEqual 18 16
+              23:     20(int) Select 19 21 22
+              24:      9(int) Bitcast 23
+                              Store 15(tempRes) 24
+              31:     20(int) Load 30(gl_VertexIndex)
+              32:      9(int) Load 15(tempRes)
+              34:     33(ptr) AccessChain 28 21 31
+                              Store 34 32
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.intrinsicsSpecConst.vert.out b/Test/baseResults/spv.intrinsicsSpecConst.vert.out
deleted file mode 100644
index 11751d6..0000000
--- a/Test/baseResults/spv.intrinsicsSpecConst.vert.out
+++ /dev/null
@@ -1,35 +0,0 @@
-spv.intrinsicsSpecConst.vert
-Validation failed
-// Module Version 10000
-// Generated by (magic number): 8000a
-// Id's are bound by 13
-
-                              Capability Shader
-               1:             ExtInstImport  "GLSL.std.450"
-                              MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 10
-                              ExecutionModeId 4 DenormFlushToZero 7
-                              Source GLSL 450
-                              SourceExtension  "GL_EXT_spirv_intrinsics"
-                              Name 4  "main"
-                              Name 7  "targetWidth"
-                              Name 10  "pointSize"
-                              Name 11  "builtIn"
-                              Decorate 7(targetWidth) SpecId 5
-                              Decorate 10(pointSize) Location 0
-                              Decorate 11(builtIn) SpecId 6
-                              DecorateId 10(pointSize) BuiltIn 11(builtIn)
-               2:             TypeVoid
-               3:             TypeFunction 2
-               6:             TypeInt 32 0
-  7(targetWidth):      6(int) SpecConstant 32
-               8:             TypeFloat 32
-               9:             TypePointer Output 8(float)
-   10(pointSize):      9(ptr) Variable Output
-     11(builtIn):      6(int) SpecConstant 1
-              12:    8(float) Constant 1082130432
-         4(main):           2 Function None 3
-               5:             Label
-                              Store 10(pointSize) 12
-                              Return
-                              FunctionEnd
diff --git a/Test/baseResults/spv.intrinsicsSpirvDecorate.frag.out b/Test/baseResults/spv.intrinsicsSpirvDecorate.frag.out
index cbd46b0..c41dcc9 100644
--- a/Test/baseResults/spv.intrinsicsSpirvDecorate.frag.out
+++ b/Test/baseResults/spv.intrinsicsSpirvDecorate.frag.out
@@ -1,5 +1,4 @@
 spv.intrinsicsSpirvDecorate.frag
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 43
@@ -28,19 +27,12 @@
                               Decorate 10(floatIn) Location 0
                               Decorate 10(floatIn) ExplicitInterpAMD
                               Decorate 18(vec2Out) Location 1
-                              Decorate 20(gl_BaryCoordNoPerspAMD) Location 0
                               Decorate 20(gl_BaryCoordNoPerspAMD) BuiltIn BaryCoordNoPerspAMD
-                              Decorate 22(gl_BaryCoordNoPerspCentroidAMD) Location 1
                               Decorate 22(gl_BaryCoordNoPerspCentroidAMD) BuiltIn BaryCoordNoPerspCentroidAMD
-                              Decorate 25(gl_BaryCoordNoPerspSampleAMD) Location 2
                               Decorate 25(gl_BaryCoordNoPerspSampleAMD) BuiltIn BaryCoordNoPerspSampleAMD
-                              Decorate 28(gl_BaryCoordSmoothAMD) Location 3
                               Decorate 28(gl_BaryCoordSmoothAMD) BuiltIn BaryCoordSmoothAMD
-                              Decorate 31(gl_BaryCoordSmoothCentroidAMD) Location 4
                               Decorate 31(gl_BaryCoordSmoothCentroidAMD) BuiltIn BaryCoordSmoothCentroidAMD
-                              Decorate 34(gl_BaryCoordSmoothSampleAMD) Location 5
                               Decorate 34(gl_BaryCoordSmoothSampleAMD) BuiltIn BaryCoordSmoothSampleAMD
-                              Decorate 39(gl_BaryCoordPullModelAMD) Location 6
                               Decorate 39(gl_BaryCoordPullModelAMD) BuiltIn BaryCoordPullModelAMD
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.intrinsicsSpirvExecutionMode.frag.out b/Test/baseResults/spv.intrinsicsSpirvExecutionMode.frag.out
index 22bc53b..cdea382 100644
--- a/Test/baseResults/spv.intrinsicsSpirvExecutionMode.frag.out
+++ b/Test/baseResults/spv.intrinsicsSpirvExecutionMode.frag.out
@@ -1,5 +1,4 @@
 spv.intrinsicsSpirvExecutionMode.frag
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 12
@@ -17,7 +16,6 @@
                               Name 4  "main"
                               Name 8  "gl_FragStencilRef"
                               Name 10  "color"
-                              Decorate 8(gl_FragStencilRef) Location 0
                               Decorate 8(gl_FragStencilRef) BuiltIn FragStencilRefEXT
                               Decorate 10(color) Flat
                               Decorate 10(color) Location 0
diff --git a/Test/baseResults/spv.intrinsicsSpirvInstruction.vert.out b/Test/baseResults/spv.intrinsicsSpirvInstruction.vert.out
index 0e2780c..0e95e42 100644
--- a/Test/baseResults/spv.intrinsicsSpirvInstruction.vert.out
+++ b/Test/baseResults/spv.intrinsicsSpirvInstruction.vert.out
@@ -1,8 +1,7 @@
 spv.intrinsicsSpirvInstruction.vert
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 30
+// Id's are bound by 32
 
                               Capability Shader
                               Capability Int64
@@ -10,50 +9,52 @@
                               Extension  "SPV_AMD_shader_trinary_minmax"
                               Extension  "SPV_KHR_shader_clock"
                1:             ExtInstImport  "GLSL.std.450"
-              28:             ExtInstImport  "SPV_AMD_shader_trinary_minmax"
+              30:             ExtInstImport  "SPV_AMD_shader_trinary_minmax"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 9 13 18 21
+                              EntryPoint Vertex 4  "main" 9 15 20 23
                               Source GLSL 450
                               SourceExtension  "GL_ARB_gpu_shader_int64"
                               SourceExtension  "GL_EXT_spirv_intrinsics"
                               Name 4  "main"
                               Name 9  "uvec2Out"
-                              Name 13  "i64Out"
-                              Name 18  "vec2Out"
-                              Name 21  "vec3In"
+                              Name 15  "u64Out"
+                              Name 20  "vec2Out"
+                              Name 23  "vec3In"
                               Decorate 9(uvec2Out) Location 0
-                              Decorate 13(i64Out) Location 1
-                              Decorate 18(vec2Out) Location 2
-                              Decorate 21(vec3In) Location 0
+                              Decorate 15(u64Out) Location 1
+                              Decorate 20(vec2Out) Location 2
+                              Decorate 23(vec3In) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:             TypeVector 6(int) 2
                8:             TypePointer Output 7(ivec2)
      9(uvec2Out):      8(ptr) Variable Output
-              11:             TypeInt 64 1
-              12:             TypePointer Output 11(int64_t)
-      13(i64Out):     12(ptr) Variable Output
-              15:             TypeFloat 32
-              16:             TypeVector 15(float) 2
-              17:             TypePointer Output 16(fvec2)
-     18(vec2Out):     17(ptr) Variable Output
-              19:             TypeVector 15(float) 3
-              20:             TypePointer Input 19(fvec3)
-      21(vec3In):     20(ptr) Variable Input
+              10:             TypeInt 32 1
+              11:     10(int) Constant 1
+              13:             TypeInt 64 0
+              14:             TypePointer Output 13(int64_t)
+      15(u64Out):     14(ptr) Variable Output
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 2
+              19:             TypePointer Output 18(fvec2)
+     20(vec2Out):     19(ptr) Variable Output
+              21:             TypeVector 17(float) 3
+              22:             TypePointer Input 21(fvec3)
+      23(vec3In):     22(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-              10:    7(ivec2) ReadClockKHR
-                              Store 9(uvec2Out) 10
-              14: 11(int64_t) ReadClockKHR
-                              Store 13(i64Out) 14
-              22:   19(fvec3) Load 21(vec3In)
-              23:   16(fvec2) VectorShuffle 22 22 0 1
-              24:   19(fvec3) Load 21(vec3In)
-              25:   16(fvec2) VectorShuffle 24 24 1 2
-              26:   19(fvec3) Load 21(vec3In)
-              27:   16(fvec2) VectorShuffle 26 26 2 0
-              29:   16(fvec2) ExtInst 28(SPV_AMD_shader_trinary_minmax) 1(FMin3AMD) 23 25 27
-                              Store 18(vec2Out) 29
+              12:    7(ivec2) ReadClockKHR 11
+                              Store 9(uvec2Out) 12
+              16: 13(int64_t) ReadClockKHR 11
+                              Store 15(u64Out) 16
+              24:   21(fvec3) Load 23(vec3In)
+              25:   18(fvec2) VectorShuffle 24 24 0 1
+              26:   21(fvec3) Load 23(vec3In)
+              27:   18(fvec2) VectorShuffle 26 26 1 2
+              28:   21(fvec3) Load 23(vec3In)
+              29:   18(fvec2) VectorShuffle 28 28 2 0
+              31:   18(fvec2) ExtInst 30(SPV_AMD_shader_trinary_minmax) 1(FMin3AMD) 25 27 29
+                              Store 20(vec2Out) 31
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.intrinsicsSpirvLiteral.vert.out b/Test/baseResults/spv.intrinsicsSpirvLiteral.vert.out
index 68ad949..096cc61 100644
--- a/Test/baseResults/spv.intrinsicsSpirvLiteral.vert.out
+++ b/Test/baseResults/spv.intrinsicsSpirvLiteral.vert.out
@@ -1,30 +1,30 @@
 spv.intrinsicsSpirvLiteral.vert
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 12
+// Id's are bound by 13
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main"
+                              EntryPoint Vertex 4  "main" 9 11
                               Source GLSL 450
                               SourceExtension  "GL_EXT_spirv_intrinsics"
                               Name 4  "main"
                               Name 9  "vec4Out"
-                              Name 10  "vec4In"
+                              Name 11  "vec4In"
                               Decorate 9(vec4Out) Location 1
-                              Decorate 10(vec4In) Location 0
+                              Decorate 11(vec4In) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Function 7(fvec4)
+               8:             TypePointer Output 7(fvec4)
+      9(vec4Out):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+      11(vec4In):     10(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-      9(vec4Out):      8(ptr) Variable Function
-      10(vec4In):      8(ptr) Variable Function
-              11:    7(fvec4) Load 10(vec4In) None
-                              Store 9(vec4Out) 11 Volatile 
+              12:    7(fvec4) Load 11(vec4In) None
+                              Store 9(vec4Out) 12 Volatile 
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.intrinsicsSpirvType.rgen.out b/Test/baseResults/spv.intrinsicsSpirvType.rgen.out
index ac0c946..f3937b4 100644
--- a/Test/baseResults/spv.intrinsicsSpirvType.rgen.out
+++ b/Test/baseResults/spv.intrinsicsSpirvType.rgen.out
@@ -1,5 +1,4 @@
 spv.intrinsicsSpirvType.rgen
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 21
@@ -17,12 +16,13 @@
                               Name 4  "main"
                               Name 8  "rq"
                               Name 11  "as"
-                              Decorate 11(as) Location 0
                               Decorate 11(as) DescriptorSet 0
                               Decorate 11(as) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
+               6:             TypeRayQueryKHR
                7:             TypePointer Function 6
+               9:             TypeAccelerationStructureKHR
               10:             TypePointer UniformConstant 9
           11(as):     10(ptr) Variable UniformConstant
               13:             TypeInt 32 0
@@ -36,8 +36,6 @@
          4(main):           2 Function None 3
                5:             Label
            8(rq):      7(ptr) Variable Function
-               6:             TypeRayQueryKHR
-               9:             TypeAccelerationStructureKHR
               12:           9 Load 11(as)
                               RayQueryInitializeKHR 8(rq) 12 14 14 18 17 20 19
                               RayQueryTerminateKHR 8(rq)
diff --git a/Test/baseResults/spv.intrinsicsSpirvTypeLocalVar.vert.out b/Test/baseResults/spv.intrinsicsSpirvTypeLocalVar.vert.out
new file mode 100644
index 0000000..75515be
--- /dev/null
+++ b/Test/baseResults/spv.intrinsicsSpirvTypeLocalVar.vert.out
@@ -0,0 +1,43 @@
+spv.intrinsicsSpirvTypeLocalVar.vert
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 22
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main"
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_spirv_intrinsics"
+                              Name 4  "main"
+                              Name 10  "func(spv-t1;"
+                              Name 9  "emptyStruct"
+                              Name 13  "size"
+                              Name 16  "dummy"
+                              Name 18  "param"
+                              Decorate 13(size) SpecId 9
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeStruct
+               7:             TypePointer Function 6(struct)
+               8:             TypeFunction 2 7(ptr)
+              12:             TypeInt 32 1
+        13(size):     12(int) SpecConstant 9
+              14:             TypeArray 6(struct) 13(size)
+              15:             TypePointer Function 14
+              17:     12(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+       16(dummy):     15(ptr) Variable Function
+       18(param):      7(ptr) Variable Function
+              19:      7(ptr) AccessChain 16(dummy) 17
+              20:   6(struct) Load 19
+                              Store 18(param) 20
+              21:           2 FunctionCall 10(func(spv-t1;) 18(param)
+                              Return
+                              FunctionEnd
+10(func(spv-t1;):           2 Function None 8
+  9(emptyStruct):      7(ptr) FunctionParameter
+              11:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.textureError.frag.out b/Test/baseResults/spv.textureError.frag.out
new file mode 100644
index 0000000..d5ef59c
--- /dev/null
+++ b/Test/baseResults/spv.textureError.frag.out
@@ -0,0 +1,6 @@
+spv.textureError.frag
+ERROR: spv.textureError.frag:8: 'texture*D*' : function not supported in this version; use texture() instead 
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/textureQueryLOD.frag.out b/Test/baseResults/textureQueryLOD.frag.out
new file mode 100644
index 0000000..b565a00
--- /dev/null
+++ b/Test/baseResults/textureQueryLOD.frag.out
@@ -0,0 +1,115 @@
+textureQueryLOD.frag
+WARNING: 0:7: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+Requested GL_ARB_texture_query_lod
+0:? Sequence
+0:24  Function Definition: main( ( global void)
+0:24    Function Parameters: 
+0:26    Sequence
+0:26      switch
+0:26      condition
+0:26        'funct' ( uniform int)
+0:26      body
+0:26        Sequence
+0:28          case:  with expression
+0:28            Constant:
+0:28              0 (const int)
+0:?           Sequence
+0:29            Sequence
+0:29              move second child to first child ( temp 2-component vector of int)
+0:29                'iv2' ( temp 2-component vector of int)
+0:29                textureSize ( global 2-component vector of int)
+0:29                  'sampler' ( uniform sampler2DShadow)
+0:29                  Constant:
+0:29                    0 (const int)
+0:31            Sequence
+0:31              move second child to first child ( temp 2-component vector of float)
+0:31                'fv2' ( temp 2-component vector of float)
+0:31                textureQueryLod ( global 2-component vector of float)
+0:31                  'sampler' ( uniform sampler2DShadow)
+0:31                  Constant:
+0:31                    0.000000
+0:31                    0.000000
+0:33            move second child to first child ( temp 4-component vector of float)
+0:33              'color' ( out 4-component vector of float)
+0:33              Construct vec4 ( temp 4-component vector of float)
+0:33                Convert int to float ( temp 2-component vector of float)
+0:33                  'iv2' ( temp 2-component vector of int)
+0:33                'fv2' ( temp 2-component vector of float)
+0:34            Branch: Break
+0:35          default: 
+0:?           Sequence
+0:36            move second child to first child ( temp 4-component vector of float)
+0:36              'color' ( out 4-component vector of float)
+0:36              Constant:
+0:36                1.000000
+0:36                1.000000
+0:36                1.000000
+0:36                1.000000
+0:37            Branch: Break
+0:?   Linker Objects
+0:?     'vUV' ( smooth in 2-component vector of float)
+0:?     'color' ( out 4-component vector of float)
+0:?     'sampler' ( uniform sampler2DShadow)
+0:?     'funct' ( uniform int)
+
+
+Linked fragment stage:
+
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+Requested GL_ARB_texture_query_lod
+0:? Sequence
+0:24  Function Definition: main( ( global void)
+0:24    Function Parameters: 
+0:26    Sequence
+0:26      switch
+0:26      condition
+0:26        'funct' ( uniform int)
+0:26      body
+0:26        Sequence
+0:28          case:  with expression
+0:28            Constant:
+0:28              0 (const int)
+0:?           Sequence
+0:29            Sequence
+0:29              move second child to first child ( temp 2-component vector of int)
+0:29                'iv2' ( temp 2-component vector of int)
+0:29                textureSize ( global 2-component vector of int)
+0:29                  'sampler' ( uniform sampler2DShadow)
+0:29                  Constant:
+0:29                    0 (const int)
+0:31            Sequence
+0:31              move second child to first child ( temp 2-component vector of float)
+0:31                'fv2' ( temp 2-component vector of float)
+0:31                textureQueryLod ( global 2-component vector of float)
+0:31                  'sampler' ( uniform sampler2DShadow)
+0:31                  Constant:
+0:31                    0.000000
+0:31                    0.000000
+0:33            move second child to first child ( temp 4-component vector of float)
+0:33              'color' ( out 4-component vector of float)
+0:33              Construct vec4 ( temp 4-component vector of float)
+0:33                Convert int to float ( temp 2-component vector of float)
+0:33                  'iv2' ( temp 2-component vector of int)
+0:33                'fv2' ( temp 2-component vector of float)
+0:34            Branch: Break
+0:35          default: 
+0:?           Sequence
+0:36            move second child to first child ( temp 4-component vector of float)
+0:36              'color' ( out 4-component vector of float)
+0:36              Constant:
+0:36                1.000000
+0:36                1.000000
+0:36                1.000000
+0:36                1.000000
+0:37            Branch: Break
+0:?   Linker Objects
+0:?     'vUV' ( smooth in 2-component vector of float)
+0:?     'color' ( out 4-component vector of float)
+0:?     'sampler' ( uniform sampler2DShadow)
+0:?     'funct' ( uniform int)
+
diff --git a/Test/baseResults/vk.relaxed.stagelink.0.0.vert.out b/Test/baseResults/vk.relaxed.stagelink.0.0.vert.out
new file mode 100755
index 0000000..bcd4e2a
--- /dev/null
+++ b/Test/baseResults/vk.relaxed.stagelink.0.0.vert.out
@@ -0,0 +1,10697 @@
+vk.relaxed.stagelink.0.0.vert
+Shader version: 460
+0:? Sequence
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:15    Sequence
+0:15      Sequence
+0:15        Sequence
+0:15          move second child to first child ( temp highp 3-component vector of float)
+0:15            'texcoord' ( temp highp 3-component vector of float)
+0:15            Function Call: TDInstanceTexCoord(vf3; ( global highp 3-component vector of float)
+0:15              direct index (layout( location=3) temp highp 3-component vector of float)
+0:15                'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:15                Constant:
+0:15                  0 (const int)
+0:16        move second child to first child ( temp highp 3-component vector of float)
+0:16          vector swizzle ( temp highp 3-component vector of float)
+0:16            texCoord0: direct index for structure ( out highp 3-component vector of float)
+0:16              'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:16              Constant:
+0:16                2 (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                2 (const int)
+0:16          vector swizzle ( temp highp 3-component vector of float)
+0:16            'texcoord' ( temp highp 3-component vector of float)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:16              Constant:
+0:16                2 (const int)
+0:20      move second child to first child ( temp highp int)
+0:20        instance: direct index for structure ( flat out highp int)
+0:20          'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:20          Constant:
+0:20            4 (const int)
+0:20        Function Call: TDInstanceID( ( global highp int)
+0:21      Sequence
+0:21        move second child to first child ( temp highp 4-component vector of float)
+0:21          'worldSpacePos' ( temp highp 4-component vector of float)
+0:21          Function Call: TDDeform(vf3; ( global highp 4-component vector of float)
+0:21            'P' (layout( location=0) in highp 3-component vector of float)
+0:22      Sequence
+0:22        move second child to first child ( temp highp 3-component vector of float)
+0:22          'uvUnwrapCoord' ( temp highp 3-component vector of float)
+0:22          Function Call: TDInstanceTexCoord(vf3; ( global highp 3-component vector of float)
+0:22            Function Call: TDUVUnwrapCoord( ( global highp 3-component vector of float)
+0:23      move second child to first child ( temp highp 4-component vector of float)
+0:23        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:23          'anon@4' ( 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,  out unsized 1-element array of float CullDistance gl_CullDistance})
+0:23          Constant:
+0:23            0 (const uint)
+0:23        Function Call: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:23          'worldSpacePos' ( temp highp 4-component vector of float)
+0:23          'uvUnwrapCoord' ( temp highp 3-component vector of float)
+0:32      Sequence
+0:32        move second child to first child ( temp highp int)
+0:32          'cameraIndex' ( temp highp int)
+0:32          Function Call: TDCameraIndex( ( global highp int)
+0:33      move second child to first child ( temp highp int)
+0:33        cameraIndex: direct index for structure ( flat out highp int)
+0:33          'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:33          Constant:
+0:33            3 (const int)
+0:33        'cameraIndex' ( temp highp int)
+0:34      move second child to first child ( temp highp 3-component vector of float)
+0:34        vector swizzle ( temp highp 3-component vector of float)
+0:34          worldSpacePos: direct index for structure ( out highp 3-component vector of float)
+0:34            'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:34            Constant:
+0:34              1 (const int)
+0:34          Sequence
+0:34            Constant:
+0:34              0 (const int)
+0:34            Constant:
+0:34              1 (const int)
+0:34            Constant:
+0:34              2 (const int)
+0:34        vector swizzle ( temp highp 3-component vector of float)
+0:34          'worldSpacePos' ( temp highp 4-component vector of float)
+0:34          Sequence
+0:34            Constant:
+0:34              0 (const int)
+0:34            Constant:
+0:34              1 (const int)
+0:34            Constant:
+0:34              2 (const int)
+0:35      move second child to first child ( temp highp 4-component vector of float)
+0:35        color: direct index for structure ( out highp 4-component vector of float)
+0:35          'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:35          Constant:
+0:35            0 (const int)
+0:35        Function Call: TDInstanceColor(vf4; ( global highp 4-component vector of float)
+0:35          'Cd' (layout( location=2) in highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'P' (layout( location=0) in highp 3-component vector of float)
+0:?     'N' (layout( location=1) in highp 3-component vector of float)
+0:?     'Cd' (layout( location=2) in highp 4-component vector of float)
+0:?     'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:?     'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:?     'anon@4' ( 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,  out unsized 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_VertexIndex' ( in int VertexIndex)
+0:?     'gl_InstanceIndex' ( in int InstanceIndex)
+
+vk.relaxed.stagelink.0.1.vert
+Shader version: 460
+0:? Sequence
+0:176  Function Definition: iTDCamToProj(vf4;vf3;i1;b1; ( global highp 4-component vector of float)
+0:176    Function Parameters: 
+0:176      'v' ( in highp 4-component vector of float)
+0:176      'uv' ( in highp 3-component vector of float)
+0:176      'cameraIndex' ( in highp int)
+0:176      'applyPickMod' ( in bool)
+0:178    Sequence
+0:178      Test condition and select ( temp void)
+0:178        Condition
+0:178        Negate conditional ( temp bool)
+0:178          Function Call: TDInstanceActive( ( global bool)
+0:178        true case
+0:179        Branch: Return with expression
+0:179          Constant:
+0:179            2.000000
+0:179            2.000000
+0:179            2.000000
+0:179            0.000000
+0:180      move second child to first child ( temp highp 4-component vector of float)
+0:180        'v' ( in highp 4-component vector of float)
+0:180        matrix-times-vector ( temp highp 4-component vector of float)
+0:180          proj: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:180            direct index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:180              uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:180                'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:180                Constant:
+0:180                  0 (const uint)
+0:180              Constant:
+0:180                0 (const int)
+0:180            Constant:
+0:180              8 (const int)
+0:180          'v' ( in highp 4-component vector of float)
+0:181      Branch: Return with expression
+0:181        'v' ( in highp 4-component vector of float)
+0:183  Function Definition: iTDWorldToProj(vf4;vf3;i1;b1; ( global highp 4-component vector of float)
+0:183    Function Parameters: 
+0:183      'v' ( in highp 4-component vector of float)
+0:183      'uv' ( in highp 3-component vector of float)
+0:183      'cameraIndex' ( in highp int)
+0:183      'applyPickMod' ( in bool)
+0:184    Sequence
+0:184      Test condition and select ( temp void)
+0:184        Condition
+0:184        Negate conditional ( temp bool)
+0:184          Function Call: TDInstanceActive( ( global bool)
+0:184        true case
+0:185        Branch: Return with expression
+0:185          Constant:
+0:185            2.000000
+0:185            2.000000
+0:185            2.000000
+0:185            0.000000
+0:186      move second child to first child ( temp highp 4-component vector of float)
+0:186        'v' ( in highp 4-component vector of float)
+0:186        matrix-times-vector ( temp highp 4-component vector of float)
+0:186          camProj: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:186            direct index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:186              uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:186                'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:186                Constant:
+0:186                  0 (const uint)
+0:186              Constant:
+0:186                0 (const int)
+0:186            Constant:
+0:186              6 (const int)
+0:186          'v' ( in highp 4-component vector of float)
+0:187      Branch: Return with expression
+0:187        'v' ( in highp 4-component vector of float)
+0:193  Function Definition: TDInstanceID( ( global highp int)
+0:193    Function Parameters: 
+0:194    Sequence
+0:194      Branch: Return with expression
+0:194        add ( temp highp int)
+0:194          'gl_InstanceIndex' ( in highp int InstanceIndex)
+0:194          uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:194            'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:194            Constant:
+0:194              0 (const uint)
+0:196  Function Definition: TDCameraIndex( ( global highp int)
+0:196    Function Parameters: 
+0:197    Sequence
+0:197      Branch: Return with expression
+0:197        Constant:
+0:197          0 (const int)
+0:199  Function Definition: TDUVUnwrapCoord( ( global highp 3-component vector of float)
+0:199    Function Parameters: 
+0:200    Sequence
+0:200      Branch: Return with expression
+0:200        direct index (layout( location=3) temp highp 3-component vector of float)
+0:200          'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:200          Constant:
+0:200            0 (const int)
+0:205  Function Definition: TDPickID( ( global highp int)
+0:205    Function Parameters: 
+0:209    Sequence
+0:209      Branch: Return with expression
+0:209        Constant:
+0:209          0 (const int)
+0:212  Function Definition: iTDConvertPickId(i1; ( global highp float)
+0:212    Function Parameters: 
+0:212      'id' ( in highp int)
+0:213    Sequence
+0:213      or second child into first child ( temp highp int)
+0:213        'id' ( in highp int)
+0:213        Constant:
+0:213          1073741824 (const int)
+0:214      Branch: Return with expression
+0:214        intBitsToFloat ( global highp float)
+0:214          'id' ( in highp int)
+0:217  Function Definition: TDWritePickingValues( ( global void)
+0:217    Function Parameters: 
+0:224  Function Definition: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:224    Function Parameters: 
+0:224      'v' ( in highp 4-component vector of float)
+0:224      'uv' ( in highp 3-component vector of float)
+0:226    Sequence
+0:226      Branch: Return with expression
+0:226        Function Call: iTDWorldToProj(vf4;vf3;i1;b1; ( global highp 4-component vector of float)
+0:226          'v' ( in highp 4-component vector of float)
+0:226          'uv' ( in highp 3-component vector of float)
+0:226          Function Call: TDCameraIndex( ( global highp int)
+0:226          Constant:
+0:226            true (const bool)
+0:228  Function Definition: TDWorldToProj(vf3;vf3; ( global highp 4-component vector of float)
+0:228    Function Parameters: 
+0:228      'v' ( in highp 3-component vector of float)
+0:228      'uv' ( in highp 3-component vector of float)
+0:230    Sequence
+0:230      Branch: Return with expression
+0:230        Function Call: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:230          Construct vec4 ( temp highp 4-component vector of float)
+0:230            'v' ( in highp 3-component vector of float)
+0:230            Constant:
+0:230              1.000000
+0:230          'uv' ( in highp 3-component vector of float)
+0:232  Function Definition: TDWorldToProj(vf4; ( global highp 4-component vector of float)
+0:232    Function Parameters: 
+0:232      'v' ( in highp 4-component vector of float)
+0:234    Sequence
+0:234      Branch: Return with expression
+0:234        Function Call: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:234          'v' ( in highp 4-component vector of float)
+0:234          Constant:
+0:234            0.000000
+0:234            0.000000
+0:234            0.000000
+0:236  Function Definition: TDWorldToProj(vf3; ( global highp 4-component vector of float)
+0:236    Function Parameters: 
+0:236      'v' ( in highp 3-component vector of float)
+0:238    Sequence
+0:238      Branch: Return with expression
+0:238        Function Call: TDWorldToProj(vf4; ( global highp 4-component vector of float)
+0:238          Construct vec4 ( temp highp 4-component vector of float)
+0:238            'v' ( in highp 3-component vector of float)
+0:238            Constant:
+0:238              1.000000
+0:240  Function Definition: TDPointColor( ( global highp 4-component vector of float)
+0:240    Function Parameters: 
+0:241    Sequence
+0:241      Branch: Return with expression
+0:241        'Cd' (layout( location=2) in highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'P' (layout( location=0) in highp 3-component vector of float)
+0:?     'N' (layout( location=1) in highp 3-component vector of float)
+0:?     'Cd' (layout( location=2) in highp 4-component vector of float)
+0:?     'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float position,  global highp 3-component vector of float direction,  global highp 3-component vector of float diffuse,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float lightSize,  global highp 4-component vector of float misc,  global highp 4-component vector of float coneLookupScaleBias,  global highp 4-component vector of float attenScaleBiasRoll, layout( column_major std140) global highp 4X4 matrix of float shadowMapMatrix, layout( column_major std140) global highp 4X4 matrix of float shadowMapCamMatrix,  global highp 4-component vector of float shadowMapRes, layout( column_major std140) global highp 4X4 matrix of float projMapMatrix} uTDLights})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 3-component vector of float color, layout( column_major std140) global highp 3X3 matrix of float rotate} uTDEnvLights})
+0:?     'uTDEnvLightBuffers' (layout( column_major std430) restrict readonly buffer 1-element array of block{layout( column_major std430 offset=0) restrict readonly buffer 9-element array of highp 3-component vector of float shCoeffs})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@4' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@5' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'mTD2DImageOutputs' (layout( rgba8) uniform 1-element array of highp image2D)
+0:?     'mTD2DArrayImageOutputs' (layout( rgba8) uniform 1-element array of highp image2DArray)
+0:?     'mTD3DImageOutputs' (layout( rgba8) uniform 1-element array of highp image3D)
+0:?     'mTDCubeImageOutputs' (layout( rgba8) uniform 1-element array of highp imageCube)
+0:?     'gl_VertexIndex' ( in int VertexIndex)
+0:?     'gl_InstanceIndex' ( in int InstanceIndex)
+
+vk.relaxed.stagelink.0.2.vert
+Shader version: 460
+0:? Sequence
+0:114  Function Definition: TDInstanceTexCoord(i1;vf3; ( global highp 3-component vector of float)
+0:114    Function Parameters: 
+0:114      'index' ( in highp int)
+0:114      't' ( in highp 3-component vector of float)
+0:?     Sequence
+0:116      Sequence
+0:116        move second child to first child ( temp highp int)
+0:116          'coord' ( temp highp int)
+0:116          'index' ( in highp int)
+0:117      Sequence
+0:117        move second child to first child ( temp highp 4-component vector of float)
+0:117          'samp' ( temp highp 4-component vector of float)
+0:117          textureFetch ( global highp 4-component vector of float)
+0:117            'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:117            'coord' ( temp highp int)
+0:118      move second child to first child ( temp highp float)
+0:118        direct index ( temp highp float)
+0:118          'v' ( temp highp 3-component vector of float)
+0:118          Constant:
+0:118            0 (const int)
+0:118        direct index ( temp highp float)
+0:118          't' ( in highp 3-component vector of float)
+0:118          Constant:
+0:118            0 (const int)
+0:119      move second child to first child ( temp highp float)
+0:119        direct index ( temp highp float)
+0:119          'v' ( temp highp 3-component vector of float)
+0:119          Constant:
+0:119            1 (const int)
+0:119        direct index ( temp highp float)
+0:119          't' ( in highp 3-component vector of float)
+0:119          Constant:
+0:119            1 (const int)
+0:120      move second child to first child ( temp highp float)
+0:120        direct index ( temp highp float)
+0:120          'v' ( temp highp 3-component vector of float)
+0:120          Constant:
+0:120            2 (const int)
+0:120        direct index ( temp highp float)
+0:120          'samp' ( temp highp 4-component vector of float)
+0:120          Constant:
+0:120            0 (const int)
+0:121      move second child to first child ( temp highp 3-component vector of float)
+0:121        vector swizzle ( temp highp 3-component vector of float)
+0:121          't' ( in highp 3-component vector of float)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121            Constant:
+0:121              2 (const int)
+0:121        vector swizzle ( temp highp 3-component vector of float)
+0:121          'v' ( temp highp 3-component vector of float)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121            Constant:
+0:121              2 (const int)
+0:122      Branch: Return with expression
+0:122        't' ( in highp 3-component vector of float)
+0:124  Function Definition: TDInstanceActive(i1; ( global bool)
+0:124    Function Parameters: 
+0:124      'index' ( in highp int)
+0:125    Sequence
+0:125      subtract second child into first child ( temp highp int)
+0:125        'index' ( in highp int)
+0:125        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:125          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:125          Constant:
+0:125            0 (const uint)
+0:127      Sequence
+0:127        move second child to first child ( temp highp int)
+0:127          'coord' ( temp highp int)
+0:127          'index' ( in highp int)
+0:128      Sequence
+0:128        move second child to first child ( temp highp 4-component vector of float)
+0:128          'samp' ( temp highp 4-component vector of float)
+0:128          textureFetch ( global highp 4-component vector of float)
+0:128            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:128            'coord' ( temp highp int)
+0:129      move second child to first child ( temp highp float)
+0:129        'v' ( temp highp float)
+0:129        direct index ( temp highp float)
+0:129          'samp' ( temp highp 4-component vector of float)
+0:129          Constant:
+0:129            0 (const int)
+0:130      Branch: Return with expression
+0:130        Compare Not Equal ( temp bool)
+0:130          'v' ( temp highp float)
+0:130          Constant:
+0:130            0.000000
+0:132  Function Definition: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:132    Function Parameters: 
+0:132      'index' ( in highp int)
+0:132      'instanceActive' ( out bool)
+0:133    Sequence
+0:133      Sequence
+0:133        move second child to first child ( temp highp int)
+0:133          'origIndex' ( temp highp int)
+0:133          'index' ( in highp int)
+0:134      subtract second child into first child ( temp highp int)
+0:134        'index' ( in highp int)
+0:134        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:134          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:134          Constant:
+0:134            0 (const uint)
+0:136      Sequence
+0:136        move second child to first child ( temp highp int)
+0:136          'coord' ( temp highp int)
+0:136          'index' ( in highp int)
+0:137      Sequence
+0:137        move second child to first child ( temp highp 4-component vector of float)
+0:137          'samp' ( temp highp 4-component vector of float)
+0:137          textureFetch ( global highp 4-component vector of float)
+0:137            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:137            'coord' ( temp highp int)
+0:138      move second child to first child ( temp highp float)
+0:138        direct index ( temp highp float)
+0:138          'v' ( temp highp 3-component vector of float)
+0:138          Constant:
+0:138            0 (const int)
+0:138        direct index ( temp highp float)
+0:138          'samp' ( temp highp 4-component vector of float)
+0:138          Constant:
+0:138            1 (const int)
+0:139      move second child to first child ( temp highp float)
+0:139        direct index ( temp highp float)
+0:139          'v' ( temp highp 3-component vector of float)
+0:139          Constant:
+0:139            1 (const int)
+0:139        direct index ( temp highp float)
+0:139          'samp' ( temp highp 4-component vector of float)
+0:139          Constant:
+0:139            2 (const int)
+0:140      move second child to first child ( temp highp float)
+0:140        direct index ( temp highp float)
+0:140          'v' ( temp highp 3-component vector of float)
+0:140          Constant:
+0:140            2 (const int)
+0:140        direct index ( temp highp float)
+0:140          'samp' ( temp highp 4-component vector of float)
+0:140          Constant:
+0:140            3 (const int)
+0:141      move second child to first child ( temp bool)
+0:141        'instanceActive' ( out bool)
+0:141        Compare Not Equal ( temp bool)
+0:141          direct index ( temp highp float)
+0:141            'samp' ( temp highp 4-component vector of float)
+0:141            Constant:
+0:141              0 (const int)
+0:141          Constant:
+0:141            0.000000
+0:142      Branch: Return with expression
+0:142        'v' ( temp highp 3-component vector of float)
+0:144  Function Definition: TDInstanceTranslate(i1; ( global highp 3-component vector of float)
+0:144    Function Parameters: 
+0:144      'index' ( in highp int)
+0:145    Sequence
+0:145      subtract second child into first child ( temp highp int)
+0:145        'index' ( in highp int)
+0:145        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:145          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:145          Constant:
+0:145            0 (const uint)
+0:147      Sequence
+0:147        move second child to first child ( temp highp int)
+0:147          'coord' ( temp highp int)
+0:147          'index' ( in highp int)
+0:148      Sequence
+0:148        move second child to first child ( temp highp 4-component vector of float)
+0:148          'samp' ( temp highp 4-component vector of float)
+0:148          textureFetch ( global highp 4-component vector of float)
+0:148            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:148            'coord' ( temp highp int)
+0:149      move second child to first child ( temp highp float)
+0:149        direct index ( temp highp float)
+0:149          'v' ( temp highp 3-component vector of float)
+0:149          Constant:
+0:149            0 (const int)
+0:149        direct index ( temp highp float)
+0:149          'samp' ( temp highp 4-component vector of float)
+0:149          Constant:
+0:149            1 (const int)
+0:150      move second child to first child ( temp highp float)
+0:150        direct index ( temp highp float)
+0:150          'v' ( temp highp 3-component vector of float)
+0:150          Constant:
+0:150            1 (const int)
+0:150        direct index ( temp highp float)
+0:150          'samp' ( temp highp 4-component vector of float)
+0:150          Constant:
+0:150            2 (const int)
+0:151      move second child to first child ( temp highp float)
+0:151        direct index ( temp highp float)
+0:151          'v' ( temp highp 3-component vector of float)
+0:151          Constant:
+0:151            2 (const int)
+0:151        direct index ( temp highp float)
+0:151          'samp' ( temp highp 4-component vector of float)
+0:151          Constant:
+0:151            3 (const int)
+0:152      Branch: Return with expression
+0:152        'v' ( temp highp 3-component vector of float)
+0:154  Function Definition: TDInstanceRotateMat(i1; ( global highp 3X3 matrix of float)
+0:154    Function Parameters: 
+0:154      'index' ( in highp int)
+0:155    Sequence
+0:155      subtract second child into first child ( temp highp int)
+0:155        'index' ( in highp int)
+0:155        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:155          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:155          Constant:
+0:155            0 (const uint)
+0:156      Sequence
+0:156        move second child to first child ( temp highp 3-component vector of float)
+0:156          'v' ( temp highp 3-component vector of float)
+0:156          Constant:
+0:156            0.000000
+0:156            0.000000
+0:156            0.000000
+0:157      Sequence
+0:157        move second child to first child ( temp highp 3X3 matrix of float)
+0:157          'm' ( temp highp 3X3 matrix of float)
+0:157          Constant:
+0:157            1.000000
+0:157            0.000000
+0:157            0.000000
+0:157            0.000000
+0:157            1.000000
+0:157            0.000000
+0:157            0.000000
+0:157            0.000000
+0:157            1.000000
+0:161      Branch: Return with expression
+0:161        'm' ( temp highp 3X3 matrix of float)
+0:163  Function Definition: TDInstanceScale(i1; ( global highp 3-component vector of float)
+0:163    Function Parameters: 
+0:163      'index' ( in highp int)
+0:164    Sequence
+0:164      subtract second child into first child ( temp highp int)
+0:164        'index' ( in highp int)
+0:164        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:164          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:164          Constant:
+0:164            0 (const uint)
+0:165      Sequence
+0:165        move second child to first child ( temp highp 3-component vector of float)
+0:165          'v' ( temp highp 3-component vector of float)
+0:165          Constant:
+0:165            1.000000
+0:165            1.000000
+0:165            1.000000
+0:166      Branch: Return with expression
+0:166        'v' ( temp highp 3-component vector of float)
+0:168  Function Definition: TDInstancePivot(i1; ( global highp 3-component vector of float)
+0:168    Function Parameters: 
+0:168      'index' ( in highp int)
+0:169    Sequence
+0:169      subtract second child into first child ( temp highp int)
+0:169        'index' ( in highp int)
+0:169        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:169          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:169          Constant:
+0:169            0 (const uint)
+0:170      Sequence
+0:170        move second child to first child ( temp highp 3-component vector of float)
+0:170          'v' ( temp highp 3-component vector of float)
+0:170          Constant:
+0:170            0.000000
+0:170            0.000000
+0:170            0.000000
+0:171      Branch: Return with expression
+0:171        'v' ( temp highp 3-component vector of float)
+0:173  Function Definition: TDInstanceRotTo(i1; ( global highp 3-component vector of float)
+0:173    Function Parameters: 
+0:173      'index' ( in highp int)
+0:174    Sequence
+0:174      subtract second child into first child ( temp highp int)
+0:174        'index' ( in highp int)
+0:174        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:174          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:174          Constant:
+0:174            0 (const uint)
+0:175      Sequence
+0:175        move second child to first child ( temp highp 3-component vector of float)
+0:175          'v' ( temp highp 3-component vector of float)
+0:175          Constant:
+0:175            0.000000
+0:175            0.000000
+0:175            1.000000
+0:176      Branch: Return with expression
+0:176        'v' ( temp highp 3-component vector of float)
+0:178  Function Definition: TDInstanceRotUp(i1; ( global highp 3-component vector of float)
+0:178    Function Parameters: 
+0:178      'index' ( in highp int)
+0:179    Sequence
+0:179      subtract second child into first child ( temp highp int)
+0:179        'index' ( in highp int)
+0:179        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:179          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:179          Constant:
+0:179            0 (const uint)
+0:180      Sequence
+0:180        move second child to first child ( temp highp 3-component vector of float)
+0:180          'v' ( temp highp 3-component vector of float)
+0:180          Constant:
+0:180            0.000000
+0:180            1.000000
+0:180            0.000000
+0:181      Branch: Return with expression
+0:181        'v' ( temp highp 3-component vector of float)
+0:183  Function Definition: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:183    Function Parameters: 
+0:183      'id' ( in highp int)
+0:184    Sequence
+0:184      Sequence
+0:184        move second child to first child ( temp bool)
+0:184          'instanceActive' ( temp bool)
+0:184          Constant:
+0:184            true (const bool)
+0:185      Sequence
+0:185        move second child to first child ( temp highp 3-component vector of float)
+0:185          't' ( temp highp 3-component vector of float)
+0:185          Function Call: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:185            'id' ( in highp int)
+0:185            'instanceActive' ( temp bool)
+0:186      Test condition and select ( temp void)
+0:186        Condition
+0:186        Negate conditional ( temp bool)
+0:186          'instanceActive' ( temp bool)
+0:186        true case
+0:188        Sequence
+0:188          Branch: Return with expression
+0:188            Constant:
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:190      Sequence
+0:190        move second child to first child ( temp highp 4X4 matrix of float)
+0:190          'm' ( temp highp 4X4 matrix of float)
+0:190          Constant:
+0:190            1.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            1.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            1.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            1.000000
+0:192      Sequence
+0:192        Sequence
+0:192          move second child to first child ( temp highp 3-component vector of float)
+0:192            'tt' ( temp highp 3-component vector of float)
+0:192            't' ( temp highp 3-component vector of float)
+0:193        add second child into first child ( temp highp float)
+0:193          direct index ( temp highp float)
+0:193            direct index ( temp highp 4-component vector of float)
+0:193              'm' ( temp highp 4X4 matrix of float)
+0:193              Constant:
+0:193                3 (const int)
+0:193            Constant:
+0:193              0 (const int)
+0:193          component-wise multiply ( temp highp float)
+0:193            direct index ( temp highp float)
+0:193              direct index ( temp highp 4-component vector of float)
+0:193                'm' ( temp highp 4X4 matrix of float)
+0:193                Constant:
+0:193                  0 (const int)
+0:193              Constant:
+0:193                0 (const int)
+0:193            direct index ( temp highp float)
+0:193              'tt' ( temp highp 3-component vector of float)
+0:193              Constant:
+0:193                0 (const int)
+0:194        add second child into first child ( temp highp float)
+0:194          direct index ( temp highp float)
+0:194            direct index ( temp highp 4-component vector of float)
+0:194              'm' ( temp highp 4X4 matrix of float)
+0:194              Constant:
+0:194                3 (const int)
+0:194            Constant:
+0:194              1 (const int)
+0:194          component-wise multiply ( temp highp float)
+0:194            direct index ( temp highp float)
+0:194              direct index ( temp highp 4-component vector of float)
+0:194                'm' ( temp highp 4X4 matrix of float)
+0:194                Constant:
+0:194                  0 (const int)
+0:194              Constant:
+0:194                1 (const int)
+0:194            direct index ( temp highp float)
+0:194              'tt' ( temp highp 3-component vector of float)
+0:194              Constant:
+0:194                0 (const int)
+0:195        add second child into first child ( temp highp float)
+0:195          direct index ( temp highp float)
+0:195            direct index ( temp highp 4-component vector of float)
+0:195              'm' ( temp highp 4X4 matrix of float)
+0:195              Constant:
+0:195                3 (const int)
+0:195            Constant:
+0:195              2 (const int)
+0:195          component-wise multiply ( temp highp float)
+0:195            direct index ( temp highp float)
+0:195              direct index ( temp highp 4-component vector of float)
+0:195                'm' ( temp highp 4X4 matrix of float)
+0:195                Constant:
+0:195                  0 (const int)
+0:195              Constant:
+0:195                2 (const int)
+0:195            direct index ( temp highp float)
+0:195              'tt' ( temp highp 3-component vector of float)
+0:195              Constant:
+0:195                0 (const int)
+0:196        add second child into first child ( temp highp float)
+0:196          direct index ( temp highp float)
+0:196            direct index ( temp highp 4-component vector of float)
+0:196              'm' ( temp highp 4X4 matrix of float)
+0:196              Constant:
+0:196                3 (const int)
+0:196            Constant:
+0:196              3 (const int)
+0:196          component-wise multiply ( temp highp float)
+0:196            direct index ( temp highp float)
+0:196              direct index ( temp highp 4-component vector of float)
+0:196                'm' ( temp highp 4X4 matrix of float)
+0:196                Constant:
+0:196                  0 (const int)
+0:196              Constant:
+0:196                3 (const int)
+0:196            direct index ( temp highp float)
+0:196              'tt' ( temp highp 3-component vector of float)
+0:196              Constant:
+0:196                0 (const int)
+0:197        add second child into first child ( temp highp float)
+0:197          direct index ( temp highp float)
+0:197            direct index ( temp highp 4-component vector of float)
+0:197              'm' ( temp highp 4X4 matrix of float)
+0:197              Constant:
+0:197                3 (const int)
+0:197            Constant:
+0:197              0 (const int)
+0:197          component-wise multiply ( temp highp float)
+0:197            direct index ( temp highp float)
+0:197              direct index ( temp highp 4-component vector of float)
+0:197                'm' ( temp highp 4X4 matrix of float)
+0:197                Constant:
+0:197                  1 (const int)
+0:197              Constant:
+0:197                0 (const int)
+0:197            direct index ( temp highp float)
+0:197              'tt' ( temp highp 3-component vector of float)
+0:197              Constant:
+0:197                1 (const int)
+0:198        add second child into first child ( temp highp float)
+0:198          direct index ( temp highp float)
+0:198            direct index ( temp highp 4-component vector of float)
+0:198              'm' ( temp highp 4X4 matrix of float)
+0:198              Constant:
+0:198                3 (const int)
+0:198            Constant:
+0:198              1 (const int)
+0:198          component-wise multiply ( temp highp float)
+0:198            direct index ( temp highp float)
+0:198              direct index ( temp highp 4-component vector of float)
+0:198                'm' ( temp highp 4X4 matrix of float)
+0:198                Constant:
+0:198                  1 (const int)
+0:198              Constant:
+0:198                1 (const int)
+0:198            direct index ( temp highp float)
+0:198              'tt' ( temp highp 3-component vector of float)
+0:198              Constant:
+0:198                1 (const int)
+0:199        add second child into first child ( temp highp float)
+0:199          direct index ( temp highp float)
+0:199            direct index ( temp highp 4-component vector of float)
+0:199              'm' ( temp highp 4X4 matrix of float)
+0:199              Constant:
+0:199                3 (const int)
+0:199            Constant:
+0:199              2 (const int)
+0:199          component-wise multiply ( temp highp float)
+0:199            direct index ( temp highp float)
+0:199              direct index ( temp highp 4-component vector of float)
+0:199                'm' ( temp highp 4X4 matrix of float)
+0:199                Constant:
+0:199                  1 (const int)
+0:199              Constant:
+0:199                2 (const int)
+0:199            direct index ( temp highp float)
+0:199              'tt' ( temp highp 3-component vector of float)
+0:199              Constant:
+0:199                1 (const int)
+0:200        add second child into first child ( temp highp float)
+0:200          direct index ( temp highp float)
+0:200            direct index ( temp highp 4-component vector of float)
+0:200              'm' ( temp highp 4X4 matrix of float)
+0:200              Constant:
+0:200                3 (const int)
+0:200            Constant:
+0:200              3 (const int)
+0:200          component-wise multiply ( temp highp float)
+0:200            direct index ( temp highp float)
+0:200              direct index ( temp highp 4-component vector of float)
+0:200                'm' ( temp highp 4X4 matrix of float)
+0:200                Constant:
+0:200                  1 (const int)
+0:200              Constant:
+0:200                3 (const int)
+0:200            direct index ( temp highp float)
+0:200              'tt' ( temp highp 3-component vector of float)
+0:200              Constant:
+0:200                1 (const int)
+0:201        add second child into first child ( temp highp float)
+0:201          direct index ( temp highp float)
+0:201            direct index ( temp highp 4-component vector of float)
+0:201              'm' ( temp highp 4X4 matrix of float)
+0:201              Constant:
+0:201                3 (const int)
+0:201            Constant:
+0:201              0 (const int)
+0:201          component-wise multiply ( temp highp float)
+0:201            direct index ( temp highp float)
+0:201              direct index ( temp highp 4-component vector of float)
+0:201                'm' ( temp highp 4X4 matrix of float)
+0:201                Constant:
+0:201                  2 (const int)
+0:201              Constant:
+0:201                0 (const int)
+0:201            direct index ( temp highp float)
+0:201              'tt' ( temp highp 3-component vector of float)
+0:201              Constant:
+0:201                2 (const int)
+0:202        add second child into first child ( temp highp float)
+0:202          direct index ( temp highp float)
+0:202            direct index ( temp highp 4-component vector of float)
+0:202              'm' ( temp highp 4X4 matrix of float)
+0:202              Constant:
+0:202                3 (const int)
+0:202            Constant:
+0:202              1 (const int)
+0:202          component-wise multiply ( temp highp float)
+0:202            direct index ( temp highp float)
+0:202              direct index ( temp highp 4-component vector of float)
+0:202                'm' ( temp highp 4X4 matrix of float)
+0:202                Constant:
+0:202                  2 (const int)
+0:202              Constant:
+0:202                1 (const int)
+0:202            direct index ( temp highp float)
+0:202              'tt' ( temp highp 3-component vector of float)
+0:202              Constant:
+0:202                2 (const int)
+0:203        add second child into first child ( temp highp float)
+0:203          direct index ( temp highp float)
+0:203            direct index ( temp highp 4-component vector of float)
+0:203              'm' ( temp highp 4X4 matrix of float)
+0:203              Constant:
+0:203                3 (const int)
+0:203            Constant:
+0:203              2 (const int)
+0:203          component-wise multiply ( temp highp float)
+0:203            direct index ( temp highp float)
+0:203              direct index ( temp highp 4-component vector of float)
+0:203                'm' ( temp highp 4X4 matrix of float)
+0:203                Constant:
+0:203                  2 (const int)
+0:203              Constant:
+0:203                2 (const int)
+0:203            direct index ( temp highp float)
+0:203              'tt' ( temp highp 3-component vector of float)
+0:203              Constant:
+0:203                2 (const int)
+0:204        add second child into first child ( temp highp float)
+0:204          direct index ( temp highp float)
+0:204            direct index ( temp highp 4-component vector of float)
+0:204              'm' ( temp highp 4X4 matrix of float)
+0:204              Constant:
+0:204                3 (const int)
+0:204            Constant:
+0:204              3 (const int)
+0:204          component-wise multiply ( temp highp float)
+0:204            direct index ( temp highp float)
+0:204              direct index ( temp highp 4-component vector of float)
+0:204                'm' ( temp highp 4X4 matrix of float)
+0:204                Constant:
+0:204                  2 (const int)
+0:204              Constant:
+0:204                3 (const int)
+0:204            direct index ( temp highp float)
+0:204              'tt' ( temp highp 3-component vector of float)
+0:204              Constant:
+0:204                2 (const int)
+0:206      Branch: Return with expression
+0:206        'm' ( temp highp 4X4 matrix of float)
+0:208  Function Definition: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:208    Function Parameters: 
+0:208      'id' ( in highp int)
+0:209    Sequence
+0:209      Sequence
+0:209        move second child to first child ( temp highp 3X3 matrix of float)
+0:209          'm' ( temp highp 3X3 matrix of float)
+0:209          Constant:
+0:209            1.000000
+0:209            0.000000
+0:209            0.000000
+0:209            0.000000
+0:209            1.000000
+0:209            0.000000
+0:209            0.000000
+0:209            0.000000
+0:209            1.000000
+0:210      Branch: Return with expression
+0:210        'm' ( temp highp 3X3 matrix of float)
+0:212  Function Definition: TDInstanceMat3ForNorm(i1; ( global highp 3X3 matrix of float)
+0:212    Function Parameters: 
+0:212      'id' ( in highp int)
+0:213    Sequence
+0:213      Sequence
+0:213        move second child to first child ( temp highp 3X3 matrix of float)
+0:213          'm' ( temp highp 3X3 matrix of float)
+0:213          Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:213            'id' ( in highp int)
+0:214      Branch: Return with expression
+0:214        'm' ( temp highp 3X3 matrix of float)
+0:216  Function Definition: TDInstanceColor(i1;vf4; ( global highp 4-component vector of float)
+0:216    Function Parameters: 
+0:216      'index' ( in highp int)
+0:216      'curColor' ( in highp 4-component vector of float)
+0:217    Sequence
+0:217      subtract second child into first child ( temp highp int)
+0:217        'index' ( in highp int)
+0:217        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:217          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:217          Constant:
+0:217            0 (const uint)
+0:219      Sequence
+0:219        move second child to first child ( temp highp int)
+0:219          'coord' ( temp highp int)
+0:219          'index' ( in highp int)
+0:220      Sequence
+0:220        move second child to first child ( temp highp 4-component vector of float)
+0:220          'samp' ( temp highp 4-component vector of float)
+0:220          textureFetch ( global highp 4-component vector of float)
+0:220            'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+0:220            'coord' ( temp highp int)
+0:221      move second child to first child ( temp highp float)
+0:221        direct index ( temp highp float)
+0:221          'v' ( temp highp 4-component vector of float)
+0:221          Constant:
+0:221            0 (const int)
+0:221        direct index ( temp highp float)
+0:221          'samp' ( temp highp 4-component vector of float)
+0:221          Constant:
+0:221            0 (const int)
+0:222      move second child to first child ( temp highp float)
+0:222        direct index ( temp highp float)
+0:222          'v' ( temp highp 4-component vector of float)
+0:222          Constant:
+0:222            1 (const int)
+0:222        direct index ( temp highp float)
+0:222          'samp' ( temp highp 4-component vector of float)
+0:222          Constant:
+0:222            1 (const int)
+0:223      move second child to first child ( temp highp float)
+0:223        direct index ( temp highp float)
+0:223          'v' ( temp highp 4-component vector of float)
+0:223          Constant:
+0:223            2 (const int)
+0:223        direct index ( temp highp float)
+0:223          'samp' ( temp highp 4-component vector of float)
+0:223          Constant:
+0:223            2 (const int)
+0:224      move second child to first child ( temp highp float)
+0:224        direct index ( temp highp float)
+0:224          'v' ( temp highp 4-component vector of float)
+0:224          Constant:
+0:224            3 (const int)
+0:224        Constant:
+0:224          1.000000
+0:225      move second child to first child ( temp highp float)
+0:225        direct index ( temp highp float)
+0:225          'curColor' ( in highp 4-component vector of float)
+0:225          Constant:
+0:225            0 (const int)
+0:225        direct index ( temp highp float)
+0:225          'v' ( temp highp 4-component vector of float)
+0:225          Constant:
+0:225            0 (const int)
+0:227      move second child to first child ( temp highp float)
+0:227        direct index ( temp highp float)
+0:227          'curColor' ( in highp 4-component vector of float)
+0:227          Constant:
+0:227            1 (const int)
+0:227        direct index ( temp highp float)
+0:227          'v' ( temp highp 4-component vector of float)
+0:227          Constant:
+0:227            1 (const int)
+0:229      move second child to first child ( temp highp float)
+0:229        direct index ( temp highp float)
+0:229          'curColor' ( in highp 4-component vector of float)
+0:229          Constant:
+0:229            2 (const int)
+0:229        direct index ( temp highp float)
+0:229          'v' ( temp highp 4-component vector of float)
+0:229          Constant:
+0:229            2 (const int)
+0:231      Branch: Return with expression
+0:231        'curColor' ( in highp 4-component vector of float)
+0:233  Function Definition: TDInstanceDeform(i1;vf4; ( global highp 4-component vector of float)
+0:233    Function Parameters: 
+0:233      'id' ( in highp int)
+0:233      'pos' ( in highp 4-component vector of float)
+0:234    Sequence
+0:234      move second child to first child ( temp highp 4-component vector of float)
+0:234        'pos' ( in highp 4-component vector of float)
+0:234        matrix-times-vector ( temp highp 4-component vector of float)
+0:234          Function Call: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:234            'id' ( in highp int)
+0:234          'pos' ( in highp 4-component vector of float)
+0:235      Branch: Return with expression
+0:235        matrix-times-vector ( temp highp 4-component vector of float)
+0:235          world: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:235            indirect index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:235              uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:235                'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:235                Constant:
+0:235                  0 (const uint)
+0:235              Function Call: TDCameraIndex( ( global highp int)
+0:235            Constant:
+0:235              0 (const int)
+0:235          'pos' ( in highp 4-component vector of float)
+0:238  Function Definition: TDInstanceDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:238    Function Parameters: 
+0:238      'id' ( in highp int)
+0:238      'vec' ( in highp 3-component vector of float)
+0:240    Sequence
+0:240      Sequence
+0:240        move second child to first child ( temp highp 3X3 matrix of float)
+0:240          'm' ( temp highp 3X3 matrix of float)
+0:240          Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:240            'id' ( in highp int)
+0:241      Branch: Return with expression
+0:241        matrix-times-vector ( temp highp 3-component vector of float)
+0:241          Construct mat3 ( temp highp 3X3 matrix of float)
+0:241            world: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:241              indirect index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:241                uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:241                  'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:241                  Constant:
+0:241                    0 (const uint)
+0:241                Function Call: TDCameraIndex( ( global highp int)
+0:241              Constant:
+0:241                0 (const int)
+0:241          matrix-times-vector ( temp highp 3-component vector of float)
+0:241            'm' ( temp highp 3X3 matrix of float)
+0:241            'vec' ( in highp 3-component vector of float)
+0:243  Function Definition: TDInstanceDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:243    Function Parameters: 
+0:243      'id' ( in highp int)
+0:243      'vec' ( in highp 3-component vector of float)
+0:245    Sequence
+0:245      Sequence
+0:245        move second child to first child ( temp highp 3X3 matrix of float)
+0:245          'm' ( temp highp 3X3 matrix of float)
+0:245          Function Call: TDInstanceMat3ForNorm(i1; ( global highp 3X3 matrix of float)
+0:245            'id' ( in highp int)
+0:246      Branch: Return with expression
+0:246        matrix-times-vector ( temp highp 3-component vector of float)
+0:246          Construct mat3 ( temp highp 3X3 matrix of float)
+0:246            worldForNormals: direct index for structure (layout( column_major std140) global highp 3X3 matrix of float)
+0:246              indirect index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:246                uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:246                  'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:246                  Constant:
+0:246                    0 (const uint)
+0:246                Function Call: TDCameraIndex( ( global highp int)
+0:246              Constant:
+0:246                13 (const int)
+0:246          matrix-times-vector ( temp highp 3-component vector of float)
+0:246            'm' ( temp highp 3X3 matrix of float)
+0:246            'vec' ( in highp 3-component vector of float)
+0:248  Function Definition: TDInstanceDeform(vf4; ( global highp 4-component vector of float)
+0:248    Function Parameters: 
+0:248      'pos' ( in highp 4-component vector of float)
+0:249    Sequence
+0:249      Branch: Return with expression
+0:249        Function Call: TDInstanceDeform(i1;vf4; ( global highp 4-component vector of float)
+0:249          Function Call: TDInstanceID( ( global highp int)
+0:249          'pos' ( in highp 4-component vector of float)
+0:251  Function Definition: TDInstanceDeformVec(vf3; ( global highp 3-component vector of float)
+0:251    Function Parameters: 
+0:251      'vec' ( in highp 3-component vector of float)
+0:252    Sequence
+0:252      Branch: Return with expression
+0:252        Function Call: TDInstanceDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:252          Function Call: TDInstanceID( ( global highp int)
+0:252          'vec' ( in highp 3-component vector of float)
+0:254  Function Definition: TDInstanceDeformNorm(vf3; ( global highp 3-component vector of float)
+0:254    Function Parameters: 
+0:254      'vec' ( in highp 3-component vector of float)
+0:255    Sequence
+0:255      Branch: Return with expression
+0:255        Function Call: TDInstanceDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:255          Function Call: TDInstanceID( ( global highp int)
+0:255          'vec' ( in highp 3-component vector of float)
+0:257  Function Definition: TDInstanceActive( ( global bool)
+0:257    Function Parameters: 
+0:257    Sequence
+0:257      Branch: Return with expression
+0:257        Function Call: TDInstanceActive(i1; ( global bool)
+0:257          Function Call: TDInstanceID( ( global highp int)
+0:258  Function Definition: TDInstanceTranslate( ( global highp 3-component vector of float)
+0:258    Function Parameters: 
+0:258    Sequence
+0:258      Branch: Return with expression
+0:258        Function Call: TDInstanceTranslate(i1; ( global highp 3-component vector of float)
+0:258          Function Call: TDInstanceID( ( global highp int)
+0:259  Function Definition: TDInstanceRotateMat( ( global highp 3X3 matrix of float)
+0:259    Function Parameters: 
+0:259    Sequence
+0:259      Branch: Return with expression
+0:259        Function Call: TDInstanceRotateMat(i1; ( global highp 3X3 matrix of float)
+0:259          Function Call: TDInstanceID( ( global highp int)
+0:260  Function Definition: TDInstanceScale( ( global highp 3-component vector of float)
+0:260    Function Parameters: 
+0:260    Sequence
+0:260      Branch: Return with expression
+0:260        Function Call: TDInstanceScale(i1; ( global highp 3-component vector of float)
+0:260          Function Call: TDInstanceID( ( global highp int)
+0:261  Function Definition: TDInstanceMat( ( global highp 4X4 matrix of float)
+0:261    Function Parameters: 
+0:261    Sequence
+0:261      Branch: Return with expression
+0:261        Function Call: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:261          Function Call: TDInstanceID( ( global highp int)
+0:263  Function Definition: TDInstanceMat3( ( global highp 3X3 matrix of float)
+0:263    Function Parameters: 
+0:263    Sequence
+0:263      Branch: Return with expression
+0:263        Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:263          Function Call: TDInstanceID( ( global highp int)
+0:265  Function Definition: TDInstanceTexCoord(vf3; ( global highp 3-component vector of float)
+0:265    Function Parameters: 
+0:265      't' ( in highp 3-component vector of float)
+0:266    Sequence
+0:266      Branch: Return with expression
+0:266        Function Call: TDInstanceTexCoord(i1;vf3; ( global highp 3-component vector of float)
+0:266          Function Call: TDInstanceID( ( global highp int)
+0:266          't' ( in highp 3-component vector of float)
+0:268  Function Definition: TDInstanceColor(vf4; ( global highp 4-component vector of float)
+0:268    Function Parameters: 
+0:268      'curColor' ( in highp 4-component vector of float)
+0:269    Sequence
+0:269      Branch: Return with expression
+0:269        Function Call: TDInstanceColor(i1;vf4; ( global highp 4-component vector of float)
+0:269          Function Call: TDInstanceID( ( global highp int)
+0:269          'curColor' ( in highp 4-component vector of float)
+0:271  Function Definition: TDSkinnedDeform(vf4; ( global highp 4-component vector of float)
+0:271    Function Parameters: 
+0:271      'pos' ( in highp 4-component vector of float)
+0:271    Sequence
+0:271      Branch: Return with expression
+0:271        'pos' ( in highp 4-component vector of float)
+0:273  Function Definition: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:273    Function Parameters: 
+0:273      'vec' ( in highp 3-component vector of float)
+0:273    Sequence
+0:273      Branch: Return with expression
+0:273        'vec' ( in highp 3-component vector of float)
+0:275  Function Definition: TDFastDeformTangent(vf3;vf4;vf3; ( global highp 3-component vector of float)
+0:275    Function Parameters: 
+0:275      'oldNorm' ( in highp 3-component vector of float)
+0:275      'oldTangent' ( in highp 4-component vector of float)
+0:275      'deformedNorm' ( in highp 3-component vector of float)
+0:276    Sequence
+0:276      Branch: Return with expression
+0:276        vector swizzle ( temp highp 3-component vector of float)
+0:276          'oldTangent' ( in highp 4-component vector of float)
+0:276          Sequence
+0:276            Constant:
+0:276              0 (const int)
+0:276            Constant:
+0:276              1 (const int)
+0:276            Constant:
+0:276              2 (const int)
+0:277  Function Definition: TDBoneMat(i1; ( global highp 4X4 matrix of float)
+0:277    Function Parameters: 
+0:277      'index' ( in highp int)
+0:278    Sequence
+0:278      Branch: Return with expression
+0:278        Constant:
+0:278          1.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          1.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          1.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          1.000000
+0:280  Function Definition: TDDeform(vf4; ( global highp 4-component vector of float)
+0:280    Function Parameters: 
+0:280      'pos' ( in highp 4-component vector of float)
+0:281    Sequence
+0:281      move second child to first child ( temp highp 4-component vector of float)
+0:281        'pos' ( in highp 4-component vector of float)
+0:281        Function Call: TDSkinnedDeform(vf4; ( global highp 4-component vector of float)
+0:281          'pos' ( in highp 4-component vector of float)
+0:282      move second child to first child ( temp highp 4-component vector of float)
+0:282        'pos' ( in highp 4-component vector of float)
+0:282        Function Call: TDInstanceDeform(vf4; ( global highp 4-component vector of float)
+0:282          'pos' ( in highp 4-component vector of float)
+0:283      Branch: Return with expression
+0:283        'pos' ( in highp 4-component vector of float)
+0:286  Function Definition: TDDeform(i1;vf3; ( global highp 4-component vector of float)
+0:286    Function Parameters: 
+0:286      'instanceID' ( in highp int)
+0:286      'p' ( in highp 3-component vector of float)
+0:287    Sequence
+0:287      Sequence
+0:287        move second child to first child ( temp highp 4-component vector of float)
+0:287          'pos' ( temp highp 4-component vector of float)
+0:287          Construct vec4 ( temp highp 4-component vector of float)
+0:287            'p' ( in highp 3-component vector of float)
+0:287            Constant:
+0:287              1.000000
+0:288      move second child to first child ( temp highp 4-component vector of float)
+0:288        'pos' ( temp highp 4-component vector of float)
+0:288        Function Call: TDSkinnedDeform(vf4; ( global highp 4-component vector of float)
+0:288          'pos' ( temp highp 4-component vector of float)
+0:289      move second child to first child ( temp highp 4-component vector of float)
+0:289        'pos' ( temp highp 4-component vector of float)
+0:289        Function Call: TDInstanceDeform(i1;vf4; ( global highp 4-component vector of float)
+0:289          'instanceID' ( in highp int)
+0:289          'pos' ( temp highp 4-component vector of float)
+0:290      Branch: Return with expression
+0:290        'pos' ( temp highp 4-component vector of float)
+0:293  Function Definition: TDDeform(vf3; ( global highp 4-component vector of float)
+0:293    Function Parameters: 
+0:293      'pos' ( in highp 3-component vector of float)
+0:294    Sequence
+0:294      Branch: Return with expression
+0:294        Function Call: TDDeform(i1;vf3; ( global highp 4-component vector of float)
+0:294          Function Call: TDInstanceID( ( global highp int)
+0:294          'pos' ( in highp 3-component vector of float)
+0:297  Function Definition: TDDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:297    Function Parameters: 
+0:297      'instanceID' ( in highp int)
+0:297      'vec' ( in highp 3-component vector of float)
+0:298    Sequence
+0:298      move second child to first child ( temp highp 3-component vector of float)
+0:298        'vec' ( in highp 3-component vector of float)
+0:298        Function Call: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:298          'vec' ( in highp 3-component vector of float)
+0:299      move second child to first child ( temp highp 3-component vector of float)
+0:299        'vec' ( in highp 3-component vector of float)
+0:299        Function Call: TDInstanceDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:299          'instanceID' ( in highp int)
+0:299          'vec' ( in highp 3-component vector of float)
+0:300      Branch: Return with expression
+0:300        'vec' ( in highp 3-component vector of float)
+0:303  Function Definition: TDDeformVec(vf3; ( global highp 3-component vector of float)
+0:303    Function Parameters: 
+0:303      'vec' ( in highp 3-component vector of float)
+0:304    Sequence
+0:304      Branch: Return with expression
+0:304        Function Call: TDDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:304          Function Call: TDInstanceID( ( global highp int)
+0:304          'vec' ( in highp 3-component vector of float)
+0:307  Function Definition: TDDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:307    Function Parameters: 
+0:307      'instanceID' ( in highp int)
+0:307      'vec' ( in highp 3-component vector of float)
+0:308    Sequence
+0:308      move second child to first child ( temp highp 3-component vector of float)
+0:308        'vec' ( in highp 3-component vector of float)
+0:308        Function Call: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:308          'vec' ( in highp 3-component vector of float)
+0:309      move second child to first child ( temp highp 3-component vector of float)
+0:309        'vec' ( in highp 3-component vector of float)
+0:309        Function Call: TDInstanceDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:309          'instanceID' ( in highp int)
+0:309          'vec' ( in highp 3-component vector of float)
+0:310      Branch: Return with expression
+0:310        'vec' ( in highp 3-component vector of float)
+0:313  Function Definition: TDDeformNorm(vf3; ( global highp 3-component vector of float)
+0:313    Function Parameters: 
+0:313      'vec' ( in highp 3-component vector of float)
+0:314    Sequence
+0:314      Branch: Return with expression
+0:314        Function Call: TDDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:314          Function Call: TDInstanceID( ( global highp int)
+0:314          'vec' ( in highp 3-component vector of float)
+0:317  Function Definition: TDSkinnedDeformNorm(vf3; ( global highp 3-component vector of float)
+0:317    Function Parameters: 
+0:317      'vec' ( in highp 3-component vector of float)
+0:318    Sequence
+0:318      move second child to first child ( temp highp 3-component vector of float)
+0:318        'vec' ( in highp 3-component vector of float)
+0:318        Function Call: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:318          'vec' ( in highp 3-component vector of float)
+0:319      Branch: Return with expression
+0:319        'vec' ( in highp 3-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float position,  global highp 3-component vector of float direction,  global highp 3-component vector of float diffuse,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float lightSize,  global highp 4-component vector of float misc,  global highp 4-component vector of float coneLookupScaleBias,  global highp 4-component vector of float attenScaleBiasRoll, layout( column_major std140) global highp 4X4 matrix of float shadowMapMatrix, layout( column_major std140) global highp 4X4 matrix of float shadowMapCamMatrix,  global highp 4-component vector of float shadowMapRes, layout( column_major std140) global highp 4X4 matrix of float projMapMatrix} uTDLights})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 3-component vector of float color, layout( column_major std140) global highp 3X3 matrix of float rotate} uTDEnvLights})
+0:?     'uTDEnvLightBuffers' (layout( column_major std430) restrict readonly buffer 1-element array of block{layout( column_major std430 offset=0) restrict readonly buffer 9-element array of highp 3-component vector of float shCoeffs})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@4' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@5' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:?     'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:?     'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+0:?     'gl_VertexIndex' ( in int VertexIndex)
+0:?     'gl_InstanceIndex' ( in int InstanceIndex)
+
+vk.relaxed.stagelink.0.0.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:95  Function Definition: main( ( global void)
+0:95    Function Parameters: 
+0:99    Sequence
+0:99      Function Call: TDCheckDiscard( ( global void)
+0:101      Sequence
+0:101        move second child to first child ( temp highp 4-component vector of float)
+0:101          'outcol' ( temp highp 4-component vector of float)
+0:101          Constant:
+0:101            0.000000
+0:101            0.000000
+0:101            0.000000
+0:101            0.000000
+0:103      Sequence
+0:103        move second child to first child ( temp highp 3-component vector of float)
+0:103          'texCoord0' ( temp highp 3-component vector of float)
+0:103          vector swizzle ( temp highp 3-component vector of float)
+0:103            texCoord0: direct index for structure ( in highp 3-component vector of float)
+0:103              'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:103              Constant:
+0:103                2 (const int)
+0:103            Sequence
+0:103              Constant:
+0:103                0 (const int)
+0:103              Constant:
+0:103                1 (const int)
+0:103              Constant:
+0:103                2 (const int)
+0:104      Sequence
+0:104        move second child to first child ( temp highp float)
+0:104          'actualTexZ' ( temp highp float)
+0:104          mod ( global highp float)
+0:104            Convert int to float ( temp highp float)
+0:104              Convert float to int ( temp highp int)
+0:104                direct index ( temp highp float)
+0:104                  'texCoord0' ( temp highp 3-component vector of float)
+0:104                  Constant:
+0:104                    2 (const int)
+0:104            Constant:
+0:104              2048.000000
+0:105      Sequence
+0:105        move second child to first child ( temp highp float)
+0:105          'instanceLoop' ( temp highp float)
+0:105          Floor ( global highp float)
+0:105            Convert int to float ( temp highp float)
+0:105              divide ( temp highp int)
+0:105                Convert float to int ( temp highp int)
+0:105                  direct index ( temp highp float)
+0:105                    'texCoord0' ( temp highp 3-component vector of float)
+0:105                    Constant:
+0:105                      2 (const int)
+0:105                Constant:
+0:105                  2048 (const int)
+0:106      move second child to first child ( temp highp float)
+0:106        direct index ( temp highp float)
+0:106          'texCoord0' ( temp highp 3-component vector of float)
+0:106          Constant:
+0:106            2 (const int)
+0:106        'actualTexZ' ( temp highp float)
+0:107      Sequence
+0:107        move second child to first child ( temp highp 4-component vector of float)
+0:107          'colorMapColor' ( temp highp 4-component vector of float)
+0:107          texture ( global highp 4-component vector of float)
+0:107            'sColorMap' ( uniform highp sampler2DArray)
+0:107            vector swizzle ( temp highp 3-component vector of float)
+0:107              'texCoord0' ( temp highp 3-component vector of float)
+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      Sequence
+0:109        move second child to first child ( temp highp float)
+0:109          'red' ( temp highp float)
+0:109          indirect index ( temp highp float)
+0:109            'colorMapColor' ( temp highp 4-component vector of float)
+0:109            Convert float to int ( temp highp int)
+0:109              'instanceLoop' ( temp highp float)
+0:110      move second child to first child ( temp highp 4-component vector of float)
+0:110        'colorMapColor' ( temp highp 4-component vector of float)
+0:110        Construct vec4 ( temp highp 4-component vector of float)
+0:110          'red' ( temp highp float)
+0:112      add second child into first child ( temp highp 3-component vector of float)
+0:112        vector swizzle ( temp highp 3-component vector of float)
+0:112          'outcol' ( temp highp 4-component vector of float)
+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        component-wise multiply ( temp highp 3-component vector of float)
+0:112          uConstant: direct index for structure ( uniform highp 3-component vector of float)
+0:112            'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:112            Constant:
+0:112              3 (const uint)
+0:112          vector swizzle ( temp highp 3-component vector of float)
+0:112            color: direct index for structure ( in highp 4-component vector of float)
+0:112              'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:112              Constant:
+0:112                0 (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      multiply second child into first child ( temp highp 4-component vector of float)
+0:114        'outcol' ( temp highp 4-component vector of float)
+0:114        'colorMapColor' ( temp highp 4-component vector of float)
+0:117      Sequence
+0:117        move second child to first child ( temp highp float)
+0:117          'alpha' ( temp highp float)
+0:117          component-wise multiply ( temp highp float)
+0:117            direct index ( temp highp float)
+0:117              color: direct index for structure ( in highp 4-component vector of float)
+0:117                'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:117                Constant:
+0:117                  0 (const int)
+0:117              Constant:
+0:117                3 (const int)
+0:117            direct index ( temp highp float)
+0:117              'colorMapColor' ( temp highp 4-component vector of float)
+0:117              Constant:
+0:117                3 (const int)
+0:120      move second child to first child ( temp highp 4-component vector of float)
+0:120        'outcol' ( temp highp 4-component vector of float)
+0:120        Function Call: TDDither(vf4; ( global highp 4-component vector of float)
+0:120          'outcol' ( temp highp 4-component vector of float)
+0:122      vector scale second child into first child ( temp highp 3-component vector of float)
+0:122        vector swizzle ( temp highp 3-component vector of float)
+0:122          'outcol' ( temp highp 4-component vector of float)
+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        'alpha' ( temp highp float)
+0:126      Function Call: TDAlphaTest(f1; ( global void)
+0:126        'alpha' ( temp highp float)
+0:128      move second child to first child ( temp highp float)
+0:128        direct index ( temp highp float)
+0:128          'outcol' ( temp highp 4-component vector of float)
+0:128          Constant:
+0:128            3 (const int)
+0:128        'alpha' ( temp highp float)
+0:129      move second child to first child ( temp highp 4-component vector of float)
+0:129        direct index (layout( location=0) temp highp 4-component vector of float)
+0:129          'oFragColor' (layout( location=0) out 1-element array of highp 4-component vector of float)
+0:129          Constant:
+0:129            0 (const int)
+0:129        Function Call: TDOutputSwizzle(vf4; ( global highp 4-component vector of float)
+0:129          'outcol' ( temp highp 4-component vector of float)
+0:135      Sequence
+0:135        Sequence
+0:135          move second child to first child ( temp highp int)
+0:135            'i' ( temp highp int)
+0:135            Constant:
+0:135              1 (const int)
+0:135        Loop with condition tested first
+0:135          Loop Condition
+0:135          Compare Less Than ( temp bool)
+0:135            'i' ( temp highp int)
+0:135            Constant:
+0:135              1 (const int)
+0:135          Loop Body
+0:137          Sequence
+0:137            move second child to first child ( temp highp 4-component vector of float)
+0:137              indirect index (layout( location=0) temp highp 4-component vector of float)
+0:137                'oFragColor' (layout( location=0) out 1-element array of highp 4-component vector of float)
+0:137                'i' ( temp highp int)
+0:137              Constant:
+0:137                0.000000
+0:137                0.000000
+0:137                0.000000
+0:137                0.000000
+0:135          Loop Terminal Expression
+0:135          Post-Increment ( temp highp int)
+0:135            'i' ( temp highp int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'sColorMap' ( uniform highp sampler2DArray)
+0:?     'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:?     'oFragColor' (layout( location=0) out 1-element array of highp 4-component vector of float)
+
+vk.relaxed.stagelink.0.1.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:116  Function Definition: TDColor(vf4; ( global highp 4-component vector of float)
+0:116    Function Parameters: 
+0:116      'color' ( in highp 4-component vector of float)
+0:116    Sequence
+0:116      Branch: Return with expression
+0:116        'color' ( in highp 4-component vector of float)
+0:117  Function Definition: TDCheckOrderIndTrans( ( global void)
+0:117    Function Parameters: 
+0:119  Function Definition: TDCheckDiscard( ( global void)
+0:119    Function Parameters: 
+0:120    Sequence
+0:120      Function Call: TDCheckOrderIndTrans( ( global void)
+0:122  Function Definition: TDDither(vf4; ( global highp 4-component vector of float)
+0:122    Function Parameters: 
+0:122      'color' ( in highp 4-component vector of float)
+0:124    Sequence
+0:124      Sequence
+0:124        move second child to first child ( temp highp float)
+0:124          'd' ( temp highp float)
+0:125          direct index ( temp highp float)
+0:125            texture ( global highp 4-component vector of float)
+0:124              'sTDNoiseMap' ( uniform highp sampler2D)
+0:125              divide ( temp highp 2-component vector of float)
+0:125                vector swizzle ( temp highp 2-component vector of float)
+0:125                  'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:125                  Sequence
+0:125                    Constant:
+0:125                      0 (const int)
+0:125                    Constant:
+0:125                      1 (const int)
+0:125                Constant:
+0:125                  256.000000
+0:125            Constant:
+0:125              0 (const int)
+0:126      subtract second child into first child ( temp highp float)
+0:126        'd' ( temp highp float)
+0:126        Constant:
+0:126          0.500000
+0:127      divide second child into first child ( temp highp float)
+0:127        'd' ( temp highp float)
+0:127        Constant:
+0:127          256.000000
+0:128      Branch: Return with expression
+0:128        Construct vec4 ( temp highp 4-component vector of float)
+0:128          add ( temp highp 3-component vector of float)
+0:128            vector swizzle ( temp highp 3-component vector of float)
+0:128              'color' ( in highp 4-component vector of float)
+0:128              Sequence
+0:128                Constant:
+0:128                  0 (const int)
+0:128                Constant:
+0:128                  1 (const int)
+0:128                Constant:
+0:128                  2 (const int)
+0:128            'd' ( temp highp float)
+0:128          direct index ( temp highp float)
+0:128            'color' ( in highp 4-component vector of float)
+0:128            Constant:
+0:128              3 (const int)
+0:130  Function Definition: TDFrontFacing(vf3;vf3; ( global bool)
+0:130    Function Parameters: 
+0:130      'pos' ( in highp 3-component vector of float)
+0:130      'normal' ( in highp 3-component vector of float)
+0:132    Sequence
+0:132      Branch: Return with expression
+0:132        'gl_FrontFacing' ( gl_FrontFacing bool Face)
+0:134  Function Definition: TDAttenuateLight(i1;f1; ( global highp float)
+0:134    Function Parameters: 
+0:134      'index' ( in highp int)
+0:134      'lightDist' ( in highp float)
+0:136    Sequence
+0:136      Branch: Return with expression
+0:136        Constant:
+0:136          1.000000
+0:138  Function Definition: TDAlphaTest(f1; ( global void)
+0:138    Function Parameters: 
+0:138      'alpha' ( in highp float)
+0:140  Function Definition: TDHardShadow(i1;vf3; ( global highp float)
+0:140    Function Parameters: 
+0:140      'lightIndex' ( in highp int)
+0:140      'worldSpacePos' ( in highp 3-component vector of float)
+0:141    Sequence
+0:141      Branch: Return with expression
+0:141        Constant:
+0:141          0.000000
+0:142  Function Definition: TDSoftShadow(i1;vf3;i1;i1; ( global highp float)
+0:142    Function Parameters: 
+0:142      'lightIndex' ( in highp int)
+0:142      'worldSpacePos' ( in highp 3-component vector of float)
+0:142      'samples' ( in highp int)
+0:142      'steps' ( in highp int)
+0:143    Sequence
+0:143      Branch: Return with expression
+0:143        Constant:
+0:143          0.000000
+0:144  Function Definition: TDSoftShadow(i1;vf3; ( global highp float)
+0:144    Function Parameters: 
+0:144      'lightIndex' ( in highp int)
+0:144      'worldSpacePos' ( in highp 3-component vector of float)
+0:145    Sequence
+0:145      Branch: Return with expression
+0:145        Constant:
+0:145          0.000000
+0:146  Function Definition: TDShadow(i1;vf3; ( global highp float)
+0:146    Function Parameters: 
+0:146      'lightIndex' ( in highp int)
+0:146      'worldSpacePos' ( in highp 3-component vector of float)
+0:147    Sequence
+0:147      Branch: Return with expression
+0:147        Constant:
+0:147          0.000000
+0:152  Function Definition: iTDRadicalInverse_VdC(u1; ( global highp float)
+0:152    Function Parameters: 
+0:152      'bits' ( in highp uint)
+0:154    Sequence
+0:154      move second child to first child ( temp highp uint)
+0:154        'bits' ( in highp uint)
+0:154        inclusive-or ( temp highp uint)
+0:154          left-shift ( temp highp uint)
+0:154            'bits' ( in highp uint)
+0:154            Constant:
+0:154              16 (const uint)
+0:154          right-shift ( temp highp uint)
+0:154            'bits' ( in highp uint)
+0:154            Constant:
+0:154              16 (const uint)
+0:155      move second child to first child ( temp highp uint)
+0:155        'bits' ( in highp uint)
+0:155        inclusive-or ( temp highp uint)
+0:155          left-shift ( temp highp uint)
+0:155            bitwise and ( temp highp uint)
+0:155              'bits' ( in highp uint)
+0:155              Constant:
+0:155                1431655765 (const uint)
+0:155            Constant:
+0:155              1 (const uint)
+0:155          right-shift ( temp highp uint)
+0:155            bitwise and ( temp highp uint)
+0:155              'bits' ( in highp uint)
+0:155              Constant:
+0:155                2863311530 (const uint)
+0:155            Constant:
+0:155              1 (const uint)
+0:156      move second child to first child ( temp highp uint)
+0:156        'bits' ( in highp uint)
+0:156        inclusive-or ( temp highp uint)
+0:156          left-shift ( temp highp uint)
+0:156            bitwise and ( temp highp uint)
+0:156              'bits' ( in highp uint)
+0:156              Constant:
+0:156                858993459 (const uint)
+0:156            Constant:
+0:156              2 (const uint)
+0:156          right-shift ( temp highp uint)
+0:156            bitwise and ( temp highp uint)
+0:156              'bits' ( in highp uint)
+0:156              Constant:
+0:156                3435973836 (const uint)
+0:156            Constant:
+0:156              2 (const uint)
+0:157      move second child to first child ( temp highp uint)
+0:157        'bits' ( in highp uint)
+0:157        inclusive-or ( temp highp uint)
+0:157          left-shift ( temp highp uint)
+0:157            bitwise and ( temp highp uint)
+0:157              'bits' ( in highp uint)
+0:157              Constant:
+0:157                252645135 (const uint)
+0:157            Constant:
+0:157              4 (const uint)
+0:157          right-shift ( temp highp uint)
+0:157            bitwise and ( temp highp uint)
+0:157              'bits' ( in highp uint)
+0:157              Constant:
+0:157                4042322160 (const uint)
+0:157            Constant:
+0:157              4 (const uint)
+0:158      move second child to first child ( temp highp uint)
+0:158        'bits' ( in highp uint)
+0:158        inclusive-or ( temp highp uint)
+0:158          left-shift ( temp highp uint)
+0:158            bitwise and ( temp highp uint)
+0:158              'bits' ( in highp uint)
+0:158              Constant:
+0:158                16711935 (const uint)
+0:158            Constant:
+0:158              8 (const uint)
+0:158          right-shift ( temp highp uint)
+0:158            bitwise and ( temp highp uint)
+0:158              'bits' ( in highp uint)
+0:158              Constant:
+0:158                4278255360 (const uint)
+0:158            Constant:
+0:158              8 (const uint)
+0:159      Branch: Return with expression
+0:159        component-wise multiply ( temp highp float)
+0:159          Convert uint to float ( temp highp float)
+0:159            'bits' ( in highp uint)
+0:159          Constant:
+0:159            2.3283064365387e-10
+0:161  Function Definition: iTDHammersley(u1;u1; ( global highp 2-component vector of float)
+0:161    Function Parameters: 
+0:161      'i' ( in highp uint)
+0:161      'N' ( in highp uint)
+0:163    Sequence
+0:163      Branch: Return with expression
+0:163        Construct vec2 ( temp highp 2-component vector of float)
+0:163          divide ( temp highp float)
+0:163            Convert uint to float ( temp highp float)
+0:163              'i' ( in highp uint)
+0:163            Convert uint to float ( temp highp float)
+0:163              'N' ( in highp uint)
+0:163          Function Call: iTDRadicalInverse_VdC(u1; ( global highp float)
+0:163            'i' ( in highp uint)
+0:165  Function Definition: iTDImportanceSampleGGX(vf2;f1;vf3; ( global highp 3-component vector of float)
+0:165    Function Parameters: 
+0:165      'Xi' ( in highp 2-component vector of float)
+0:165      'roughness2' ( in highp float)
+0:165      'N' ( in highp 3-component vector of float)
+0:167    Sequence
+0:167      Sequence
+0:167        move second child to first child ( temp highp float)
+0:167          'a' ( temp highp float)
+0:167          'roughness2' ( in highp float)
+0:168      Sequence
+0:168        move second child to first child ( temp highp float)
+0:168          'phi' ( temp highp float)
+0:168          component-wise multiply ( temp highp float)
+0:168            Constant:
+0:168              6.283185
+0:168            direct index ( temp highp float)
+0:168              'Xi' ( in highp 2-component vector of float)
+0:168              Constant:
+0:168                0 (const int)
+0:169      Sequence
+0:169        move second child to first child ( temp highp float)
+0:169          'cosTheta' ( temp highp float)
+0:169          sqrt ( global highp float)
+0:169            divide ( temp highp float)
+0:169              subtract ( temp highp float)
+0:169                Constant:
+0:169                  1.000000
+0:169                direct index ( temp highp float)
+0:169                  'Xi' ( in highp 2-component vector of float)
+0:169                  Constant:
+0:169                    1 (const int)
+0:169              add ( temp highp float)
+0:169                Constant:
+0:169                  1.000000
+0:169                component-wise multiply ( temp highp float)
+0:169                  subtract ( temp highp float)
+0:169                    component-wise multiply ( temp highp float)
+0:169                      'a' ( temp highp float)
+0:169                      'a' ( temp highp float)
+0:169                    Constant:
+0:169                      1.000000
+0:169                  direct index ( temp highp float)
+0:169                    'Xi' ( in highp 2-component vector of float)
+0:169                    Constant:
+0:169                      1 (const int)
+0:170      Sequence
+0:170        move second child to first child ( temp highp float)
+0:170          'sinTheta' ( temp highp float)
+0:170          sqrt ( global highp float)
+0:170            subtract ( temp highp float)
+0:170              Constant:
+0:170                1.000000
+0:170              component-wise multiply ( temp highp float)
+0:170                'cosTheta' ( temp highp float)
+0:170                'cosTheta' ( temp highp float)
+0:173      move second child to first child ( temp highp float)
+0:173        direct index ( temp highp float)
+0:173          'H' ( temp highp 3-component vector of float)
+0:173          Constant:
+0:173            0 (const int)
+0:173        component-wise multiply ( temp highp float)
+0:173          'sinTheta' ( temp highp float)
+0:173          cosine ( global highp float)
+0:173            'phi' ( temp highp float)
+0:174      move second child to first child ( temp highp float)
+0:174        direct index ( temp highp float)
+0:174          'H' ( temp highp 3-component vector of float)
+0:174          Constant:
+0:174            1 (const int)
+0:174        component-wise multiply ( temp highp float)
+0:174          'sinTheta' ( temp highp float)
+0:174          sine ( global highp float)
+0:174            'phi' ( temp highp float)
+0:175      move second child to first child ( temp highp float)
+0:175        direct index ( temp highp float)
+0:175          'H' ( temp highp 3-component vector of float)
+0:175          Constant:
+0:175            2 (const int)
+0:175        'cosTheta' ( temp highp float)
+0:177      Sequence
+0:177        move second child to first child ( temp highp 3-component vector of float)
+0:177          'upVector' ( temp highp 3-component vector of float)
+0:177          Test condition and select ( temp highp 3-component vector of float)
+0:177            Condition
+0:177            Compare Less Than ( temp bool)
+0:177              Absolute value ( global highp float)
+0:177                direct index ( temp highp float)
+0:177                  'N' ( in highp 3-component vector of float)
+0:177                  Constant:
+0:177                    2 (const int)
+0:177              Constant:
+0:177                0.999000
+0:177            true case
+0:177            Constant:
+0:177              0.000000
+0:177              0.000000
+0:177              1.000000
+0:177            false case
+0:177            Constant:
+0:177              1.000000
+0:177              0.000000
+0:177              0.000000
+0:178      Sequence
+0:178        move second child to first child ( temp highp 3-component vector of float)
+0:178          'tangentX' ( temp highp 3-component vector of float)
+0:178          normalize ( global highp 3-component vector of float)
+0:178            cross-product ( global highp 3-component vector of float)
+0:178              'upVector' ( temp highp 3-component vector of float)
+0:178              'N' ( in highp 3-component vector of float)
+0:179      Sequence
+0:179        move second child to first child ( temp highp 3-component vector of float)
+0:179          'tangentY' ( temp highp 3-component vector of float)
+0:179          cross-product ( global highp 3-component vector of float)
+0:179            'N' ( in highp 3-component vector of float)
+0:179            'tangentX' ( temp highp 3-component vector of float)
+0:182      Sequence
+0:182        move second child to first child ( temp highp 3-component vector of float)
+0:182          'worldResult' ( temp highp 3-component vector of float)
+0:182          add ( temp highp 3-component vector of float)
+0:182            add ( temp highp 3-component vector of float)
+0:182              vector-scale ( temp highp 3-component vector of float)
+0:182                'tangentX' ( temp highp 3-component vector of float)
+0:182                direct index ( temp highp float)
+0:182                  'H' ( temp highp 3-component vector of float)
+0:182                  Constant:
+0:182                    0 (const int)
+0:182              vector-scale ( temp highp 3-component vector of float)
+0:182                'tangentY' ( temp highp 3-component vector of float)
+0:182                direct index ( temp highp float)
+0:182                  'H' ( temp highp 3-component vector of float)
+0:182                  Constant:
+0:182                    1 (const int)
+0:182            vector-scale ( temp highp 3-component vector of float)
+0:182              'N' ( in highp 3-component vector of float)
+0:182              direct index ( temp highp float)
+0:182                'H' ( temp highp 3-component vector of float)
+0:182                Constant:
+0:182                  2 (const int)
+0:183      Branch: Return with expression
+0:183        'worldResult' ( temp highp 3-component vector of float)
+0:185  Function Definition: iTDDistributionGGX(vf3;vf3;f1; ( global highp float)
+0:185    Function Parameters: 
+0:185      'normal' ( in highp 3-component vector of float)
+0:185      'half_vector' ( in highp 3-component vector of float)
+0:185      'roughness2' ( in highp float)
+0:?     Sequence
+0:189      Sequence
+0:189        move second child to first child ( temp highp float)
+0:189          'NdotH' ( temp highp float)
+0:189          clamp ( global highp float)
+0:189            dot-product ( global highp float)
+0:189              'normal' ( in highp 3-component vector of float)
+0:189              'half_vector' ( in highp 3-component vector of float)
+0:189            Constant:
+0:189              1.0000000000000e-06
+0:189            Constant:
+0:189              1.000000
+0:191      Sequence
+0:191        move second child to first child ( temp highp float)
+0:191          'alpha2' ( temp highp float)
+0:191          component-wise multiply ( temp highp float)
+0:191            'roughness2' ( in highp float)
+0:191            'roughness2' ( in highp float)
+0:193      Sequence
+0:193        move second child to first child ( temp highp float)
+0:193          'denom' ( temp highp float)
+0:193          add ( temp highp float)
+0:193            component-wise multiply ( temp highp float)
+0:193              component-wise multiply ( temp highp float)
+0:193                'NdotH' ( temp highp float)
+0:193                'NdotH' ( temp highp float)
+0:193              subtract ( temp highp float)
+0:193                'alpha2' ( temp highp float)
+0:193                Constant:
+0:193                  1.000000
+0:193            Constant:
+0:193              1.000000
+0:194      move second child to first child ( temp highp float)
+0:194        'denom' ( temp highp float)
+0:194        max ( global highp float)
+0:194          Constant:
+0:194            1.0000000000000e-08
+0:194          'denom' ( temp highp float)
+0:195      Branch: Return with expression
+0:195        divide ( temp highp float)
+0:195          'alpha2' ( temp highp float)
+0:195          component-wise multiply ( temp highp float)
+0:195            component-wise multiply ( temp highp float)
+0:195              Constant:
+0:195                3.141593
+0:195              'denom' ( temp highp float)
+0:195            'denom' ( temp highp float)
+0:197  Function Definition: iTDCalcF(vf3;f1; ( global highp 3-component vector of float)
+0:197    Function Parameters: 
+0:197      'F0' ( in highp 3-component vector of float)
+0:197      'VdotH' ( in highp float)
+0:198    Sequence
+0:198      Branch: Return with expression
+0:198        add ( temp highp 3-component vector of float)
+0:198          'F0' ( in highp 3-component vector of float)
+0:198          vector-scale ( temp highp 3-component vector of float)
+0:198            subtract ( temp highp 3-component vector of float)
+0:198              Constant:
+0:198                1.000000
+0:198                1.000000
+0:198                1.000000
+0:198              'F0' ( in highp 3-component vector of float)
+0:198            pow ( global highp float)
+0:198              Constant:
+0:198                2.000000
+0:198              component-wise multiply ( temp highp float)
+0:198                subtract ( temp highp float)
+0:198                  component-wise multiply ( temp highp float)
+0:198                    Constant:
+0:198                      -5.554730
+0:198                    'VdotH' ( in highp float)
+0:198                  Constant:
+0:198                    6.983160
+0:198                'VdotH' ( in highp float)
+0:201  Function Definition: iTDCalcG(f1;f1;f1; ( global highp float)
+0:201    Function Parameters: 
+0:201      'NdotL' ( in highp float)
+0:201      'NdotV' ( in highp float)
+0:201      'k' ( in highp float)
+0:202    Sequence
+0:202      Sequence
+0:202        move second child to first child ( temp highp float)
+0:202          'Gl' ( temp highp float)
+0:202          divide ( temp highp float)
+0:202            Constant:
+0:202              1.000000
+0:202            add ( temp highp float)
+0:202              component-wise multiply ( temp highp float)
+0:202                'NdotL' ( in highp float)
+0:202                subtract ( temp highp float)
+0:202                  Constant:
+0:202                    1.000000
+0:202                  'k' ( in highp float)
+0:202              'k' ( in highp float)
+0:203      Sequence
+0:203        move second child to first child ( temp highp float)
+0:203          'Gv' ( temp highp float)
+0:203          divide ( temp highp float)
+0:203            Constant:
+0:203              1.000000
+0:203            add ( temp highp float)
+0:203              component-wise multiply ( temp highp float)
+0:203                'NdotV' ( in highp float)
+0:203                subtract ( temp highp float)
+0:203                  Constant:
+0:203                    1.000000
+0:203                  'k' ( in highp float)
+0:203              'k' ( in highp float)
+0:204      Branch: Return with expression
+0:204        component-wise multiply ( temp highp float)
+0:204          'Gl' ( temp highp float)
+0:204          'Gv' ( temp highp float)
+0:207  Function Definition: TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:207    Function Parameters: 
+0:207      'index' ( in highp int)
+0:207      'diffuseColor' ( in highp 3-component vector of float)
+0:207      'specularColor' ( in highp 3-component vector of float)
+0:207      'worldSpacePos' ( in highp 3-component vector of float)
+0:207      'normal' ( in highp 3-component vector of float)
+0:207      'shadowStrength' ( in highp float)
+0:207      'shadowColor' ( in highp 3-component vector of float)
+0:207      'camVector' ( in highp 3-component vector of float)
+0:207      'roughness' ( in highp float)
+0:?     Sequence
+0:210      Branch: Return with expression
+0:210        'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:213  Function Definition: TDLightingPBR(vf3;vf3;f1;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global void)
+0:213    Function Parameters: 
+0:213      'diffuseContrib' ( inout highp 3-component vector of float)
+0:213      'specularContrib' ( inout highp 3-component vector of float)
+0:213      'shadowStrengthOut' ( inout highp float)
+0:213      'index' ( in highp int)
+0:213      'diffuseColor' ( in highp 3-component vector of float)
+0:213      'specularColor' ( in highp 3-component vector of float)
+0:213      'worldSpacePos' ( in highp 3-component vector of float)
+0:213      'normal' ( in highp 3-component vector of float)
+0:213      'shadowStrength' ( in highp float)
+0:213      'shadowColor' ( in highp 3-component vector of float)
+0:213      'camVector' ( in highp 3-component vector of float)
+0:213      'roughness' ( in highp float)
+0:215    Sequence
+0:215      Sequence
+0:215        move second child to first child ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215          Function Call: TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215            'index' ( in highp int)
+0:215            'diffuseColor' ( in highp 3-component vector of float)
+0:215            'specularColor' ( in highp 3-component vector of float)
+0:215            'worldSpacePos' ( in highp 3-component vector of float)
+0:215            'normal' ( in highp 3-component vector of float)
+0:215            'shadowStrength' ( in highp float)
+0:215            'shadowColor' ( in highp 3-component vector of float)
+0:215            'camVector' ( in highp 3-component vector of float)
+0:215            'roughness' ( in highp float)
+0:215      move second child to first child ( temp highp 3-component vector of float)
+0:215        'diffuseContrib' ( inout highp 3-component vector of float)
+0:215        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:215          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215          Constant:
+0:215            0 (const int)
+0:216      move second child to first child ( temp highp 3-component vector of float)
+0:216        'specularContrib' ( inout highp 3-component vector of float)
+0:216        specular: direct index for structure ( global highp 3-component vector of float)
+0:216          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:216          Constant:
+0:216            1 (const int)
+0:217      move second child to first child ( temp highp float)
+0:217        'shadowStrengthOut' ( inout highp float)
+0:217        shadowStrength: direct index for structure ( global highp float)
+0:217          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:217          Constant:
+0:217            2 (const int)
+0:220  Function Definition: TDLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global void)
+0:220    Function Parameters: 
+0:220      'diffuseContrib' ( inout highp 3-component vector of float)
+0:220      'specularContrib' ( inout highp 3-component vector of float)
+0:220      'index' ( in highp int)
+0:220      'diffuseColor' ( in highp 3-component vector of float)
+0:220      'specularColor' ( in highp 3-component vector of float)
+0:220      'worldSpacePos' ( in highp 3-component vector of float)
+0:220      'normal' ( in highp 3-component vector of float)
+0:220      'shadowStrength' ( in highp float)
+0:220      'shadowColor' ( in highp 3-component vector of float)
+0:220      'camVector' ( in highp 3-component vector of float)
+0:220      'roughness' ( in highp float)
+0:222    Sequence
+0:222      Sequence
+0:222        move second child to first child ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222          Function Call: TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222            'index' ( in highp int)
+0:222            'diffuseColor' ( in highp 3-component vector of float)
+0:222            'specularColor' ( in highp 3-component vector of float)
+0:222            'worldSpacePos' ( in highp 3-component vector of float)
+0:222            'normal' ( in highp 3-component vector of float)
+0:222            'shadowStrength' ( in highp float)
+0:222            'shadowColor' ( in highp 3-component vector of float)
+0:222            'camVector' ( in highp 3-component vector of float)
+0:222            'roughness' ( in highp float)
+0:222      move second child to first child ( temp highp 3-component vector of float)
+0:222        'diffuseContrib' ( inout highp 3-component vector of float)
+0:222        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:222          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222          Constant:
+0:222            0 (const int)
+0:223      move second child to first child ( temp highp 3-component vector of float)
+0:223        'specularContrib' ( inout highp 3-component vector of float)
+0:223        specular: direct index for structure ( global highp 3-component vector of float)
+0:223          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:223          Constant:
+0:223            1 (const int)
+0:226  Function Definition: TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:226    Function Parameters: 
+0:226      'index' ( in highp int)
+0:226      'diffuseColor' ( in highp 3-component vector of float)
+0:226      'specularColor' ( in highp 3-component vector of float)
+0:226      'normal' ( in highp 3-component vector of float)
+0:226      'camVector' ( in highp 3-component vector of float)
+0:226      'roughness' ( in highp float)
+0:226      'ambientOcclusion' ( in highp float)
+0:?     Sequence
+0:229      Branch: Return with expression
+0:229        'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:232  Function Definition: TDEnvLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;f1; ( global void)
+0:232    Function Parameters: 
+0:232      'diffuseContrib' ( inout highp 3-component vector of float)
+0:232      'specularContrib' ( inout highp 3-component vector of float)
+0:232      'index' ( in highp int)
+0:232      'diffuseColor' ( in highp 3-component vector of float)
+0:232      'specularColor' ( in highp 3-component vector of float)
+0:232      'normal' ( in highp 3-component vector of float)
+0:232      'camVector' ( in highp 3-component vector of float)
+0:232      'roughness' ( in highp float)
+0:232      'ambientOcclusion' ( in highp float)
+0:234    Sequence
+0:234      Sequence
+0:234        move second child to first child ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:234          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:234          Function Call: TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:234            'index' ( in highp int)
+0:234            'diffuseColor' ( in highp 3-component vector of float)
+0:234            'specularColor' ( in highp 3-component vector of float)
+0:234            'normal' ( in highp 3-component vector of float)
+0:234            'camVector' ( in highp 3-component vector of float)
+0:234            'roughness' ( in highp float)
+0:234            'ambientOcclusion' ( in highp float)
+0:235      move second child to first child ( temp highp 3-component vector of float)
+0:235        'diffuseContrib' ( inout highp 3-component vector of float)
+0:235        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:235          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:235          Constant:
+0:235            0 (const int)
+0:236      move second child to first child ( temp highp 3-component vector of float)
+0:236        'specularContrib' ( inout highp 3-component vector of float)
+0:236        specular: direct index for structure ( global highp 3-component vector of float)
+0:236          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:236          Constant:
+0:236            1 (const int)
+0:239  Function Definition: TDLighting(i1;vf3;vf3;f1;vf3;vf3;f1;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:239    Function Parameters: 
+0:239      'index' ( in highp int)
+0:239      'worldSpacePos' ( in highp 3-component vector of float)
+0:239      'normal' ( in highp 3-component vector of float)
+0:239      'shadowStrength' ( in highp float)
+0:239      'shadowColor' ( in highp 3-component vector of float)
+0:239      'camVector' ( in highp 3-component vector of float)
+0:239      'shininess' ( in highp float)
+0:239      'shininess2' ( in highp float)
+0:?     Sequence
+0:242      switch
+0:242      condition
+0:242        'index' ( in highp int)
+0:242      body
+0:242        Sequence
+0:244          default: 
+0:?           Sequence
+0:245            move second child to first child ( temp highp 3-component vector of float)
+0:245              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:245                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:245                Constant:
+0:245                  0 (const int)
+0:245              Constant:
+0:245                0.000000
+0:245                0.000000
+0:245                0.000000
+0:246            move second child to first child ( temp highp 3-component vector of float)
+0:246              specular: direct index for structure ( global highp 3-component vector of float)
+0:246                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:246                Constant:
+0:246                  1 (const int)
+0:246              Constant:
+0:246                0.000000
+0:246                0.000000
+0:246                0.000000
+0:247            move second child to first child ( temp highp 3-component vector of float)
+0:247              specular2: direct index for structure ( global highp 3-component vector of float)
+0:247                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:247                Constant:
+0:247                  2 (const int)
+0:247              Constant:
+0:247                0.000000
+0:247                0.000000
+0:247                0.000000
+0:248            move second child to first child ( temp highp float)
+0:248              shadowStrength: direct index for structure ( global highp float)
+0:248                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:248                Constant:
+0:248                  3 (const int)
+0:248              Constant:
+0:248                0.000000
+0:249            Branch: Break
+0:251      Branch: Return with expression
+0:251        'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:254  Function Definition: TDLighting(vf3;vf3;vf3;f1;i1;vf3;vf3;f1;vf3;vf3;f1;f1; ( global void)
+0:254    Function Parameters: 
+0:254      'diffuseContrib' ( inout highp 3-component vector of float)
+0:254      'specularContrib' ( inout highp 3-component vector of float)
+0:254      'specularContrib2' ( inout highp 3-component vector of float)
+0:254      'shadowStrengthOut' ( inout highp float)
+0:254      'index' ( in highp int)
+0:254      'worldSpacePos' ( in highp 3-component vector of float)
+0:254      'normal' ( in highp 3-component vector of float)
+0:254      'shadowStrength' ( in highp float)
+0:254      'shadowColor' ( in highp 3-component vector of float)
+0:254      'camVector' ( in highp 3-component vector of float)
+0:254      'shininess' ( in highp float)
+0:254      'shininess2' ( in highp float)
+0:?     Sequence
+0:257      switch
+0:257      condition
+0:257        'index' ( in highp int)
+0:257      body
+0:257        Sequence
+0:259          default: 
+0:?           Sequence
+0:260            move second child to first child ( temp highp 3-component vector of float)
+0:260              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:260                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:260                Constant:
+0:260                  0 (const int)
+0:260              Constant:
+0:260                0.000000
+0:260                0.000000
+0:260                0.000000
+0:261            move second child to first child ( temp highp 3-component vector of float)
+0:261              specular: direct index for structure ( global highp 3-component vector of float)
+0:261                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:261                Constant:
+0:261                  1 (const int)
+0:261              Constant:
+0:261                0.000000
+0:261                0.000000
+0:261                0.000000
+0:262            move second child to first child ( temp highp 3-component vector of float)
+0:262              specular2: direct index for structure ( global highp 3-component vector of float)
+0:262                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:262                Constant:
+0:262                  2 (const int)
+0:262              Constant:
+0:262                0.000000
+0:262                0.000000
+0:262                0.000000
+0:263            move second child to first child ( temp highp float)
+0:263              shadowStrength: direct index for structure ( global highp float)
+0:263                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:263                Constant:
+0:263                  3 (const int)
+0:263              Constant:
+0:263                0.000000
+0:264            Branch: Break
+0:266      move second child to first child ( temp highp 3-component vector of float)
+0:266        'diffuseContrib' ( inout highp 3-component vector of float)
+0:266        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:266          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:266          Constant:
+0:266            0 (const int)
+0:267      move second child to first child ( temp highp 3-component vector of float)
+0:267        'specularContrib' ( inout highp 3-component vector of float)
+0:267        specular: direct index for structure ( global highp 3-component vector of float)
+0:267          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:267          Constant:
+0:267            1 (const int)
+0:268      move second child to first child ( temp highp 3-component vector of float)
+0:268        'specularContrib2' ( inout highp 3-component vector of float)
+0:268        specular2: direct index for structure ( global highp 3-component vector of float)
+0:268          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:268          Constant:
+0:268            2 (const int)
+0:269      move second child to first child ( temp highp float)
+0:269        'shadowStrengthOut' ( inout highp float)
+0:269        shadowStrength: direct index for structure ( global highp float)
+0:269          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:269          Constant:
+0:269            3 (const int)
+0:272  Function Definition: TDLighting(vf3;vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1;f1; ( global void)
+0:272    Function Parameters: 
+0:272      'diffuseContrib' ( inout highp 3-component vector of float)
+0:272      'specularContrib' ( inout highp 3-component vector of float)
+0:272      'specularContrib2' ( inout highp 3-component vector of float)
+0:272      'index' ( in highp int)
+0:272      'worldSpacePos' ( in highp 3-component vector of float)
+0:272      'normal' ( in highp 3-component vector of float)
+0:272      'shadowStrength' ( in highp float)
+0:272      'shadowColor' ( in highp 3-component vector of float)
+0:272      'camVector' ( in highp 3-component vector of float)
+0:272      'shininess' ( in highp float)
+0:272      'shininess2' ( in highp float)
+0:?     Sequence
+0:275      switch
+0:275      condition
+0:275        'index' ( in highp int)
+0:275      body
+0:275        Sequence
+0:277          default: 
+0:?           Sequence
+0:278            move second child to first child ( temp highp 3-component vector of float)
+0:278              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:278                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:278                Constant:
+0:278                  0 (const int)
+0:278              Constant:
+0:278                0.000000
+0:278                0.000000
+0:278                0.000000
+0:279            move second child to first child ( temp highp 3-component vector of float)
+0:279              specular: direct index for structure ( global highp 3-component vector of float)
+0:279                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:279                Constant:
+0:279                  1 (const int)
+0:279              Constant:
+0:279                0.000000
+0:279                0.000000
+0:279                0.000000
+0:280            move second child to first child ( temp highp 3-component vector of float)
+0:280              specular2: direct index for structure ( global highp 3-component vector of float)
+0:280                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:280                Constant:
+0:280                  2 (const int)
+0:280              Constant:
+0:280                0.000000
+0:280                0.000000
+0:280                0.000000
+0:281            move second child to first child ( temp highp float)
+0:281              shadowStrength: direct index for structure ( global highp float)
+0:281                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:281                Constant:
+0:281                  3 (const int)
+0:281              Constant:
+0:281                0.000000
+0:282            Branch: Break
+0:284      move second child to first child ( temp highp 3-component vector of float)
+0:284        'diffuseContrib' ( inout highp 3-component vector of float)
+0:284        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:284          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:284          Constant:
+0:284            0 (const int)
+0:285      move second child to first child ( temp highp 3-component vector of float)
+0:285        'specularContrib' ( inout highp 3-component vector of float)
+0:285        specular: direct index for structure ( global highp 3-component vector of float)
+0:285          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:285          Constant:
+0:285            1 (const int)
+0:286      move second child to first child ( temp highp 3-component vector of float)
+0:286        'specularContrib2' ( inout highp 3-component vector of float)
+0:286        specular2: direct index for structure ( global highp 3-component vector of float)
+0:286          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:286          Constant:
+0:286            2 (const int)
+0:289  Function Definition: TDLighting(vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1; ( global void)
+0:289    Function Parameters: 
+0:289      'diffuseContrib' ( inout highp 3-component vector of float)
+0:289      'specularContrib' ( inout highp 3-component vector of float)
+0:289      'index' ( in highp int)
+0:289      'worldSpacePos' ( in highp 3-component vector of float)
+0:289      'normal' ( in highp 3-component vector of float)
+0:289      'shadowStrength' ( in highp float)
+0:289      'shadowColor' ( in highp 3-component vector of float)
+0:289      'camVector' ( in highp 3-component vector of float)
+0:289      'shininess' ( in highp float)
+0:?     Sequence
+0:292      switch
+0:292      condition
+0:292        'index' ( in highp int)
+0:292      body
+0:292        Sequence
+0:294          default: 
+0:?           Sequence
+0:295            move second child to first child ( temp highp 3-component vector of float)
+0:295              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:295                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:295                Constant:
+0:295                  0 (const int)
+0:295              Constant:
+0:295                0.000000
+0:295                0.000000
+0:295                0.000000
+0:296            move second child to first child ( temp highp 3-component vector of float)
+0:296              specular: direct index for structure ( global highp 3-component vector of float)
+0:296                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:296                Constant:
+0:296                  1 (const int)
+0:296              Constant:
+0:296                0.000000
+0:296                0.000000
+0:296                0.000000
+0:297            move second child to first child ( temp highp 3-component vector of float)
+0:297              specular2: direct index for structure ( global highp 3-component vector of float)
+0:297                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:297                Constant:
+0:297                  2 (const int)
+0:297              Constant:
+0:297                0.000000
+0:297                0.000000
+0:297                0.000000
+0:298            move second child to first child ( temp highp float)
+0:298              shadowStrength: direct index for structure ( global highp float)
+0:298                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:298                Constant:
+0:298                  3 (const int)
+0:298              Constant:
+0:298                0.000000
+0:299            Branch: Break
+0:301      move second child to first child ( temp highp 3-component vector of float)
+0:301        'diffuseContrib' ( inout highp 3-component vector of float)
+0:301        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:301          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:301          Constant:
+0:301            0 (const int)
+0:302      move second child to first child ( temp highp 3-component vector of float)
+0:302        'specularContrib' ( inout highp 3-component vector of float)
+0:302        specular: direct index for structure ( global highp 3-component vector of float)
+0:302          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:302          Constant:
+0:302            1 (const int)
+0:305  Function Definition: TDLighting(vf3;vf3;vf3;i1;vf3;vf3;vf3;f1;f1; ( global void)
+0:305    Function Parameters: 
+0:305      'diffuseContrib' ( inout highp 3-component vector of float)
+0:305      'specularContrib' ( inout highp 3-component vector of float)
+0:305      'specularContrib2' ( inout highp 3-component vector of float)
+0:305      'index' ( in highp int)
+0:305      'worldSpacePos' ( in highp 3-component vector of float)
+0:305      'normal' ( in highp 3-component vector of float)
+0:305      'camVector' ( in highp 3-component vector of float)
+0:305      'shininess' ( in highp float)
+0:305      'shininess2' ( in highp float)
+0:?     Sequence
+0:308      switch
+0:308      condition
+0:308        'index' ( in highp int)
+0:308      body
+0:308        Sequence
+0:310          default: 
+0:?           Sequence
+0:311            move second child to first child ( temp highp 3-component vector of float)
+0:311              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:311                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:311                Constant:
+0:311                  0 (const int)
+0:311              Constant:
+0:311                0.000000
+0:311                0.000000
+0:311                0.000000
+0:312            move second child to first child ( temp highp 3-component vector of float)
+0:312              specular: direct index for structure ( global highp 3-component vector of float)
+0:312                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:312                Constant:
+0:312                  1 (const int)
+0:312              Constant:
+0:312                0.000000
+0:312                0.000000
+0:312                0.000000
+0:313            move second child to first child ( temp highp 3-component vector of float)
+0:313              specular2: direct index for structure ( global highp 3-component vector of float)
+0:313                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:313                Constant:
+0:313                  2 (const int)
+0:313              Constant:
+0:313                0.000000
+0:313                0.000000
+0:313                0.000000
+0:314            move second child to first child ( temp highp float)
+0:314              shadowStrength: direct index for structure ( global highp float)
+0:314                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:314                Constant:
+0:314                  3 (const int)
+0:314              Constant:
+0:314                0.000000
+0:315            Branch: Break
+0:317      move second child to first child ( temp highp 3-component vector of float)
+0:317        'diffuseContrib' ( inout highp 3-component vector of float)
+0:317        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:317          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:317          Constant:
+0:317            0 (const int)
+0:318      move second child to first child ( temp highp 3-component vector of float)
+0:318        'specularContrib' ( inout highp 3-component vector of float)
+0:318        specular: direct index for structure ( global highp 3-component vector of float)
+0:318          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:318          Constant:
+0:318            1 (const int)
+0:319      move second child to first child ( temp highp 3-component vector of float)
+0:319        'specularContrib2' ( inout highp 3-component vector of float)
+0:319        specular2: direct index for structure ( global highp 3-component vector of float)
+0:319          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:319          Constant:
+0:319            2 (const int)
+0:322  Function Definition: TDLighting(vf3;vf3;i1;vf3;vf3;vf3;f1; ( global void)
+0:322    Function Parameters: 
+0:322      'diffuseContrib' ( inout highp 3-component vector of float)
+0:322      'specularContrib' ( inout highp 3-component vector of float)
+0:322      'index' ( in highp int)
+0:322      'worldSpacePos' ( in highp 3-component vector of float)
+0:322      'normal' ( in highp 3-component vector of float)
+0:322      'camVector' ( in highp 3-component vector of float)
+0:322      'shininess' ( in highp float)
+0:?     Sequence
+0:325      switch
+0:325      condition
+0:325        'index' ( in highp int)
+0:325      body
+0:325        Sequence
+0:327          default: 
+0:?           Sequence
+0:328            move second child to first child ( temp highp 3-component vector of float)
+0:328              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:328                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:328                Constant:
+0:328                  0 (const int)
+0:328              Constant:
+0:328                0.000000
+0:328                0.000000
+0:328                0.000000
+0:329            move second child to first child ( temp highp 3-component vector of float)
+0:329              specular: direct index for structure ( global highp 3-component vector of float)
+0:329                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:329                Constant:
+0:329                  1 (const int)
+0:329              Constant:
+0:329                0.000000
+0:329                0.000000
+0:329                0.000000
+0:330            move second child to first child ( temp highp 3-component vector of float)
+0:330              specular2: direct index for structure ( global highp 3-component vector of float)
+0:330                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:330                Constant:
+0:330                  2 (const int)
+0:330              Constant:
+0:330                0.000000
+0:330                0.000000
+0:330                0.000000
+0:331            move second child to first child ( temp highp float)
+0:331              shadowStrength: direct index for structure ( global highp float)
+0:331                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:331                Constant:
+0:331                  3 (const int)
+0:331              Constant:
+0:331                0.000000
+0:332            Branch: Break
+0:334      move second child to first child ( temp highp 3-component vector of float)
+0:334        'diffuseContrib' ( inout highp 3-component vector of float)
+0:334        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:334          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:334          Constant:
+0:334            0 (const int)
+0:335      move second child to first child ( temp highp 3-component vector of float)
+0:335        'specularContrib' ( inout highp 3-component vector of float)
+0:335        specular: direct index for structure ( global highp 3-component vector of float)
+0:335          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:335          Constant:
+0:335            1 (const int)
+0:338  Function Definition: TDLighting(vf3;i1;vf3;vf3; ( global void)
+0:338    Function Parameters: 
+0:338      'diffuseContrib' ( inout highp 3-component vector of float)
+0:338      'index' ( in highp int)
+0:338      'worldSpacePos' ( in highp 3-component vector of float)
+0:338      'normal' ( in highp 3-component vector of float)
+0:?     Sequence
+0:341      switch
+0:341      condition
+0:341        'index' ( in highp int)
+0:341      body
+0:341        Sequence
+0:343          default: 
+0:?           Sequence
+0:344            move second child to first child ( temp highp 3-component vector of float)
+0:344              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:344                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:344                Constant:
+0:344                  0 (const int)
+0:344              Constant:
+0:344                0.000000
+0:344                0.000000
+0:344                0.000000
+0:345            move second child to first child ( temp highp 3-component vector of float)
+0:345              specular: direct index for structure ( global highp 3-component vector of float)
+0:345                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:345                Constant:
+0:345                  1 (const int)
+0:345              Constant:
+0:345                0.000000
+0:345                0.000000
+0:345                0.000000
+0:346            move second child to first child ( temp highp 3-component vector of float)
+0:346              specular2: direct index for structure ( global highp 3-component vector of float)
+0:346                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:346                Constant:
+0:346                  2 (const int)
+0:346              Constant:
+0:346                0.000000
+0:346                0.000000
+0:346                0.000000
+0:347            move second child to first child ( temp highp float)
+0:347              shadowStrength: direct index for structure ( global highp float)
+0:347                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:347                Constant:
+0:347                  3 (const int)
+0:347              Constant:
+0:347                0.000000
+0:348            Branch: Break
+0:350      move second child to first child ( temp highp 3-component vector of float)
+0:350        'diffuseContrib' ( inout highp 3-component vector of float)
+0:350        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:350          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:350          Constant:
+0:350            0 (const int)
+0:353  Function Definition: TDLighting(vf3;i1;vf3;vf3;f1;vf3; ( global void)
+0:353    Function Parameters: 
+0:353      'diffuseContrib' ( inout highp 3-component vector of float)
+0:353      'index' ( in highp int)
+0:353      'worldSpacePos' ( in highp 3-component vector of float)
+0:353      'normal' ( in highp 3-component vector of float)
+0:353      'shadowStrength' ( in highp float)
+0:353      'shadowColor' ( in highp 3-component vector of float)
+0:?     Sequence
+0:356      switch
+0:356      condition
+0:356        'index' ( in highp int)
+0:356      body
+0:356        Sequence
+0:358          default: 
+0:?           Sequence
+0:359            move second child to first child ( temp highp 3-component vector of float)
+0:359              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:359                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:359                Constant:
+0:359                  0 (const int)
+0:359              Constant:
+0:359                0.000000
+0:359                0.000000
+0:359                0.000000
+0:360            move second child to first child ( temp highp 3-component vector of float)
+0:360              specular: direct index for structure ( global highp 3-component vector of float)
+0:360                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:360                Constant:
+0:360                  1 (const int)
+0:360              Constant:
+0:360                0.000000
+0:360                0.000000
+0:360                0.000000
+0:361            move second child to first child ( temp highp 3-component vector of float)
+0:361              specular2: direct index for structure ( global highp 3-component vector of float)
+0:361                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:361                Constant:
+0:361                  2 (const int)
+0:361              Constant:
+0:361                0.000000
+0:361                0.000000
+0:361                0.000000
+0:362            move second child to first child ( temp highp float)
+0:362              shadowStrength: direct index for structure ( global highp float)
+0:362                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:362                Constant:
+0:362                  3 (const int)
+0:362              Constant:
+0:362                0.000000
+0:363            Branch: Break
+0:365      move second child to first child ( temp highp 3-component vector of float)
+0:365        'diffuseContrib' ( inout highp 3-component vector of float)
+0:365        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:365          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:365          Constant:
+0:365            0 (const int)
+0:367  Function Definition: TDProjMap(i1;vf3;vf4; ( global highp 4-component vector of float)
+0:367    Function Parameters: 
+0:367      'index' ( in highp int)
+0:367      'worldSpacePos' ( in highp 3-component vector of float)
+0:367      'defaultColor' ( in highp 4-component vector of float)
+0:368    Sequence
+0:368      switch
+0:368      condition
+0:368        'index' ( in highp int)
+0:368      body
+0:368        Sequence
+0:370          default: 
+0:?           Sequence
+0:370            Branch: Return with expression
+0:370              'defaultColor' ( in highp 4-component vector of float)
+0:373  Function Definition: TDFog(vf4;vf3;i1; ( global highp 4-component vector of float)
+0:373    Function Parameters: 
+0:373      'color' ( in highp 4-component vector of float)
+0:373      'lightingSpacePosition' ( in highp 3-component vector of float)
+0:373      'cameraIndex' ( in highp int)
+0:374    Sequence
+0:374      switch
+0:374      condition
+0:374        'cameraIndex' ( in highp int)
+0:374      body
+0:374        Sequence
+0:375          default: 
+0:376          case:  with expression
+0:376            Constant:
+0:376              0 (const int)
+0:?           Sequence
+0:378            Sequence
+0:378              Branch: Return with expression
+0:378                'color' ( in highp 4-component vector of float)
+0:382  Function Definition: TDFog(vf4;vf3; ( global highp 4-component vector of float)
+0:382    Function Parameters: 
+0:382      'color' ( in highp 4-component vector of float)
+0:382      'lightingSpacePosition' ( in highp 3-component vector of float)
+0:384    Sequence
+0:384      Branch: Return with expression
+0:384        Function Call: TDFog(vf4;vf3;i1; ( global highp 4-component vector of float)
+0:384          'color' ( in highp 4-component vector of float)
+0:384          'lightingSpacePosition' ( in highp 3-component vector of float)
+0:384          Constant:
+0:384            0 (const int)
+0:386  Function Definition: TDInstanceTexCoord(i1;vf3; ( global highp 3-component vector of float)
+0:386    Function Parameters: 
+0:386      'index' ( in highp int)
+0:386      't' ( in highp 3-component vector of float)
+0:?     Sequence
+0:388      Sequence
+0:388        move second child to first child ( temp highp int)
+0:388          'coord' ( temp highp int)
+0:388          'index' ( in highp int)
+0:389      Sequence
+0:389        move second child to first child ( temp highp 4-component vector of float)
+0:389          'samp' ( temp highp 4-component vector of float)
+0:389          textureFetch ( global highp 4-component vector of float)
+0:389            'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:389            'coord' ( temp highp int)
+0:390      move second child to first child ( temp highp float)
+0:390        direct index ( temp highp float)
+0:390          'v' ( temp highp 3-component vector of float)
+0:390          Constant:
+0:390            0 (const int)
+0:390        direct index ( temp highp float)
+0:390          't' ( in highp 3-component vector of float)
+0:390          Constant:
+0:390            0 (const int)
+0:391      move second child to first child ( temp highp float)
+0:391        direct index ( temp highp float)
+0:391          'v' ( temp highp 3-component vector of float)
+0:391          Constant:
+0:391            1 (const int)
+0:391        direct index ( temp highp float)
+0:391          't' ( in highp 3-component vector of float)
+0:391          Constant:
+0:391            1 (const int)
+0:392      move second child to first child ( temp highp float)
+0:392        direct index ( temp highp float)
+0:392          'v' ( temp highp 3-component vector of float)
+0:392          Constant:
+0:392            2 (const int)
+0:392        direct index ( temp highp float)
+0:392          'samp' ( temp highp 4-component vector of float)
+0:392          Constant:
+0:392            0 (const int)
+0:393      move second child to first child ( temp highp 3-component vector of float)
+0:393        vector swizzle ( temp highp 3-component vector of float)
+0:393          't' ( in highp 3-component vector of float)
+0:393          Sequence
+0:393            Constant:
+0:393              0 (const int)
+0:393            Constant:
+0:393              1 (const int)
+0:393            Constant:
+0:393              2 (const int)
+0:393        vector swizzle ( temp highp 3-component vector of float)
+0:393          'v' ( temp highp 3-component vector of float)
+0:393          Sequence
+0:393            Constant:
+0:393              0 (const int)
+0:393            Constant:
+0:393              1 (const int)
+0:393            Constant:
+0:393              2 (const int)
+0:394      Branch: Return with expression
+0:394        't' ( in highp 3-component vector of float)
+0:396  Function Definition: TDInstanceActive(i1; ( global bool)
+0:396    Function Parameters: 
+0:396      'index' ( in highp int)
+0:397    Sequence
+0:397      subtract second child into first child ( temp highp int)
+0:397        'index' ( in highp int)
+0:397        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:397          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:397          Constant:
+0:397            0 (const uint)
+0:399      Sequence
+0:399        move second child to first child ( temp highp int)
+0:399          'coord' ( temp highp int)
+0:399          'index' ( in highp int)
+0:400      Sequence
+0:400        move second child to first child ( temp highp 4-component vector of float)
+0:400          'samp' ( temp highp 4-component vector of float)
+0:400          textureFetch ( global highp 4-component vector of float)
+0:400            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:400            'coord' ( temp highp int)
+0:401      move second child to first child ( temp highp float)
+0:401        'v' ( temp highp float)
+0:401        direct index ( temp highp float)
+0:401          'samp' ( temp highp 4-component vector of float)
+0:401          Constant:
+0:401            0 (const int)
+0:402      Branch: Return with expression
+0:402        Compare Not Equal ( temp bool)
+0:402          'v' ( temp highp float)
+0:402          Constant:
+0:402            0.000000
+0:404  Function Definition: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:404    Function Parameters: 
+0:404      'index' ( in highp int)
+0:404      'instanceActive' ( out bool)
+0:405    Sequence
+0:405      Sequence
+0:405        move second child to first child ( temp highp int)
+0:405          'origIndex' ( temp highp int)
+0:405          'index' ( in highp int)
+0:406      subtract second child into first child ( temp highp int)
+0:406        'index' ( in highp int)
+0:406        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:406          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:406          Constant:
+0:406            0 (const uint)
+0:408      Sequence
+0:408        move second child to first child ( temp highp int)
+0:408          'coord' ( temp highp int)
+0:408          'index' ( in highp int)
+0:409      Sequence
+0:409        move second child to first child ( temp highp 4-component vector of float)
+0:409          'samp' ( temp highp 4-component vector of float)
+0:409          textureFetch ( global highp 4-component vector of float)
+0:409            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:409            'coord' ( temp highp int)
+0:410      move second child to first child ( temp highp float)
+0:410        direct index ( temp highp float)
+0:410          'v' ( temp highp 3-component vector of float)
+0:410          Constant:
+0:410            0 (const int)
+0:410        direct index ( temp highp float)
+0:410          'samp' ( temp highp 4-component vector of float)
+0:410          Constant:
+0:410            1 (const int)
+0:411      move second child to first child ( temp highp float)
+0:411        direct index ( temp highp float)
+0:411          'v' ( temp highp 3-component vector of float)
+0:411          Constant:
+0:411            1 (const int)
+0:411        direct index ( temp highp float)
+0:411          'samp' ( temp highp 4-component vector of float)
+0:411          Constant:
+0:411            2 (const int)
+0:412      move second child to first child ( temp highp float)
+0:412        direct index ( temp highp float)
+0:412          'v' ( temp highp 3-component vector of float)
+0:412          Constant:
+0:412            2 (const int)
+0:412        direct index ( temp highp float)
+0:412          'samp' ( temp highp 4-component vector of float)
+0:412          Constant:
+0:412            3 (const int)
+0:413      move second child to first child ( temp bool)
+0:413        'instanceActive' ( out bool)
+0:413        Compare Not Equal ( temp bool)
+0:413          direct index ( temp highp float)
+0:413            'samp' ( temp highp 4-component vector of float)
+0:413            Constant:
+0:413              0 (const int)
+0:413          Constant:
+0:413            0.000000
+0:414      Branch: Return with expression
+0:414        'v' ( temp highp 3-component vector of float)
+0:416  Function Definition: TDInstanceTranslate(i1; ( global highp 3-component vector of float)
+0:416    Function Parameters: 
+0:416      'index' ( in highp int)
+0:417    Sequence
+0:417      subtract second child into first child ( temp highp int)
+0:417        'index' ( in highp int)
+0:417        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:417          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:417          Constant:
+0:417            0 (const uint)
+0:419      Sequence
+0:419        move second child to first child ( temp highp int)
+0:419          'coord' ( temp highp int)
+0:419          'index' ( in highp int)
+0:420      Sequence
+0:420        move second child to first child ( temp highp 4-component vector of float)
+0:420          'samp' ( temp highp 4-component vector of float)
+0:420          textureFetch ( global highp 4-component vector of float)
+0:420            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:420            'coord' ( temp highp int)
+0:421      move second child to first child ( temp highp float)
+0:421        direct index ( temp highp float)
+0:421          'v' ( temp highp 3-component vector of float)
+0:421          Constant:
+0:421            0 (const int)
+0:421        direct index ( temp highp float)
+0:421          'samp' ( temp highp 4-component vector of float)
+0:421          Constant:
+0:421            1 (const int)
+0:422      move second child to first child ( temp highp float)
+0:422        direct index ( temp highp float)
+0:422          'v' ( temp highp 3-component vector of float)
+0:422          Constant:
+0:422            1 (const int)
+0:422        direct index ( temp highp float)
+0:422          'samp' ( temp highp 4-component vector of float)
+0:422          Constant:
+0:422            2 (const int)
+0:423      move second child to first child ( temp highp float)
+0:423        direct index ( temp highp float)
+0:423          'v' ( temp highp 3-component vector of float)
+0:423          Constant:
+0:423            2 (const int)
+0:423        direct index ( temp highp float)
+0:423          'samp' ( temp highp 4-component vector of float)
+0:423          Constant:
+0:423            3 (const int)
+0:424      Branch: Return with expression
+0:424        'v' ( temp highp 3-component vector of float)
+0:426  Function Definition: TDInstanceRotateMat(i1; ( global highp 3X3 matrix of float)
+0:426    Function Parameters: 
+0:426      'index' ( in highp int)
+0:427    Sequence
+0:427      subtract second child into first child ( temp highp int)
+0:427        'index' ( in highp int)
+0:427        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:427          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:427          Constant:
+0:427            0 (const uint)
+0:428      Sequence
+0:428        move second child to first child ( temp highp 3-component vector of float)
+0:428          'v' ( temp highp 3-component vector of float)
+0:428          Constant:
+0:428            0.000000
+0:428            0.000000
+0:428            0.000000
+0:429      Sequence
+0:429        move second child to first child ( temp highp 3X3 matrix of float)
+0:429          'm' ( temp highp 3X3 matrix of float)
+0:429          Constant:
+0:429            1.000000
+0:429            0.000000
+0:429            0.000000
+0:429            0.000000
+0:429            1.000000
+0:429            0.000000
+0:429            0.000000
+0:429            0.000000
+0:429            1.000000
+0:433      Branch: Return with expression
+0:433        'm' ( temp highp 3X3 matrix of float)
+0:435  Function Definition: TDInstanceScale(i1; ( global highp 3-component vector of float)
+0:435    Function Parameters: 
+0:435      'index' ( in highp int)
+0:436    Sequence
+0:436      subtract second child into first child ( temp highp int)
+0:436        'index' ( in highp int)
+0:436        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:436          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:436          Constant:
+0:436            0 (const uint)
+0:437      Sequence
+0:437        move second child to first child ( temp highp 3-component vector of float)
+0:437          'v' ( temp highp 3-component vector of float)
+0:437          Constant:
+0:437            1.000000
+0:437            1.000000
+0:437            1.000000
+0:438      Branch: Return with expression
+0:438        'v' ( temp highp 3-component vector of float)
+0:440  Function Definition: TDInstancePivot(i1; ( global highp 3-component vector of float)
+0:440    Function Parameters: 
+0:440      'index' ( in highp int)
+0:441    Sequence
+0:441      subtract second child into first child ( temp highp int)
+0:441        'index' ( in highp int)
+0:441        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:441          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:441          Constant:
+0:441            0 (const uint)
+0:442      Sequence
+0:442        move second child to first child ( temp highp 3-component vector of float)
+0:442          'v' ( temp highp 3-component vector of float)
+0:442          Constant:
+0:442            0.000000
+0:442            0.000000
+0:442            0.000000
+0:443      Branch: Return with expression
+0:443        'v' ( temp highp 3-component vector of float)
+0:445  Function Definition: TDInstanceRotTo(i1; ( global highp 3-component vector of float)
+0:445    Function Parameters: 
+0:445      'index' ( in highp int)
+0:446    Sequence
+0:446      subtract second child into first child ( temp highp int)
+0:446        'index' ( in highp int)
+0:446        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:446          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:446          Constant:
+0:446            0 (const uint)
+0:447      Sequence
+0:447        move second child to first child ( temp highp 3-component vector of float)
+0:447          'v' ( temp highp 3-component vector of float)
+0:447          Constant:
+0:447            0.000000
+0:447            0.000000
+0:447            1.000000
+0:448      Branch: Return with expression
+0:448        'v' ( temp highp 3-component vector of float)
+0:450  Function Definition: TDInstanceRotUp(i1; ( global highp 3-component vector of float)
+0:450    Function Parameters: 
+0:450      'index' ( in highp int)
+0:451    Sequence
+0:451      subtract second child into first child ( temp highp int)
+0:451        'index' ( in highp int)
+0:451        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:451          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:451          Constant:
+0:451            0 (const uint)
+0:452      Sequence
+0:452        move second child to first child ( temp highp 3-component vector of float)
+0:452          'v' ( temp highp 3-component vector of float)
+0:452          Constant:
+0:452            0.000000
+0:452            1.000000
+0:452            0.000000
+0:453      Branch: Return with expression
+0:453        'v' ( temp highp 3-component vector of float)
+0:455  Function Definition: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:455    Function Parameters: 
+0:455      'id' ( in highp int)
+0:456    Sequence
+0:456      Sequence
+0:456        move second child to first child ( temp bool)
+0:456          'instanceActive' ( temp bool)
+0:456          Constant:
+0:456            true (const bool)
+0:457      Sequence
+0:457        move second child to first child ( temp highp 3-component vector of float)
+0:457          't' ( temp highp 3-component vector of float)
+0:457          Function Call: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:457            'id' ( in highp int)
+0:457            'instanceActive' ( temp bool)
+0:458      Test condition and select ( temp void)
+0:458        Condition
+0:458        Negate conditional ( temp bool)
+0:458          'instanceActive' ( temp bool)
+0:458        true case
+0:460        Sequence
+0:460          Branch: Return with expression
+0:460            Constant:
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:462      Sequence
+0:462        move second child to first child ( temp highp 4X4 matrix of float)
+0:462          'm' ( temp highp 4X4 matrix of float)
+0:462          Constant:
+0:462            1.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            1.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            1.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            1.000000
+0:464      Sequence
+0:464        Sequence
+0:464          move second child to first child ( temp highp 3-component vector of float)
+0:464            'tt' ( temp highp 3-component vector of float)
+0:464            't' ( temp highp 3-component vector of float)
+0:465        add second child into first child ( temp highp float)
+0:465          direct index ( temp highp float)
+0:465            direct index ( temp highp 4-component vector of float)
+0:465              'm' ( temp highp 4X4 matrix of float)
+0:465              Constant:
+0:465                3 (const int)
+0:465            Constant:
+0:465              0 (const int)
+0:465          component-wise multiply ( temp highp float)
+0:465            direct index ( temp highp float)
+0:465              direct index ( temp highp 4-component vector of float)
+0:465                'm' ( temp highp 4X4 matrix of float)
+0:465                Constant:
+0:465                  0 (const int)
+0:465              Constant:
+0:465                0 (const int)
+0:465            direct index ( temp highp float)
+0:465              'tt' ( temp highp 3-component vector of float)
+0:465              Constant:
+0:465                0 (const int)
+0:466        add second child into first child ( temp highp float)
+0:466          direct index ( temp highp float)
+0:466            direct index ( temp highp 4-component vector of float)
+0:466              'm' ( temp highp 4X4 matrix of float)
+0:466              Constant:
+0:466                3 (const int)
+0:466            Constant:
+0:466              1 (const int)
+0:466          component-wise multiply ( temp highp float)
+0:466            direct index ( temp highp float)
+0:466              direct index ( temp highp 4-component vector of float)
+0:466                'm' ( temp highp 4X4 matrix of float)
+0:466                Constant:
+0:466                  0 (const int)
+0:466              Constant:
+0:466                1 (const int)
+0:466            direct index ( temp highp float)
+0:466              'tt' ( temp highp 3-component vector of float)
+0:466              Constant:
+0:466                0 (const int)
+0:467        add second child into first child ( temp highp float)
+0:467          direct index ( temp highp float)
+0:467            direct index ( temp highp 4-component vector of float)
+0:467              'm' ( temp highp 4X4 matrix of float)
+0:467              Constant:
+0:467                3 (const int)
+0:467            Constant:
+0:467              2 (const int)
+0:467          component-wise multiply ( temp highp float)
+0:467            direct index ( temp highp float)
+0:467              direct index ( temp highp 4-component vector of float)
+0:467                'm' ( temp highp 4X4 matrix of float)
+0:467                Constant:
+0:467                  0 (const int)
+0:467              Constant:
+0:467                2 (const int)
+0:467            direct index ( temp highp float)
+0:467              'tt' ( temp highp 3-component vector of float)
+0:467              Constant:
+0:467                0 (const int)
+0:468        add second child into first child ( temp highp float)
+0:468          direct index ( temp highp float)
+0:468            direct index ( temp highp 4-component vector of float)
+0:468              'm' ( temp highp 4X4 matrix of float)
+0:468              Constant:
+0:468                3 (const int)
+0:468            Constant:
+0:468              3 (const int)
+0:468          component-wise multiply ( temp highp float)
+0:468            direct index ( temp highp float)
+0:468              direct index ( temp highp 4-component vector of float)
+0:468                'm' ( temp highp 4X4 matrix of float)
+0:468                Constant:
+0:468                  0 (const int)
+0:468              Constant:
+0:468                3 (const int)
+0:468            direct index ( temp highp float)
+0:468              'tt' ( temp highp 3-component vector of float)
+0:468              Constant:
+0:468                0 (const int)
+0:469        add second child into first child ( temp highp float)
+0:469          direct index ( temp highp float)
+0:469            direct index ( temp highp 4-component vector of float)
+0:469              'm' ( temp highp 4X4 matrix of float)
+0:469              Constant:
+0:469                3 (const int)
+0:469            Constant:
+0:469              0 (const int)
+0:469          component-wise multiply ( temp highp float)
+0:469            direct index ( temp highp float)
+0:469              direct index ( temp highp 4-component vector of float)
+0:469                'm' ( temp highp 4X4 matrix of float)
+0:469                Constant:
+0:469                  1 (const int)
+0:469              Constant:
+0:469                0 (const int)
+0:469            direct index ( temp highp float)
+0:469              'tt' ( temp highp 3-component vector of float)
+0:469              Constant:
+0:469                1 (const int)
+0:470        add second child into first child ( temp highp float)
+0:470          direct index ( temp highp float)
+0:470            direct index ( temp highp 4-component vector of float)
+0:470              'm' ( temp highp 4X4 matrix of float)
+0:470              Constant:
+0:470                3 (const int)
+0:470            Constant:
+0:470              1 (const int)
+0:470          component-wise multiply ( temp highp float)
+0:470            direct index ( temp highp float)
+0:470              direct index ( temp highp 4-component vector of float)
+0:470                'm' ( temp highp 4X4 matrix of float)
+0:470                Constant:
+0:470                  1 (const int)
+0:470              Constant:
+0:470                1 (const int)
+0:470            direct index ( temp highp float)
+0:470              'tt' ( temp highp 3-component vector of float)
+0:470              Constant:
+0:470                1 (const int)
+0:471        add second child into first child ( temp highp float)
+0:471          direct index ( temp highp float)
+0:471            direct index ( temp highp 4-component vector of float)
+0:471              'm' ( temp highp 4X4 matrix of float)
+0:471              Constant:
+0:471                3 (const int)
+0:471            Constant:
+0:471              2 (const int)
+0:471          component-wise multiply ( temp highp float)
+0:471            direct index ( temp highp float)
+0:471              direct index ( temp highp 4-component vector of float)
+0:471                'm' ( temp highp 4X4 matrix of float)
+0:471                Constant:
+0:471                  1 (const int)
+0:471              Constant:
+0:471                2 (const int)
+0:471            direct index ( temp highp float)
+0:471              'tt' ( temp highp 3-component vector of float)
+0:471              Constant:
+0:471                1 (const int)
+0:472        add second child into first child ( temp highp float)
+0:472          direct index ( temp highp float)
+0:472            direct index ( temp highp 4-component vector of float)
+0:472              'm' ( temp highp 4X4 matrix of float)
+0:472              Constant:
+0:472                3 (const int)
+0:472            Constant:
+0:472              3 (const int)
+0:472          component-wise multiply ( temp highp float)
+0:472            direct index ( temp highp float)
+0:472              direct index ( temp highp 4-component vector of float)
+0:472                'm' ( temp highp 4X4 matrix of float)
+0:472                Constant:
+0:472                  1 (const int)
+0:472              Constant:
+0:472                3 (const int)
+0:472            direct index ( temp highp float)
+0:472              'tt' ( temp highp 3-component vector of float)
+0:472              Constant:
+0:472                1 (const int)
+0:473        add second child into first child ( temp highp float)
+0:473          direct index ( temp highp float)
+0:473            direct index ( temp highp 4-component vector of float)
+0:473              'm' ( temp highp 4X4 matrix of float)
+0:473              Constant:
+0:473                3 (const int)
+0:473            Constant:
+0:473              0 (const int)
+0:473          component-wise multiply ( temp highp float)
+0:473            direct index ( temp highp float)
+0:473              direct index ( temp highp 4-component vector of float)
+0:473                'm' ( temp highp 4X4 matrix of float)
+0:473                Constant:
+0:473                  2 (const int)
+0:473              Constant:
+0:473                0 (const int)
+0:473            direct index ( temp highp float)
+0:473              'tt' ( temp highp 3-component vector of float)
+0:473              Constant:
+0:473                2 (const int)
+0:474        add second child into first child ( temp highp float)
+0:474          direct index ( temp highp float)
+0:474            direct index ( temp highp 4-component vector of float)
+0:474              'm' ( temp highp 4X4 matrix of float)
+0:474              Constant:
+0:474                3 (const int)
+0:474            Constant:
+0:474              1 (const int)
+0:474          component-wise multiply ( temp highp float)
+0:474            direct index ( temp highp float)
+0:474              direct index ( temp highp 4-component vector of float)
+0:474                'm' ( temp highp 4X4 matrix of float)
+0:474                Constant:
+0:474                  2 (const int)
+0:474              Constant:
+0:474                1 (const int)
+0:474            direct index ( temp highp float)
+0:474              'tt' ( temp highp 3-component vector of float)
+0:474              Constant:
+0:474                2 (const int)
+0:475        add second child into first child ( temp highp float)
+0:475          direct index ( temp highp float)
+0:475            direct index ( temp highp 4-component vector of float)
+0:475              'm' ( temp highp 4X4 matrix of float)
+0:475              Constant:
+0:475                3 (const int)
+0:475            Constant:
+0:475              2 (const int)
+0:475          component-wise multiply ( temp highp float)
+0:475            direct index ( temp highp float)
+0:475              direct index ( temp highp 4-component vector of float)
+0:475                'm' ( temp highp 4X4 matrix of float)
+0:475                Constant:
+0:475                  2 (const int)
+0:475              Constant:
+0:475                2 (const int)
+0:475            direct index ( temp highp float)
+0:475              'tt' ( temp highp 3-component vector of float)
+0:475              Constant:
+0:475                2 (const int)
+0:476        add second child into first child ( temp highp float)
+0:476          direct index ( temp highp float)
+0:476            direct index ( temp highp 4-component vector of float)
+0:476              'm' ( temp highp 4X4 matrix of float)
+0:476              Constant:
+0:476                3 (const int)
+0:476            Constant:
+0:476              3 (const int)
+0:476          component-wise multiply ( temp highp float)
+0:476            direct index ( temp highp float)
+0:476              direct index ( temp highp 4-component vector of float)
+0:476                'm' ( temp highp 4X4 matrix of float)
+0:476                Constant:
+0:476                  2 (const int)
+0:476              Constant:
+0:476                3 (const int)
+0:476            direct index ( temp highp float)
+0:476              'tt' ( temp highp 3-component vector of float)
+0:476              Constant:
+0:476                2 (const int)
+0:478      Branch: Return with expression
+0:478        'm' ( temp highp 4X4 matrix of float)
+0:480  Function Definition: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:480    Function Parameters: 
+0:480      'id' ( in highp int)
+0:481    Sequence
+0:481      Sequence
+0:481        move second child to first child ( temp highp 3X3 matrix of float)
+0:481          'm' ( temp highp 3X3 matrix of float)
+0:481          Constant:
+0:481            1.000000
+0:481            0.000000
+0:481            0.000000
+0:481            0.000000
+0:481            1.000000
+0:481            0.000000
+0:481            0.000000
+0:481            0.000000
+0:481            1.000000
+0:482      Branch: Return with expression
+0:482        'm' ( temp highp 3X3 matrix of float)
+0:484  Function Definition: TDInstanceMat3ForNorm(i1; ( global highp 3X3 matrix of float)
+0:484    Function Parameters: 
+0:484      'id' ( in highp int)
+0:485    Sequence
+0:485      Sequence
+0:485        move second child to first child ( temp highp 3X3 matrix of float)
+0:485          'm' ( temp highp 3X3 matrix of float)
+0:485          Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:485            'id' ( in highp int)
+0:486      Branch: Return with expression
+0:486        'm' ( temp highp 3X3 matrix of float)
+0:488  Function Definition: TDInstanceColor(i1;vf4; ( global highp 4-component vector of float)
+0:488    Function Parameters: 
+0:488      'index' ( in highp int)
+0:488      'curColor' ( in highp 4-component vector of float)
+0:489    Sequence
+0:489      subtract second child into first child ( temp highp int)
+0:489        'index' ( in highp int)
+0:489        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:489          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:489          Constant:
+0:489            0 (const uint)
+0:491      Sequence
+0:491        move second child to first child ( temp highp int)
+0:491          'coord' ( temp highp int)
+0:491          'index' ( in highp int)
+0:492      Sequence
+0:492        move second child to first child ( temp highp 4-component vector of float)
+0:492          'samp' ( temp highp 4-component vector of float)
+0:492          textureFetch ( global highp 4-component vector of float)
+0:492            'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+0:492            'coord' ( temp highp int)
+0:493      move second child to first child ( temp highp float)
+0:493        direct index ( temp highp float)
+0:493          'v' ( temp highp 4-component vector of float)
+0:493          Constant:
+0:493            0 (const int)
+0:493        direct index ( temp highp float)
+0:493          'samp' ( temp highp 4-component vector of float)
+0:493          Constant:
+0:493            0 (const int)
+0:494      move second child to first child ( temp highp float)
+0:494        direct index ( temp highp float)
+0:494          'v' ( temp highp 4-component vector of float)
+0:494          Constant:
+0:494            1 (const int)
+0:494        direct index ( temp highp float)
+0:494          'samp' ( temp highp 4-component vector of float)
+0:494          Constant:
+0:494            1 (const int)
+0:495      move second child to first child ( temp highp float)
+0:495        direct index ( temp highp float)
+0:495          'v' ( temp highp 4-component vector of float)
+0:495          Constant:
+0:495            2 (const int)
+0:495        direct index ( temp highp float)
+0:495          'samp' ( temp highp 4-component vector of float)
+0:495          Constant:
+0:495            2 (const int)
+0:496      move second child to first child ( temp highp float)
+0:496        direct index ( temp highp float)
+0:496          'v' ( temp highp 4-component vector of float)
+0:496          Constant:
+0:496            3 (const int)
+0:496        Constant:
+0:496          1.000000
+0:497      move second child to first child ( temp highp float)
+0:497        direct index ( temp highp float)
+0:497          'curColor' ( in highp 4-component vector of float)
+0:497          Constant:
+0:497            0 (const int)
+0:497        direct index ( temp highp float)
+0:497          'v' ( temp highp 4-component vector of float)
+0:497          Constant:
+0:497            0 (const int)
+0:499      move second child to first child ( temp highp float)
+0:499        direct index ( temp highp float)
+0:499          'curColor' ( in highp 4-component vector of float)
+0:499          Constant:
+0:499            1 (const int)
+0:499        direct index ( temp highp float)
+0:499          'v' ( temp highp 4-component vector of float)
+0:499          Constant:
+0:499            1 (const int)
+0:501      move second child to first child ( temp highp float)
+0:501        direct index ( temp highp float)
+0:501          'curColor' ( in highp 4-component vector of float)
+0:501          Constant:
+0:501            2 (const int)
+0:501        direct index ( temp highp float)
+0:501          'v' ( temp highp 4-component vector of float)
+0:501          Constant:
+0:501            2 (const int)
+0:503      Branch: Return with expression
+0:503        'curColor' ( in highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'sTDNoiseMap' ( uniform highp sampler2D)
+0:?     'sTDSineLookup' ( uniform highp sampler1D)
+0:?     'sTDWhite2D' ( uniform highp sampler2D)
+0:?     'sTDWhite3D' ( uniform highp sampler3D)
+0:?     'sTDWhite2DArray' ( uniform highp sampler2DArray)
+0:?     'sTDWhiteCube' ( uniform highp samplerCube)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float position,  global highp 3-component vector of float direction,  global highp 3-component vector of float diffuse,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float lightSize,  global highp 4-component vector of float misc,  global highp 4-component vector of float coneLookupScaleBias,  global highp 4-component vector of float attenScaleBiasRoll, layout( column_major std140) global highp 4X4 matrix of float shadowMapMatrix, layout( column_major std140) global highp 4X4 matrix of float shadowMapCamMatrix,  global highp 4-component vector of float shadowMapRes, layout( column_major std140) global highp 4X4 matrix of float projMapMatrix} uTDLights})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 3-component vector of float color, layout( column_major std140) global highp 3X3 matrix of float rotate} uTDEnvLights})
+0:?     'uTDEnvLightBuffers' (layout( column_major std430) restrict readonly buffer 1-element array of block{layout( column_major std430 offset=0) restrict readonly buffer 9-element array of highp 3-component vector of float shCoeffs})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@4' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@5' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:?     'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:?     'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+
+vk.relaxed.stagelink.0.2.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: TDOutputSwizzle(vf4; ( global highp 4-component vector of float)
+0:2    Function Parameters: 
+0:2      'c' ( in highp 4-component vector of float)
+0:4    Sequence
+0:4      Branch: Return with expression
+0:4        vector swizzle ( temp highp 4-component vector of float)
+0:4          'c' ( in highp 4-component vector of float)
+0:4          Sequence
+0:4            Constant:
+0:4              0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4            Constant:
+0:4              2 (const int)
+0:4            Constant:
+0:4              3 (const int)
+0:6  Function Definition: TDOutputSwizzle(vu4; ( global highp 4-component vector of uint)
+0:6    Function Parameters: 
+0:6      'c' ( in highp 4-component vector of uint)
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        vector swizzle ( temp highp 4-component vector of uint)
+0:8          'c' ( in highp 4-component vector of uint)
+0:8          Sequence
+0:8            Constant:
+0:8              0 (const int)
+0:8            Constant:
+0:8              1 (const int)
+0:8            Constant:
+0:8              2 (const int)
+0:8            Constant:
+0:8              3 (const int)
+0:?   Linker Objects
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+0:? Sequence
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:15    Sequence
+0:15      Sequence
+0:15        Sequence
+0:15          move second child to first child ( temp highp 3-component vector of float)
+0:15            'texcoord' ( temp highp 3-component vector of float)
+0:15            Function Call: TDInstanceTexCoord(vf3; ( global highp 3-component vector of float)
+0:15              direct index (layout( location=3) temp highp 3-component vector of float)
+0:15                'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:15                Constant:
+0:15                  0 (const int)
+0:16        move second child to first child ( temp highp 3-component vector of float)
+0:16          vector swizzle ( temp highp 3-component vector of float)
+0:16            texCoord0: direct index for structure ( out highp 3-component vector of float)
+0:16              'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:16              Constant:
+0:16                2 (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                2 (const int)
+0:16          vector swizzle ( temp highp 3-component vector of float)
+0:16            'texcoord' ( temp highp 3-component vector of float)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:16              Constant:
+0:16                2 (const int)
+0:20      move second child to first child ( temp highp int)
+0:20        instance: direct index for structure ( flat out highp int)
+0:20          'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:20          Constant:
+0:20            4 (const int)
+0:20        Function Call: TDInstanceID( ( global highp int)
+0:21      Sequence
+0:21        move second child to first child ( temp highp 4-component vector of float)
+0:21          'worldSpacePos' ( temp highp 4-component vector of float)
+0:21          Function Call: TDDeform(vf3; ( global highp 4-component vector of float)
+0:21            'P' (layout( location=0) in highp 3-component vector of float)
+0:22      Sequence
+0:22        move second child to first child ( temp highp 3-component vector of float)
+0:22          'uvUnwrapCoord' ( temp highp 3-component vector of float)
+0:22          Function Call: TDInstanceTexCoord(vf3; ( global highp 3-component vector of float)
+0:22            Function Call: TDUVUnwrapCoord( ( global highp 3-component vector of float)
+0:23      move second child to first child ( temp highp 4-component vector of float)
+0:23        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:23          'anon@4' ( out block{ 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,  out 1-element array of float CullDistance gl_CullDistance})
+0:23          Constant:
+0:23            0 (const uint)
+0:23        Function Call: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:23          'worldSpacePos' ( temp highp 4-component vector of float)
+0:23          'uvUnwrapCoord' ( temp highp 3-component vector of float)
+0:32      Sequence
+0:32        move second child to first child ( temp highp int)
+0:32          'cameraIndex' ( temp highp int)
+0:32          Function Call: TDCameraIndex( ( global highp int)
+0:33      move second child to first child ( temp highp int)
+0:33        cameraIndex: direct index for structure ( flat out highp int)
+0:33          'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:33          Constant:
+0:33            3 (const int)
+0:33        'cameraIndex' ( temp highp int)
+0:34      move second child to first child ( temp highp 3-component vector of float)
+0:34        vector swizzle ( temp highp 3-component vector of float)
+0:34          worldSpacePos: direct index for structure ( out highp 3-component vector of float)
+0:34            'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:34            Constant:
+0:34              1 (const int)
+0:34          Sequence
+0:34            Constant:
+0:34              0 (const int)
+0:34            Constant:
+0:34              1 (const int)
+0:34            Constant:
+0:34              2 (const int)
+0:34        vector swizzle ( temp highp 3-component vector of float)
+0:34          'worldSpacePos' ( temp highp 4-component vector of float)
+0:34          Sequence
+0:34            Constant:
+0:34              0 (const int)
+0:34            Constant:
+0:34              1 (const int)
+0:34            Constant:
+0:34              2 (const int)
+0:35      move second child to first child ( temp highp 4-component vector of float)
+0:35        color: direct index for structure ( out highp 4-component vector of float)
+0:35          'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:35          Constant:
+0:35            0 (const int)
+0:35        Function Call: TDInstanceColor(vf4; ( global highp 4-component vector of float)
+0:35          'Cd' (layout( location=2) in highp 4-component vector of float)
+0:176  Function Definition: iTDCamToProj(vf4;vf3;i1;b1; ( global highp 4-component vector of float)
+0:176    Function Parameters: 
+0:176      'v' ( in highp 4-component vector of float)
+0:176      'uv' ( in highp 3-component vector of float)
+0:176      'cameraIndex' ( in highp int)
+0:176      'applyPickMod' ( in bool)
+0:178    Sequence
+0:178      Test condition and select ( temp void)
+0:178        Condition
+0:178        Negate conditional ( temp bool)
+0:178          Function Call: TDInstanceActive( ( global bool)
+0:178        true case
+0:179        Branch: Return with expression
+0:179          Constant:
+0:179            2.000000
+0:179            2.000000
+0:179            2.000000
+0:179            0.000000
+0:180      move second child to first child ( temp highp 4-component vector of float)
+0:180        'v' ( in highp 4-component vector of float)
+0:180        matrix-times-vector ( temp highp 4-component vector of float)
+0:180          proj: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:180            direct index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:180              uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:180                'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:180                Constant:
+0:180                  0 (const uint)
+0:180              Constant:
+0:180                0 (const int)
+0:180            Constant:
+0:180              8 (const int)
+0:180          'v' ( in highp 4-component vector of float)
+0:181      Branch: Return with expression
+0:181        'v' ( in highp 4-component vector of float)
+0:183  Function Definition: iTDWorldToProj(vf4;vf3;i1;b1; ( global highp 4-component vector of float)
+0:183    Function Parameters: 
+0:183      'v' ( in highp 4-component vector of float)
+0:183      'uv' ( in highp 3-component vector of float)
+0:183      'cameraIndex' ( in highp int)
+0:183      'applyPickMod' ( in bool)
+0:184    Sequence
+0:184      Test condition and select ( temp void)
+0:184        Condition
+0:184        Negate conditional ( temp bool)
+0:184          Function Call: TDInstanceActive( ( global bool)
+0:184        true case
+0:185        Branch: Return with expression
+0:185          Constant:
+0:185            2.000000
+0:185            2.000000
+0:185            2.000000
+0:185            0.000000
+0:186      move second child to first child ( temp highp 4-component vector of float)
+0:186        'v' ( in highp 4-component vector of float)
+0:186        matrix-times-vector ( temp highp 4-component vector of float)
+0:186          camProj: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:186            direct index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:186              uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:186                'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:186                Constant:
+0:186                  0 (const uint)
+0:186              Constant:
+0:186                0 (const int)
+0:186            Constant:
+0:186              6 (const int)
+0:186          'v' ( in highp 4-component vector of float)
+0:187      Branch: Return with expression
+0:187        'v' ( in highp 4-component vector of float)
+0:193  Function Definition: TDInstanceID( ( global highp int)
+0:193    Function Parameters: 
+0:194    Sequence
+0:194      Branch: Return with expression
+0:194        add ( temp highp int)
+0:194          'gl_InstanceIndex' ( in highp int InstanceIndex)
+0:194          uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:194            'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:194            Constant:
+0:194              0 (const uint)
+0:196  Function Definition: TDCameraIndex( ( global highp int)
+0:196    Function Parameters: 
+0:197    Sequence
+0:197      Branch: Return with expression
+0:197        Constant:
+0:197          0 (const int)
+0:199  Function Definition: TDUVUnwrapCoord( ( global highp 3-component vector of float)
+0:199    Function Parameters: 
+0:200    Sequence
+0:200      Branch: Return with expression
+0:200        direct index (layout( location=3) temp highp 3-component vector of float)
+0:200          'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:200          Constant:
+0:200            0 (const int)
+0:205  Function Definition: TDPickID( ( global highp int)
+0:205    Function Parameters: 
+0:209    Sequence
+0:209      Branch: Return with expression
+0:209        Constant:
+0:209          0 (const int)
+0:212  Function Definition: iTDConvertPickId(i1; ( global highp float)
+0:212    Function Parameters: 
+0:212      'id' ( in highp int)
+0:213    Sequence
+0:213      or second child into first child ( temp highp int)
+0:213        'id' ( in highp int)
+0:213        Constant:
+0:213          1073741824 (const int)
+0:214      Branch: Return with expression
+0:214        intBitsToFloat ( global highp float)
+0:214          'id' ( in highp int)
+0:217  Function Definition: TDWritePickingValues( ( global void)
+0:217    Function Parameters: 
+0:224  Function Definition: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:224    Function Parameters: 
+0:224      'v' ( in highp 4-component vector of float)
+0:224      'uv' ( in highp 3-component vector of float)
+0:226    Sequence
+0:226      Branch: Return with expression
+0:226        Function Call: iTDWorldToProj(vf4;vf3;i1;b1; ( global highp 4-component vector of float)
+0:226          'v' ( in highp 4-component vector of float)
+0:226          'uv' ( in highp 3-component vector of float)
+0:226          Function Call: TDCameraIndex( ( global highp int)
+0:226          Constant:
+0:226            true (const bool)
+0:228  Function Definition: TDWorldToProj(vf3;vf3; ( global highp 4-component vector of float)
+0:228    Function Parameters: 
+0:228      'v' ( in highp 3-component vector of float)
+0:228      'uv' ( in highp 3-component vector of float)
+0:230    Sequence
+0:230      Branch: Return with expression
+0:230        Function Call: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:230          Construct vec4 ( temp highp 4-component vector of float)
+0:230            'v' ( in highp 3-component vector of float)
+0:230            Constant:
+0:230              1.000000
+0:230          'uv' ( in highp 3-component vector of float)
+0:232  Function Definition: TDWorldToProj(vf4; ( global highp 4-component vector of float)
+0:232    Function Parameters: 
+0:232      'v' ( in highp 4-component vector of float)
+0:234    Sequence
+0:234      Branch: Return with expression
+0:234        Function Call: TDWorldToProj(vf4;vf3; ( global highp 4-component vector of float)
+0:234          'v' ( in highp 4-component vector of float)
+0:234          Constant:
+0:234            0.000000
+0:234            0.000000
+0:234            0.000000
+0:236  Function Definition: TDWorldToProj(vf3; ( global highp 4-component vector of float)
+0:236    Function Parameters: 
+0:236      'v' ( in highp 3-component vector of float)
+0:238    Sequence
+0:238      Branch: Return with expression
+0:238        Function Call: TDWorldToProj(vf4; ( global highp 4-component vector of float)
+0:238          Construct vec4 ( temp highp 4-component vector of float)
+0:238            'v' ( in highp 3-component vector of float)
+0:238            Constant:
+0:238              1.000000
+0:240  Function Definition: TDPointColor( ( global highp 4-component vector of float)
+0:240    Function Parameters: 
+0:241    Sequence
+0:241      Branch: Return with expression
+0:241        'Cd' (layout( location=2) in highp 4-component vector of float)
+0:114  Function Definition: TDInstanceTexCoord(i1;vf3; ( global highp 3-component vector of float)
+0:114    Function Parameters: 
+0:114      'index' ( in highp int)
+0:114      't' ( in highp 3-component vector of float)
+0:?     Sequence
+0:116      Sequence
+0:116        move second child to first child ( temp highp int)
+0:116          'coord' ( temp highp int)
+0:116          'index' ( in highp int)
+0:117      Sequence
+0:117        move second child to first child ( temp highp 4-component vector of float)
+0:117          'samp' ( temp highp 4-component vector of float)
+0:117          textureFetch ( global highp 4-component vector of float)
+0:117            'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:117            'coord' ( temp highp int)
+0:118      move second child to first child ( temp highp float)
+0:118        direct index ( temp highp float)
+0:118          'v' ( temp highp 3-component vector of float)
+0:118          Constant:
+0:118            0 (const int)
+0:118        direct index ( temp highp float)
+0:118          't' ( in highp 3-component vector of float)
+0:118          Constant:
+0:118            0 (const int)
+0:119      move second child to first child ( temp highp float)
+0:119        direct index ( temp highp float)
+0:119          'v' ( temp highp 3-component vector of float)
+0:119          Constant:
+0:119            1 (const int)
+0:119        direct index ( temp highp float)
+0:119          't' ( in highp 3-component vector of float)
+0:119          Constant:
+0:119            1 (const int)
+0:120      move second child to first child ( temp highp float)
+0:120        direct index ( temp highp float)
+0:120          'v' ( temp highp 3-component vector of float)
+0:120          Constant:
+0:120            2 (const int)
+0:120        direct index ( temp highp float)
+0:120          'samp' ( temp highp 4-component vector of float)
+0:120          Constant:
+0:120            0 (const int)
+0:121      move second child to first child ( temp highp 3-component vector of float)
+0:121        vector swizzle ( temp highp 3-component vector of float)
+0:121          't' ( in highp 3-component vector of float)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121            Constant:
+0:121              2 (const int)
+0:121        vector swizzle ( temp highp 3-component vector of float)
+0:121          'v' ( temp highp 3-component vector of float)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121            Constant:
+0:121              2 (const int)
+0:122      Branch: Return with expression
+0:122        't' ( in highp 3-component vector of float)
+0:124  Function Definition: TDInstanceActive(i1; ( global bool)
+0:124    Function Parameters: 
+0:124      'index' ( in highp int)
+0:125    Sequence
+0:125      subtract second child into first child ( temp highp int)
+0:125        'index' ( in highp int)
+0:125        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:125          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:125          Constant:
+0:125            0 (const uint)
+0:127      Sequence
+0:127        move second child to first child ( temp highp int)
+0:127          'coord' ( temp highp int)
+0:127          'index' ( in highp int)
+0:128      Sequence
+0:128        move second child to first child ( temp highp 4-component vector of float)
+0:128          'samp' ( temp highp 4-component vector of float)
+0:128          textureFetch ( global highp 4-component vector of float)
+0:128            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:128            'coord' ( temp highp int)
+0:129      move second child to first child ( temp highp float)
+0:129        'v' ( temp highp float)
+0:129        direct index ( temp highp float)
+0:129          'samp' ( temp highp 4-component vector of float)
+0:129          Constant:
+0:129            0 (const int)
+0:130      Branch: Return with expression
+0:130        Compare Not Equal ( temp bool)
+0:130          'v' ( temp highp float)
+0:130          Constant:
+0:130            0.000000
+0:132  Function Definition: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:132    Function Parameters: 
+0:132      'index' ( in highp int)
+0:132      'instanceActive' ( out bool)
+0:133    Sequence
+0:133      Sequence
+0:133        move second child to first child ( temp highp int)
+0:133          'origIndex' ( temp highp int)
+0:133          'index' ( in highp int)
+0:134      subtract second child into first child ( temp highp int)
+0:134        'index' ( in highp int)
+0:134        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:134          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:134          Constant:
+0:134            0 (const uint)
+0:136      Sequence
+0:136        move second child to first child ( temp highp int)
+0:136          'coord' ( temp highp int)
+0:136          'index' ( in highp int)
+0:137      Sequence
+0:137        move second child to first child ( temp highp 4-component vector of float)
+0:137          'samp' ( temp highp 4-component vector of float)
+0:137          textureFetch ( global highp 4-component vector of float)
+0:137            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:137            'coord' ( temp highp int)
+0:138      move second child to first child ( temp highp float)
+0:138        direct index ( temp highp float)
+0:138          'v' ( temp highp 3-component vector of float)
+0:138          Constant:
+0:138            0 (const int)
+0:138        direct index ( temp highp float)
+0:138          'samp' ( temp highp 4-component vector of float)
+0:138          Constant:
+0:138            1 (const int)
+0:139      move second child to first child ( temp highp float)
+0:139        direct index ( temp highp float)
+0:139          'v' ( temp highp 3-component vector of float)
+0:139          Constant:
+0:139            1 (const int)
+0:139        direct index ( temp highp float)
+0:139          'samp' ( temp highp 4-component vector of float)
+0:139          Constant:
+0:139            2 (const int)
+0:140      move second child to first child ( temp highp float)
+0:140        direct index ( temp highp float)
+0:140          'v' ( temp highp 3-component vector of float)
+0:140          Constant:
+0:140            2 (const int)
+0:140        direct index ( temp highp float)
+0:140          'samp' ( temp highp 4-component vector of float)
+0:140          Constant:
+0:140            3 (const int)
+0:141      move second child to first child ( temp bool)
+0:141        'instanceActive' ( out bool)
+0:141        Compare Not Equal ( temp bool)
+0:141          direct index ( temp highp float)
+0:141            'samp' ( temp highp 4-component vector of float)
+0:141            Constant:
+0:141              0 (const int)
+0:141          Constant:
+0:141            0.000000
+0:142      Branch: Return with expression
+0:142        'v' ( temp highp 3-component vector of float)
+0:144  Function Definition: TDInstanceTranslate(i1; ( global highp 3-component vector of float)
+0:144    Function Parameters: 
+0:144      'index' ( in highp int)
+0:145    Sequence
+0:145      subtract second child into first child ( temp highp int)
+0:145        'index' ( in highp int)
+0:145        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:145          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:145          Constant:
+0:145            0 (const uint)
+0:147      Sequence
+0:147        move second child to first child ( temp highp int)
+0:147          'coord' ( temp highp int)
+0:147          'index' ( in highp int)
+0:148      Sequence
+0:148        move second child to first child ( temp highp 4-component vector of float)
+0:148          'samp' ( temp highp 4-component vector of float)
+0:148          textureFetch ( global highp 4-component vector of float)
+0:148            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:148            'coord' ( temp highp int)
+0:149      move second child to first child ( temp highp float)
+0:149        direct index ( temp highp float)
+0:149          'v' ( temp highp 3-component vector of float)
+0:149          Constant:
+0:149            0 (const int)
+0:149        direct index ( temp highp float)
+0:149          'samp' ( temp highp 4-component vector of float)
+0:149          Constant:
+0:149            1 (const int)
+0:150      move second child to first child ( temp highp float)
+0:150        direct index ( temp highp float)
+0:150          'v' ( temp highp 3-component vector of float)
+0:150          Constant:
+0:150            1 (const int)
+0:150        direct index ( temp highp float)
+0:150          'samp' ( temp highp 4-component vector of float)
+0:150          Constant:
+0:150            2 (const int)
+0:151      move second child to first child ( temp highp float)
+0:151        direct index ( temp highp float)
+0:151          'v' ( temp highp 3-component vector of float)
+0:151          Constant:
+0:151            2 (const int)
+0:151        direct index ( temp highp float)
+0:151          'samp' ( temp highp 4-component vector of float)
+0:151          Constant:
+0:151            3 (const int)
+0:152      Branch: Return with expression
+0:152        'v' ( temp highp 3-component vector of float)
+0:154  Function Definition: TDInstanceRotateMat(i1; ( global highp 3X3 matrix of float)
+0:154    Function Parameters: 
+0:154      'index' ( in highp int)
+0:155    Sequence
+0:155      subtract second child into first child ( temp highp int)
+0:155        'index' ( in highp int)
+0:155        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:155          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:155          Constant:
+0:155            0 (const uint)
+0:156      Sequence
+0:156        move second child to first child ( temp highp 3-component vector of float)
+0:156          'v' ( temp highp 3-component vector of float)
+0:156          Constant:
+0:156            0.000000
+0:156            0.000000
+0:156            0.000000
+0:157      Sequence
+0:157        move second child to first child ( temp highp 3X3 matrix of float)
+0:157          'm' ( temp highp 3X3 matrix of float)
+0:157          Constant:
+0:157            1.000000
+0:157            0.000000
+0:157            0.000000
+0:157            0.000000
+0:157            1.000000
+0:157            0.000000
+0:157            0.000000
+0:157            0.000000
+0:157            1.000000
+0:161      Branch: Return with expression
+0:161        'm' ( temp highp 3X3 matrix of float)
+0:163  Function Definition: TDInstanceScale(i1; ( global highp 3-component vector of float)
+0:163    Function Parameters: 
+0:163      'index' ( in highp int)
+0:164    Sequence
+0:164      subtract second child into first child ( temp highp int)
+0:164        'index' ( in highp int)
+0:164        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:164          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:164          Constant:
+0:164            0 (const uint)
+0:165      Sequence
+0:165        move second child to first child ( temp highp 3-component vector of float)
+0:165          'v' ( temp highp 3-component vector of float)
+0:165          Constant:
+0:165            1.000000
+0:165            1.000000
+0:165            1.000000
+0:166      Branch: Return with expression
+0:166        'v' ( temp highp 3-component vector of float)
+0:168  Function Definition: TDInstancePivot(i1; ( global highp 3-component vector of float)
+0:168    Function Parameters: 
+0:168      'index' ( in highp int)
+0:169    Sequence
+0:169      subtract second child into first child ( temp highp int)
+0:169        'index' ( in highp int)
+0:169        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:169          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:169          Constant:
+0:169            0 (const uint)
+0:170      Sequence
+0:170        move second child to first child ( temp highp 3-component vector of float)
+0:170          'v' ( temp highp 3-component vector of float)
+0:170          Constant:
+0:170            0.000000
+0:170            0.000000
+0:170            0.000000
+0:171      Branch: Return with expression
+0:171        'v' ( temp highp 3-component vector of float)
+0:173  Function Definition: TDInstanceRotTo(i1; ( global highp 3-component vector of float)
+0:173    Function Parameters: 
+0:173      'index' ( in highp int)
+0:174    Sequence
+0:174      subtract second child into first child ( temp highp int)
+0:174        'index' ( in highp int)
+0:174        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:174          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:174          Constant:
+0:174            0 (const uint)
+0:175      Sequence
+0:175        move second child to first child ( temp highp 3-component vector of float)
+0:175          'v' ( temp highp 3-component vector of float)
+0:175          Constant:
+0:175            0.000000
+0:175            0.000000
+0:175            1.000000
+0:176      Branch: Return with expression
+0:176        'v' ( temp highp 3-component vector of float)
+0:178  Function Definition: TDInstanceRotUp(i1; ( global highp 3-component vector of float)
+0:178    Function Parameters: 
+0:178      'index' ( in highp int)
+0:179    Sequence
+0:179      subtract second child into first child ( temp highp int)
+0:179        'index' ( in highp int)
+0:179        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:179          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:179          Constant:
+0:179            0 (const uint)
+0:180      Sequence
+0:180        move second child to first child ( temp highp 3-component vector of float)
+0:180          'v' ( temp highp 3-component vector of float)
+0:180          Constant:
+0:180            0.000000
+0:180            1.000000
+0:180            0.000000
+0:181      Branch: Return with expression
+0:181        'v' ( temp highp 3-component vector of float)
+0:183  Function Definition: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:183    Function Parameters: 
+0:183      'id' ( in highp int)
+0:184    Sequence
+0:184      Sequence
+0:184        move second child to first child ( temp bool)
+0:184          'instanceActive' ( temp bool)
+0:184          Constant:
+0:184            true (const bool)
+0:185      Sequence
+0:185        move second child to first child ( temp highp 3-component vector of float)
+0:185          't' ( temp highp 3-component vector of float)
+0:185          Function Call: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:185            'id' ( in highp int)
+0:185            'instanceActive' ( temp bool)
+0:186      Test condition and select ( temp void)
+0:186        Condition
+0:186        Negate conditional ( temp bool)
+0:186          'instanceActive' ( temp bool)
+0:186        true case
+0:188        Sequence
+0:188          Branch: Return with expression
+0:188            Constant:
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:188              0.000000
+0:190      Sequence
+0:190        move second child to first child ( temp highp 4X4 matrix of float)
+0:190          'm' ( temp highp 4X4 matrix of float)
+0:190          Constant:
+0:190            1.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            1.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            1.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            0.000000
+0:190            1.000000
+0:192      Sequence
+0:192        Sequence
+0:192          move second child to first child ( temp highp 3-component vector of float)
+0:192            'tt' ( temp highp 3-component vector of float)
+0:192            't' ( temp highp 3-component vector of float)
+0:193        add second child into first child ( temp highp float)
+0:193          direct index ( temp highp float)
+0:193            direct index ( temp highp 4-component vector of float)
+0:193              'm' ( temp highp 4X4 matrix of float)
+0:193              Constant:
+0:193                3 (const int)
+0:193            Constant:
+0:193              0 (const int)
+0:193          component-wise multiply ( temp highp float)
+0:193            direct index ( temp highp float)
+0:193              direct index ( temp highp 4-component vector of float)
+0:193                'm' ( temp highp 4X4 matrix of float)
+0:193                Constant:
+0:193                  0 (const int)
+0:193              Constant:
+0:193                0 (const int)
+0:193            direct index ( temp highp float)
+0:193              'tt' ( temp highp 3-component vector of float)
+0:193              Constant:
+0:193                0 (const int)
+0:194        add second child into first child ( temp highp float)
+0:194          direct index ( temp highp float)
+0:194            direct index ( temp highp 4-component vector of float)
+0:194              'm' ( temp highp 4X4 matrix of float)
+0:194              Constant:
+0:194                3 (const int)
+0:194            Constant:
+0:194              1 (const int)
+0:194          component-wise multiply ( temp highp float)
+0:194            direct index ( temp highp float)
+0:194              direct index ( temp highp 4-component vector of float)
+0:194                'm' ( temp highp 4X4 matrix of float)
+0:194                Constant:
+0:194                  0 (const int)
+0:194              Constant:
+0:194                1 (const int)
+0:194            direct index ( temp highp float)
+0:194              'tt' ( temp highp 3-component vector of float)
+0:194              Constant:
+0:194                0 (const int)
+0:195        add second child into first child ( temp highp float)
+0:195          direct index ( temp highp float)
+0:195            direct index ( temp highp 4-component vector of float)
+0:195              'm' ( temp highp 4X4 matrix of float)
+0:195              Constant:
+0:195                3 (const int)
+0:195            Constant:
+0:195              2 (const int)
+0:195          component-wise multiply ( temp highp float)
+0:195            direct index ( temp highp float)
+0:195              direct index ( temp highp 4-component vector of float)
+0:195                'm' ( temp highp 4X4 matrix of float)
+0:195                Constant:
+0:195                  0 (const int)
+0:195              Constant:
+0:195                2 (const int)
+0:195            direct index ( temp highp float)
+0:195              'tt' ( temp highp 3-component vector of float)
+0:195              Constant:
+0:195                0 (const int)
+0:196        add second child into first child ( temp highp float)
+0:196          direct index ( temp highp float)
+0:196            direct index ( temp highp 4-component vector of float)
+0:196              'm' ( temp highp 4X4 matrix of float)
+0:196              Constant:
+0:196                3 (const int)
+0:196            Constant:
+0:196              3 (const int)
+0:196          component-wise multiply ( temp highp float)
+0:196            direct index ( temp highp float)
+0:196              direct index ( temp highp 4-component vector of float)
+0:196                'm' ( temp highp 4X4 matrix of float)
+0:196                Constant:
+0:196                  0 (const int)
+0:196              Constant:
+0:196                3 (const int)
+0:196            direct index ( temp highp float)
+0:196              'tt' ( temp highp 3-component vector of float)
+0:196              Constant:
+0:196                0 (const int)
+0:197        add second child into first child ( temp highp float)
+0:197          direct index ( temp highp float)
+0:197            direct index ( temp highp 4-component vector of float)
+0:197              'm' ( temp highp 4X4 matrix of float)
+0:197              Constant:
+0:197                3 (const int)
+0:197            Constant:
+0:197              0 (const int)
+0:197          component-wise multiply ( temp highp float)
+0:197            direct index ( temp highp float)
+0:197              direct index ( temp highp 4-component vector of float)
+0:197                'm' ( temp highp 4X4 matrix of float)
+0:197                Constant:
+0:197                  1 (const int)
+0:197              Constant:
+0:197                0 (const int)
+0:197            direct index ( temp highp float)
+0:197              'tt' ( temp highp 3-component vector of float)
+0:197              Constant:
+0:197                1 (const int)
+0:198        add second child into first child ( temp highp float)
+0:198          direct index ( temp highp float)
+0:198            direct index ( temp highp 4-component vector of float)
+0:198              'm' ( temp highp 4X4 matrix of float)
+0:198              Constant:
+0:198                3 (const int)
+0:198            Constant:
+0:198              1 (const int)
+0:198          component-wise multiply ( temp highp float)
+0:198            direct index ( temp highp float)
+0:198              direct index ( temp highp 4-component vector of float)
+0:198                'm' ( temp highp 4X4 matrix of float)
+0:198                Constant:
+0:198                  1 (const int)
+0:198              Constant:
+0:198                1 (const int)
+0:198            direct index ( temp highp float)
+0:198              'tt' ( temp highp 3-component vector of float)
+0:198              Constant:
+0:198                1 (const int)
+0:199        add second child into first child ( temp highp float)
+0:199          direct index ( temp highp float)
+0:199            direct index ( temp highp 4-component vector of float)
+0:199              'm' ( temp highp 4X4 matrix of float)
+0:199              Constant:
+0:199                3 (const int)
+0:199            Constant:
+0:199              2 (const int)
+0:199          component-wise multiply ( temp highp float)
+0:199            direct index ( temp highp float)
+0:199              direct index ( temp highp 4-component vector of float)
+0:199                'm' ( temp highp 4X4 matrix of float)
+0:199                Constant:
+0:199                  1 (const int)
+0:199              Constant:
+0:199                2 (const int)
+0:199            direct index ( temp highp float)
+0:199              'tt' ( temp highp 3-component vector of float)
+0:199              Constant:
+0:199                1 (const int)
+0:200        add second child into first child ( temp highp float)
+0:200          direct index ( temp highp float)
+0:200            direct index ( temp highp 4-component vector of float)
+0:200              'm' ( temp highp 4X4 matrix of float)
+0:200              Constant:
+0:200                3 (const int)
+0:200            Constant:
+0:200              3 (const int)
+0:200          component-wise multiply ( temp highp float)
+0:200            direct index ( temp highp float)
+0:200              direct index ( temp highp 4-component vector of float)
+0:200                'm' ( temp highp 4X4 matrix of float)
+0:200                Constant:
+0:200                  1 (const int)
+0:200              Constant:
+0:200                3 (const int)
+0:200            direct index ( temp highp float)
+0:200              'tt' ( temp highp 3-component vector of float)
+0:200              Constant:
+0:200                1 (const int)
+0:201        add second child into first child ( temp highp float)
+0:201          direct index ( temp highp float)
+0:201            direct index ( temp highp 4-component vector of float)
+0:201              'm' ( temp highp 4X4 matrix of float)
+0:201              Constant:
+0:201                3 (const int)
+0:201            Constant:
+0:201              0 (const int)
+0:201          component-wise multiply ( temp highp float)
+0:201            direct index ( temp highp float)
+0:201              direct index ( temp highp 4-component vector of float)
+0:201                'm' ( temp highp 4X4 matrix of float)
+0:201                Constant:
+0:201                  2 (const int)
+0:201              Constant:
+0:201                0 (const int)
+0:201            direct index ( temp highp float)
+0:201              'tt' ( temp highp 3-component vector of float)
+0:201              Constant:
+0:201                2 (const int)
+0:202        add second child into first child ( temp highp float)
+0:202          direct index ( temp highp float)
+0:202            direct index ( temp highp 4-component vector of float)
+0:202              'm' ( temp highp 4X4 matrix of float)
+0:202              Constant:
+0:202                3 (const int)
+0:202            Constant:
+0:202              1 (const int)
+0:202          component-wise multiply ( temp highp float)
+0:202            direct index ( temp highp float)
+0:202              direct index ( temp highp 4-component vector of float)
+0:202                'm' ( temp highp 4X4 matrix of float)
+0:202                Constant:
+0:202                  2 (const int)
+0:202              Constant:
+0:202                1 (const int)
+0:202            direct index ( temp highp float)
+0:202              'tt' ( temp highp 3-component vector of float)
+0:202              Constant:
+0:202                2 (const int)
+0:203        add second child into first child ( temp highp float)
+0:203          direct index ( temp highp float)
+0:203            direct index ( temp highp 4-component vector of float)
+0:203              'm' ( temp highp 4X4 matrix of float)
+0:203              Constant:
+0:203                3 (const int)
+0:203            Constant:
+0:203              2 (const int)
+0:203          component-wise multiply ( temp highp float)
+0:203            direct index ( temp highp float)
+0:203              direct index ( temp highp 4-component vector of float)
+0:203                'm' ( temp highp 4X4 matrix of float)
+0:203                Constant:
+0:203                  2 (const int)
+0:203              Constant:
+0:203                2 (const int)
+0:203            direct index ( temp highp float)
+0:203              'tt' ( temp highp 3-component vector of float)
+0:203              Constant:
+0:203                2 (const int)
+0:204        add second child into first child ( temp highp float)
+0:204          direct index ( temp highp float)
+0:204            direct index ( temp highp 4-component vector of float)
+0:204              'm' ( temp highp 4X4 matrix of float)
+0:204              Constant:
+0:204                3 (const int)
+0:204            Constant:
+0:204              3 (const int)
+0:204          component-wise multiply ( temp highp float)
+0:204            direct index ( temp highp float)
+0:204              direct index ( temp highp 4-component vector of float)
+0:204                'm' ( temp highp 4X4 matrix of float)
+0:204                Constant:
+0:204                  2 (const int)
+0:204              Constant:
+0:204                3 (const int)
+0:204            direct index ( temp highp float)
+0:204              'tt' ( temp highp 3-component vector of float)
+0:204              Constant:
+0:204                2 (const int)
+0:206      Branch: Return with expression
+0:206        'm' ( temp highp 4X4 matrix of float)
+0:208  Function Definition: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:208    Function Parameters: 
+0:208      'id' ( in highp int)
+0:209    Sequence
+0:209      Sequence
+0:209        move second child to first child ( temp highp 3X3 matrix of float)
+0:209          'm' ( temp highp 3X3 matrix of float)
+0:209          Constant:
+0:209            1.000000
+0:209            0.000000
+0:209            0.000000
+0:209            0.000000
+0:209            1.000000
+0:209            0.000000
+0:209            0.000000
+0:209            0.000000
+0:209            1.000000
+0:210      Branch: Return with expression
+0:210        'm' ( temp highp 3X3 matrix of float)
+0:212  Function Definition: TDInstanceMat3ForNorm(i1; ( global highp 3X3 matrix of float)
+0:212    Function Parameters: 
+0:212      'id' ( in highp int)
+0:213    Sequence
+0:213      Sequence
+0:213        move second child to first child ( temp highp 3X3 matrix of float)
+0:213          'm' ( temp highp 3X3 matrix of float)
+0:213          Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:213            'id' ( in highp int)
+0:214      Branch: Return with expression
+0:214        'm' ( temp highp 3X3 matrix of float)
+0:216  Function Definition: TDInstanceColor(i1;vf4; ( global highp 4-component vector of float)
+0:216    Function Parameters: 
+0:216      'index' ( in highp int)
+0:216      'curColor' ( in highp 4-component vector of float)
+0:217    Sequence
+0:217      subtract second child into first child ( temp highp int)
+0:217        'index' ( in highp int)
+0:217        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:217          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:217          Constant:
+0:217            0 (const uint)
+0:219      Sequence
+0:219        move second child to first child ( temp highp int)
+0:219          'coord' ( temp highp int)
+0:219          'index' ( in highp int)
+0:220      Sequence
+0:220        move second child to first child ( temp highp 4-component vector of float)
+0:220          'samp' ( temp highp 4-component vector of float)
+0:220          textureFetch ( global highp 4-component vector of float)
+0:220            'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+0:220            'coord' ( temp highp int)
+0:221      move second child to first child ( temp highp float)
+0:221        direct index ( temp highp float)
+0:221          'v' ( temp highp 4-component vector of float)
+0:221          Constant:
+0:221            0 (const int)
+0:221        direct index ( temp highp float)
+0:221          'samp' ( temp highp 4-component vector of float)
+0:221          Constant:
+0:221            0 (const int)
+0:222      move second child to first child ( temp highp float)
+0:222        direct index ( temp highp float)
+0:222          'v' ( temp highp 4-component vector of float)
+0:222          Constant:
+0:222            1 (const int)
+0:222        direct index ( temp highp float)
+0:222          'samp' ( temp highp 4-component vector of float)
+0:222          Constant:
+0:222            1 (const int)
+0:223      move second child to first child ( temp highp float)
+0:223        direct index ( temp highp float)
+0:223          'v' ( temp highp 4-component vector of float)
+0:223          Constant:
+0:223            2 (const int)
+0:223        direct index ( temp highp float)
+0:223          'samp' ( temp highp 4-component vector of float)
+0:223          Constant:
+0:223            2 (const int)
+0:224      move second child to first child ( temp highp float)
+0:224        direct index ( temp highp float)
+0:224          'v' ( temp highp 4-component vector of float)
+0:224          Constant:
+0:224            3 (const int)
+0:224        Constant:
+0:224          1.000000
+0:225      move second child to first child ( temp highp float)
+0:225        direct index ( temp highp float)
+0:225          'curColor' ( in highp 4-component vector of float)
+0:225          Constant:
+0:225            0 (const int)
+0:225        direct index ( temp highp float)
+0:225          'v' ( temp highp 4-component vector of float)
+0:225          Constant:
+0:225            0 (const int)
+0:227      move second child to first child ( temp highp float)
+0:227        direct index ( temp highp float)
+0:227          'curColor' ( in highp 4-component vector of float)
+0:227          Constant:
+0:227            1 (const int)
+0:227        direct index ( temp highp float)
+0:227          'v' ( temp highp 4-component vector of float)
+0:227          Constant:
+0:227            1 (const int)
+0:229      move second child to first child ( temp highp float)
+0:229        direct index ( temp highp float)
+0:229          'curColor' ( in highp 4-component vector of float)
+0:229          Constant:
+0:229            2 (const int)
+0:229        direct index ( temp highp float)
+0:229          'v' ( temp highp 4-component vector of float)
+0:229          Constant:
+0:229            2 (const int)
+0:231      Branch: Return with expression
+0:231        'curColor' ( in highp 4-component vector of float)
+0:233  Function Definition: TDInstanceDeform(i1;vf4; ( global highp 4-component vector of float)
+0:233    Function Parameters: 
+0:233      'id' ( in highp int)
+0:233      'pos' ( in highp 4-component vector of float)
+0:234    Sequence
+0:234      move second child to first child ( temp highp 4-component vector of float)
+0:234        'pos' ( in highp 4-component vector of float)
+0:234        matrix-times-vector ( temp highp 4-component vector of float)
+0:234          Function Call: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:234            'id' ( in highp int)
+0:234          'pos' ( in highp 4-component vector of float)
+0:235      Branch: Return with expression
+0:235        matrix-times-vector ( temp highp 4-component vector of float)
+0:235          world: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:235            indirect index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:235              uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:235                'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:235                Constant:
+0:235                  0 (const uint)
+0:235              Function Call: TDCameraIndex( ( global highp int)
+0:235            Constant:
+0:235              0 (const int)
+0:235          'pos' ( in highp 4-component vector of float)
+0:238  Function Definition: TDInstanceDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:238    Function Parameters: 
+0:238      'id' ( in highp int)
+0:238      'vec' ( in highp 3-component vector of float)
+0:240    Sequence
+0:240      Sequence
+0:240        move second child to first child ( temp highp 3X3 matrix of float)
+0:240          'm' ( temp highp 3X3 matrix of float)
+0:240          Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:240            'id' ( in highp int)
+0:241      Branch: Return with expression
+0:241        matrix-times-vector ( temp highp 3-component vector of float)
+0:241          Construct mat3 ( temp highp 3X3 matrix of float)
+0:241            world: direct index for structure (layout( column_major std140) global highp 4X4 matrix of float)
+0:241              indirect index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:241                uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:241                  'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:241                  Constant:
+0:241                    0 (const uint)
+0:241                Function Call: TDCameraIndex( ( global highp int)
+0:241              Constant:
+0:241                0 (const int)
+0:241          matrix-times-vector ( temp highp 3-component vector of float)
+0:241            'm' ( temp highp 3X3 matrix of float)
+0:241            'vec' ( in highp 3-component vector of float)
+0:243  Function Definition: TDInstanceDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:243    Function Parameters: 
+0:243      'id' ( in highp int)
+0:243      'vec' ( in highp 3-component vector of float)
+0:245    Sequence
+0:245      Sequence
+0:245        move second child to first child ( temp highp 3X3 matrix of float)
+0:245          'm' ( temp highp 3X3 matrix of float)
+0:245          Function Call: TDInstanceMat3ForNorm(i1; ( global highp 3X3 matrix of float)
+0:245            'id' ( in highp int)
+0:246      Branch: Return with expression
+0:246        matrix-times-vector ( temp highp 3-component vector of float)
+0:246          Construct mat3 ( temp highp 3X3 matrix of float)
+0:246            worldForNormals: direct index for structure (layout( column_major std140) global highp 3X3 matrix of float)
+0:246              indirect index (layout( column_major std140 offset=0) temp structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:246                uTDMats: direct index for structure (layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals})
+0:246                  'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:246                  Constant:
+0:246                    0 (const uint)
+0:246                Function Call: TDCameraIndex( ( global highp int)
+0:246              Constant:
+0:246                13 (const int)
+0:246          matrix-times-vector ( temp highp 3-component vector of float)
+0:246            'm' ( temp highp 3X3 matrix of float)
+0:246            'vec' ( in highp 3-component vector of float)
+0:248  Function Definition: TDInstanceDeform(vf4; ( global highp 4-component vector of float)
+0:248    Function Parameters: 
+0:248      'pos' ( in highp 4-component vector of float)
+0:249    Sequence
+0:249      Branch: Return with expression
+0:249        Function Call: TDInstanceDeform(i1;vf4; ( global highp 4-component vector of float)
+0:249          Function Call: TDInstanceID( ( global highp int)
+0:249          'pos' ( in highp 4-component vector of float)
+0:251  Function Definition: TDInstanceDeformVec(vf3; ( global highp 3-component vector of float)
+0:251    Function Parameters: 
+0:251      'vec' ( in highp 3-component vector of float)
+0:252    Sequence
+0:252      Branch: Return with expression
+0:252        Function Call: TDInstanceDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:252          Function Call: TDInstanceID( ( global highp int)
+0:252          'vec' ( in highp 3-component vector of float)
+0:254  Function Definition: TDInstanceDeformNorm(vf3; ( global highp 3-component vector of float)
+0:254    Function Parameters: 
+0:254      'vec' ( in highp 3-component vector of float)
+0:255    Sequence
+0:255      Branch: Return with expression
+0:255        Function Call: TDInstanceDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:255          Function Call: TDInstanceID( ( global highp int)
+0:255          'vec' ( in highp 3-component vector of float)
+0:257  Function Definition: TDInstanceActive( ( global bool)
+0:257    Function Parameters: 
+0:257    Sequence
+0:257      Branch: Return with expression
+0:257        Function Call: TDInstanceActive(i1; ( global bool)
+0:257          Function Call: TDInstanceID( ( global highp int)
+0:258  Function Definition: TDInstanceTranslate( ( global highp 3-component vector of float)
+0:258    Function Parameters: 
+0:258    Sequence
+0:258      Branch: Return with expression
+0:258        Function Call: TDInstanceTranslate(i1; ( global highp 3-component vector of float)
+0:258          Function Call: TDInstanceID( ( global highp int)
+0:259  Function Definition: TDInstanceRotateMat( ( global highp 3X3 matrix of float)
+0:259    Function Parameters: 
+0:259    Sequence
+0:259      Branch: Return with expression
+0:259        Function Call: TDInstanceRotateMat(i1; ( global highp 3X3 matrix of float)
+0:259          Function Call: TDInstanceID( ( global highp int)
+0:260  Function Definition: TDInstanceScale( ( global highp 3-component vector of float)
+0:260    Function Parameters: 
+0:260    Sequence
+0:260      Branch: Return with expression
+0:260        Function Call: TDInstanceScale(i1; ( global highp 3-component vector of float)
+0:260          Function Call: TDInstanceID( ( global highp int)
+0:261  Function Definition: TDInstanceMat( ( global highp 4X4 matrix of float)
+0:261    Function Parameters: 
+0:261    Sequence
+0:261      Branch: Return with expression
+0:261        Function Call: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:261          Function Call: TDInstanceID( ( global highp int)
+0:263  Function Definition: TDInstanceMat3( ( global highp 3X3 matrix of float)
+0:263    Function Parameters: 
+0:263    Sequence
+0:263      Branch: Return with expression
+0:263        Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:263          Function Call: TDInstanceID( ( global highp int)
+0:265  Function Definition: TDInstanceTexCoord(vf3; ( global highp 3-component vector of float)
+0:265    Function Parameters: 
+0:265      't' ( in highp 3-component vector of float)
+0:266    Sequence
+0:266      Branch: Return with expression
+0:266        Function Call: TDInstanceTexCoord(i1;vf3; ( global highp 3-component vector of float)
+0:266          Function Call: TDInstanceID( ( global highp int)
+0:266          't' ( in highp 3-component vector of float)
+0:268  Function Definition: TDInstanceColor(vf4; ( global highp 4-component vector of float)
+0:268    Function Parameters: 
+0:268      'curColor' ( in highp 4-component vector of float)
+0:269    Sequence
+0:269      Branch: Return with expression
+0:269        Function Call: TDInstanceColor(i1;vf4; ( global highp 4-component vector of float)
+0:269          Function Call: TDInstanceID( ( global highp int)
+0:269          'curColor' ( in highp 4-component vector of float)
+0:271  Function Definition: TDSkinnedDeform(vf4; ( global highp 4-component vector of float)
+0:271    Function Parameters: 
+0:271      'pos' ( in highp 4-component vector of float)
+0:271    Sequence
+0:271      Branch: Return with expression
+0:271        'pos' ( in highp 4-component vector of float)
+0:273  Function Definition: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:273    Function Parameters: 
+0:273      'vec' ( in highp 3-component vector of float)
+0:273    Sequence
+0:273      Branch: Return with expression
+0:273        'vec' ( in highp 3-component vector of float)
+0:275  Function Definition: TDFastDeformTangent(vf3;vf4;vf3; ( global highp 3-component vector of float)
+0:275    Function Parameters: 
+0:275      'oldNorm' ( in highp 3-component vector of float)
+0:275      'oldTangent' ( in highp 4-component vector of float)
+0:275      'deformedNorm' ( in highp 3-component vector of float)
+0:276    Sequence
+0:276      Branch: Return with expression
+0:276        vector swizzle ( temp highp 3-component vector of float)
+0:276          'oldTangent' ( in highp 4-component vector of float)
+0:276          Sequence
+0:276            Constant:
+0:276              0 (const int)
+0:276            Constant:
+0:276              1 (const int)
+0:276            Constant:
+0:276              2 (const int)
+0:277  Function Definition: TDBoneMat(i1; ( global highp 4X4 matrix of float)
+0:277    Function Parameters: 
+0:277      'index' ( in highp int)
+0:278    Sequence
+0:278      Branch: Return with expression
+0:278        Constant:
+0:278          1.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          1.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          1.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          0.000000
+0:278          1.000000
+0:280  Function Definition: TDDeform(vf4; ( global highp 4-component vector of float)
+0:280    Function Parameters: 
+0:280      'pos' ( in highp 4-component vector of float)
+0:281    Sequence
+0:281      move second child to first child ( temp highp 4-component vector of float)
+0:281        'pos' ( in highp 4-component vector of float)
+0:281        Function Call: TDSkinnedDeform(vf4; ( global highp 4-component vector of float)
+0:281          'pos' ( in highp 4-component vector of float)
+0:282      move second child to first child ( temp highp 4-component vector of float)
+0:282        'pos' ( in highp 4-component vector of float)
+0:282        Function Call: TDInstanceDeform(vf4; ( global highp 4-component vector of float)
+0:282          'pos' ( in highp 4-component vector of float)
+0:283      Branch: Return with expression
+0:283        'pos' ( in highp 4-component vector of float)
+0:286  Function Definition: TDDeform(i1;vf3; ( global highp 4-component vector of float)
+0:286    Function Parameters: 
+0:286      'instanceID' ( in highp int)
+0:286      'p' ( in highp 3-component vector of float)
+0:287    Sequence
+0:287      Sequence
+0:287        move second child to first child ( temp highp 4-component vector of float)
+0:287          'pos' ( temp highp 4-component vector of float)
+0:287          Construct vec4 ( temp highp 4-component vector of float)
+0:287            'p' ( in highp 3-component vector of float)
+0:287            Constant:
+0:287              1.000000
+0:288      move second child to first child ( temp highp 4-component vector of float)
+0:288        'pos' ( temp highp 4-component vector of float)
+0:288        Function Call: TDSkinnedDeform(vf4; ( global highp 4-component vector of float)
+0:288          'pos' ( temp highp 4-component vector of float)
+0:289      move second child to first child ( temp highp 4-component vector of float)
+0:289        'pos' ( temp highp 4-component vector of float)
+0:289        Function Call: TDInstanceDeform(i1;vf4; ( global highp 4-component vector of float)
+0:289          'instanceID' ( in highp int)
+0:289          'pos' ( temp highp 4-component vector of float)
+0:290      Branch: Return with expression
+0:290        'pos' ( temp highp 4-component vector of float)
+0:293  Function Definition: TDDeform(vf3; ( global highp 4-component vector of float)
+0:293    Function Parameters: 
+0:293      'pos' ( in highp 3-component vector of float)
+0:294    Sequence
+0:294      Branch: Return with expression
+0:294        Function Call: TDDeform(i1;vf3; ( global highp 4-component vector of float)
+0:294          Function Call: TDInstanceID( ( global highp int)
+0:294          'pos' ( in highp 3-component vector of float)
+0:297  Function Definition: TDDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:297    Function Parameters: 
+0:297      'instanceID' ( in highp int)
+0:297      'vec' ( in highp 3-component vector of float)
+0:298    Sequence
+0:298      move second child to first child ( temp highp 3-component vector of float)
+0:298        'vec' ( in highp 3-component vector of float)
+0:298        Function Call: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:298          'vec' ( in highp 3-component vector of float)
+0:299      move second child to first child ( temp highp 3-component vector of float)
+0:299        'vec' ( in highp 3-component vector of float)
+0:299        Function Call: TDInstanceDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:299          'instanceID' ( in highp int)
+0:299          'vec' ( in highp 3-component vector of float)
+0:300      Branch: Return with expression
+0:300        'vec' ( in highp 3-component vector of float)
+0:303  Function Definition: TDDeformVec(vf3; ( global highp 3-component vector of float)
+0:303    Function Parameters: 
+0:303      'vec' ( in highp 3-component vector of float)
+0:304    Sequence
+0:304      Branch: Return with expression
+0:304        Function Call: TDDeformVec(i1;vf3; ( global highp 3-component vector of float)
+0:304          Function Call: TDInstanceID( ( global highp int)
+0:304          'vec' ( in highp 3-component vector of float)
+0:307  Function Definition: TDDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:307    Function Parameters: 
+0:307      'instanceID' ( in highp int)
+0:307      'vec' ( in highp 3-component vector of float)
+0:308    Sequence
+0:308      move second child to first child ( temp highp 3-component vector of float)
+0:308        'vec' ( in highp 3-component vector of float)
+0:308        Function Call: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:308          'vec' ( in highp 3-component vector of float)
+0:309      move second child to first child ( temp highp 3-component vector of float)
+0:309        'vec' ( in highp 3-component vector of float)
+0:309        Function Call: TDInstanceDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:309          'instanceID' ( in highp int)
+0:309          'vec' ( in highp 3-component vector of float)
+0:310      Branch: Return with expression
+0:310        'vec' ( in highp 3-component vector of float)
+0:313  Function Definition: TDDeformNorm(vf3; ( global highp 3-component vector of float)
+0:313    Function Parameters: 
+0:313      'vec' ( in highp 3-component vector of float)
+0:314    Sequence
+0:314      Branch: Return with expression
+0:314        Function Call: TDDeformNorm(i1;vf3; ( global highp 3-component vector of float)
+0:314          Function Call: TDInstanceID( ( global highp int)
+0:314          'vec' ( in highp 3-component vector of float)
+0:317  Function Definition: TDSkinnedDeformNorm(vf3; ( global highp 3-component vector of float)
+0:317    Function Parameters: 
+0:317      'vec' ( in highp 3-component vector of float)
+0:318    Sequence
+0:318      move second child to first child ( temp highp 3-component vector of float)
+0:318        'vec' ( in highp 3-component vector of float)
+0:318        Function Call: TDSkinnedDeformVec(vf3; ( global highp 3-component vector of float)
+0:318          'vec' ( in highp 3-component vector of float)
+0:319      Branch: Return with expression
+0:319        'vec' ( in highp 3-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'P' (layout( location=0) in highp 3-component vector of float)
+0:?     'N' (layout( location=1) in highp 3-component vector of float)
+0:?     'Cd' (layout( location=2) in highp 4-component vector of float)
+0:?     'uv' (layout( location=3) in 8-element array of highp 3-component vector of float)
+0:?     'oVert' ( out block{ out highp 4-component vector of float color,  out highp 3-component vector of float worldSpacePos,  out highp 3-component vector of float texCoord0,  flat out highp int cameraIndex,  flat out highp int instance})
+0:?     'anon@4' ( out block{ 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,  out 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_VertexIndex' ( in int VertexIndex)
+0:?     'gl_InstanceIndex' ( in int InstanceIndex)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float position,  global highp 3-component vector of float direction,  global highp 3-component vector of float diffuse,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float lightSize,  global highp 4-component vector of float misc,  global highp 4-component vector of float coneLookupScaleBias,  global highp 4-component vector of float attenScaleBiasRoll, layout( column_major std140) global highp 4X4 matrix of float shadowMapMatrix, layout( column_major std140) global highp 4X4 matrix of float shadowMapCamMatrix,  global highp 4-component vector of float shadowMapRes, layout( column_major std140) global highp 4X4 matrix of float projMapMatrix} uTDLights})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 3-component vector of float color, layout( column_major std140) global highp 3X3 matrix of float rotate} uTDEnvLights})
+0:?     'uTDEnvLightBuffers' (layout( column_major std430) restrict readonly buffer 1-element array of block{layout( column_major std430 offset=0) restrict readonly buffer 9-element array of highp 3-component vector of float shCoeffs})
+0:?     'mTD2DImageOutputs' (layout( rgba8) uniform 1-element array of highp image2D)
+0:?     'mTD2DArrayImageOutputs' (layout( rgba8) uniform 1-element array of highp image2DArray)
+0:?     'mTD3DImageOutputs' (layout( rgba8) uniform 1-element array of highp image3D)
+0:?     'mTDCubeImageOutputs' (layout( rgba8) uniform 1-element array of highp imageCube)
+0:?     'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:?     'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:?     'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:95  Function Definition: main( ( global void)
+0:95    Function Parameters: 
+0:99    Sequence
+0:99      Function Call: TDCheckDiscard( ( global void)
+0:101      Sequence
+0:101        move second child to first child ( temp highp 4-component vector of float)
+0:101          'outcol' ( temp highp 4-component vector of float)
+0:101          Constant:
+0:101            0.000000
+0:101            0.000000
+0:101            0.000000
+0:101            0.000000
+0:103      Sequence
+0:103        move second child to first child ( temp highp 3-component vector of float)
+0:103          'texCoord0' ( temp highp 3-component vector of float)
+0:103          vector swizzle ( temp highp 3-component vector of float)
+0:103            texCoord0: direct index for structure ( in highp 3-component vector of float)
+0:103              'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:103              Constant:
+0:103                2 (const int)
+0:103            Sequence
+0:103              Constant:
+0:103                0 (const int)
+0:103              Constant:
+0:103                1 (const int)
+0:103              Constant:
+0:103                2 (const int)
+0:104      Sequence
+0:104        move second child to first child ( temp highp float)
+0:104          'actualTexZ' ( temp highp float)
+0:104          mod ( global highp float)
+0:104            Convert int to float ( temp highp float)
+0:104              Convert float to int ( temp highp int)
+0:104                direct index ( temp highp float)
+0:104                  'texCoord0' ( temp highp 3-component vector of float)
+0:104                  Constant:
+0:104                    2 (const int)
+0:104            Constant:
+0:104              2048.000000
+0:105      Sequence
+0:105        move second child to first child ( temp highp float)
+0:105          'instanceLoop' ( temp highp float)
+0:105          Floor ( global highp float)
+0:105            Convert int to float ( temp highp float)
+0:105              divide ( temp highp int)
+0:105                Convert float to int ( temp highp int)
+0:105                  direct index ( temp highp float)
+0:105                    'texCoord0' ( temp highp 3-component vector of float)
+0:105                    Constant:
+0:105                      2 (const int)
+0:105                Constant:
+0:105                  2048 (const int)
+0:106      move second child to first child ( temp highp float)
+0:106        direct index ( temp highp float)
+0:106          'texCoord0' ( temp highp 3-component vector of float)
+0:106          Constant:
+0:106            2 (const int)
+0:106        'actualTexZ' ( temp highp float)
+0:107      Sequence
+0:107        move second child to first child ( temp highp 4-component vector of float)
+0:107          'colorMapColor' ( temp highp 4-component vector of float)
+0:107          texture ( global highp 4-component vector of float)
+0:107            'sColorMap' ( uniform highp sampler2DArray)
+0:107            vector swizzle ( temp highp 3-component vector of float)
+0:107              'texCoord0' ( temp highp 3-component vector of float)
+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      Sequence
+0:109        move second child to first child ( temp highp float)
+0:109          'red' ( temp highp float)
+0:109          indirect index ( temp highp float)
+0:109            'colorMapColor' ( temp highp 4-component vector of float)
+0:109            Convert float to int ( temp highp int)
+0:109              'instanceLoop' ( temp highp float)
+0:110      move second child to first child ( temp highp 4-component vector of float)
+0:110        'colorMapColor' ( temp highp 4-component vector of float)
+0:110        Construct vec4 ( temp highp 4-component vector of float)
+0:110          'red' ( temp highp float)
+0:112      add second child into first child ( temp highp 3-component vector of float)
+0:112        vector swizzle ( temp highp 3-component vector of float)
+0:112          'outcol' ( temp highp 4-component vector of float)
+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        component-wise multiply ( temp highp 3-component vector of float)
+0:112          uConstant: direct index for structure ( uniform highp 3-component vector of float)
+0:112            'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:112            Constant:
+0:112              3 (const uint)
+0:112          vector swizzle ( temp highp 3-component vector of float)
+0:112            color: direct index for structure ( in highp 4-component vector of float)
+0:112              'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:112              Constant:
+0:112                0 (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      multiply second child into first child ( temp highp 4-component vector of float)
+0:114        'outcol' ( temp highp 4-component vector of float)
+0:114        'colorMapColor' ( temp highp 4-component vector of float)
+0:117      Sequence
+0:117        move second child to first child ( temp highp float)
+0:117          'alpha' ( temp highp float)
+0:117          component-wise multiply ( temp highp float)
+0:117            direct index ( temp highp float)
+0:117              color: direct index for structure ( in highp 4-component vector of float)
+0:117                'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:117                Constant:
+0:117                  0 (const int)
+0:117              Constant:
+0:117                3 (const int)
+0:117            direct index ( temp highp float)
+0:117              'colorMapColor' ( temp highp 4-component vector of float)
+0:117              Constant:
+0:117                3 (const int)
+0:120      move second child to first child ( temp highp 4-component vector of float)
+0:120        'outcol' ( temp highp 4-component vector of float)
+0:120        Function Call: TDDither(vf4; ( global highp 4-component vector of float)
+0:120          'outcol' ( temp highp 4-component vector of float)
+0:122      vector scale second child into first child ( temp highp 3-component vector of float)
+0:122        vector swizzle ( temp highp 3-component vector of float)
+0:122          'outcol' ( temp highp 4-component vector of float)
+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        'alpha' ( temp highp float)
+0:126      Function Call: TDAlphaTest(f1; ( global void)
+0:126        'alpha' ( temp highp float)
+0:128      move second child to first child ( temp highp float)
+0:128        direct index ( temp highp float)
+0:128          'outcol' ( temp highp 4-component vector of float)
+0:128          Constant:
+0:128            3 (const int)
+0:128        'alpha' ( temp highp float)
+0:129      move second child to first child ( temp highp 4-component vector of float)
+0:129        direct index (layout( location=0) temp highp 4-component vector of float)
+0:129          'oFragColor' (layout( location=0) out 1-element array of highp 4-component vector of float)
+0:129          Constant:
+0:129            0 (const int)
+0:129        Function Call: TDOutputSwizzle(vf4; ( global highp 4-component vector of float)
+0:129          'outcol' ( temp highp 4-component vector of float)
+0:135      Sequence
+0:135        Sequence
+0:135          move second child to first child ( temp highp int)
+0:135            'i' ( temp highp int)
+0:135            Constant:
+0:135              1 (const int)
+0:135        Loop with condition tested first
+0:135          Loop Condition
+0:135          Compare Less Than ( temp bool)
+0:135            'i' ( temp highp int)
+0:135            Constant:
+0:135              1 (const int)
+0:135          Loop Body
+0:137          Sequence
+0:137            move second child to first child ( temp highp 4-component vector of float)
+0:137              indirect index (layout( location=0) temp highp 4-component vector of float)
+0:137                'oFragColor' (layout( location=0) out 1-element array of highp 4-component vector of float)
+0:137                'i' ( temp highp int)
+0:137              Constant:
+0:137                0.000000
+0:137                0.000000
+0:137                0.000000
+0:137                0.000000
+0:135          Loop Terminal Expression
+0:135          Post-Increment ( temp highp int)
+0:135            'i' ( temp highp int)
+0:116  Function Definition: TDColor(vf4; ( global highp 4-component vector of float)
+0:116    Function Parameters: 
+0:116      'color' ( in highp 4-component vector of float)
+0:116    Sequence
+0:116      Branch: Return with expression
+0:116        'color' ( in highp 4-component vector of float)
+0:117  Function Definition: TDCheckOrderIndTrans( ( global void)
+0:117    Function Parameters: 
+0:119  Function Definition: TDCheckDiscard( ( global void)
+0:119    Function Parameters: 
+0:120    Sequence
+0:120      Function Call: TDCheckOrderIndTrans( ( global void)
+0:122  Function Definition: TDDither(vf4; ( global highp 4-component vector of float)
+0:122    Function Parameters: 
+0:122      'color' ( in highp 4-component vector of float)
+0:124    Sequence
+0:124      Sequence
+0:124        move second child to first child ( temp highp float)
+0:124          'd' ( temp highp float)
+0:125          direct index ( temp highp float)
+0:125            texture ( global highp 4-component vector of float)
+0:124              'sTDNoiseMap' ( uniform highp sampler2D)
+0:125              divide ( temp highp 2-component vector of float)
+0:125                vector swizzle ( temp highp 2-component vector of float)
+0:125                  'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:125                  Sequence
+0:125                    Constant:
+0:125                      0 (const int)
+0:125                    Constant:
+0:125                      1 (const int)
+0:125                Constant:
+0:125                  256.000000
+0:125            Constant:
+0:125              0 (const int)
+0:126      subtract second child into first child ( temp highp float)
+0:126        'd' ( temp highp float)
+0:126        Constant:
+0:126          0.500000
+0:127      divide second child into first child ( temp highp float)
+0:127        'd' ( temp highp float)
+0:127        Constant:
+0:127          256.000000
+0:128      Branch: Return with expression
+0:128        Construct vec4 ( temp highp 4-component vector of float)
+0:128          add ( temp highp 3-component vector of float)
+0:128            vector swizzle ( temp highp 3-component vector of float)
+0:128              'color' ( in highp 4-component vector of float)
+0:128              Sequence
+0:128                Constant:
+0:128                  0 (const int)
+0:128                Constant:
+0:128                  1 (const int)
+0:128                Constant:
+0:128                  2 (const int)
+0:128            'd' ( temp highp float)
+0:128          direct index ( temp highp float)
+0:128            'color' ( in highp 4-component vector of float)
+0:128            Constant:
+0:128              3 (const int)
+0:130  Function Definition: TDFrontFacing(vf3;vf3; ( global bool)
+0:130    Function Parameters: 
+0:130      'pos' ( in highp 3-component vector of float)
+0:130      'normal' ( in highp 3-component vector of float)
+0:132    Sequence
+0:132      Branch: Return with expression
+0:132        'gl_FrontFacing' ( gl_FrontFacing bool Face)
+0:134  Function Definition: TDAttenuateLight(i1;f1; ( global highp float)
+0:134    Function Parameters: 
+0:134      'index' ( in highp int)
+0:134      'lightDist' ( in highp float)
+0:136    Sequence
+0:136      Branch: Return with expression
+0:136        Constant:
+0:136          1.000000
+0:138  Function Definition: TDAlphaTest(f1; ( global void)
+0:138    Function Parameters: 
+0:138      'alpha' ( in highp float)
+0:140  Function Definition: TDHardShadow(i1;vf3; ( global highp float)
+0:140    Function Parameters: 
+0:140      'lightIndex' ( in highp int)
+0:140      'worldSpacePos' ( in highp 3-component vector of float)
+0:141    Sequence
+0:141      Branch: Return with expression
+0:141        Constant:
+0:141          0.000000
+0:142  Function Definition: TDSoftShadow(i1;vf3;i1;i1; ( global highp float)
+0:142    Function Parameters: 
+0:142      'lightIndex' ( in highp int)
+0:142      'worldSpacePos' ( in highp 3-component vector of float)
+0:142      'samples' ( in highp int)
+0:142      'steps' ( in highp int)
+0:143    Sequence
+0:143      Branch: Return with expression
+0:143        Constant:
+0:143          0.000000
+0:144  Function Definition: TDSoftShadow(i1;vf3; ( global highp float)
+0:144    Function Parameters: 
+0:144      'lightIndex' ( in highp int)
+0:144      'worldSpacePos' ( in highp 3-component vector of float)
+0:145    Sequence
+0:145      Branch: Return with expression
+0:145        Constant:
+0:145          0.000000
+0:146  Function Definition: TDShadow(i1;vf3; ( global highp float)
+0:146    Function Parameters: 
+0:146      'lightIndex' ( in highp int)
+0:146      'worldSpacePos' ( in highp 3-component vector of float)
+0:147    Sequence
+0:147      Branch: Return with expression
+0:147        Constant:
+0:147          0.000000
+0:152  Function Definition: iTDRadicalInverse_VdC(u1; ( global highp float)
+0:152    Function Parameters: 
+0:152      'bits' ( in highp uint)
+0:154    Sequence
+0:154      move second child to first child ( temp highp uint)
+0:154        'bits' ( in highp uint)
+0:154        inclusive-or ( temp highp uint)
+0:154          left-shift ( temp highp uint)
+0:154            'bits' ( in highp uint)
+0:154            Constant:
+0:154              16 (const uint)
+0:154          right-shift ( temp highp uint)
+0:154            'bits' ( in highp uint)
+0:154            Constant:
+0:154              16 (const uint)
+0:155      move second child to first child ( temp highp uint)
+0:155        'bits' ( in highp uint)
+0:155        inclusive-or ( temp highp uint)
+0:155          left-shift ( temp highp uint)
+0:155            bitwise and ( temp highp uint)
+0:155              'bits' ( in highp uint)
+0:155              Constant:
+0:155                1431655765 (const uint)
+0:155            Constant:
+0:155              1 (const uint)
+0:155          right-shift ( temp highp uint)
+0:155            bitwise and ( temp highp uint)
+0:155              'bits' ( in highp uint)
+0:155              Constant:
+0:155                2863311530 (const uint)
+0:155            Constant:
+0:155              1 (const uint)
+0:156      move second child to first child ( temp highp uint)
+0:156        'bits' ( in highp uint)
+0:156        inclusive-or ( temp highp uint)
+0:156          left-shift ( temp highp uint)
+0:156            bitwise and ( temp highp uint)
+0:156              'bits' ( in highp uint)
+0:156              Constant:
+0:156                858993459 (const uint)
+0:156            Constant:
+0:156              2 (const uint)
+0:156          right-shift ( temp highp uint)
+0:156            bitwise and ( temp highp uint)
+0:156              'bits' ( in highp uint)
+0:156              Constant:
+0:156                3435973836 (const uint)
+0:156            Constant:
+0:156              2 (const uint)
+0:157      move second child to first child ( temp highp uint)
+0:157        'bits' ( in highp uint)
+0:157        inclusive-or ( temp highp uint)
+0:157          left-shift ( temp highp uint)
+0:157            bitwise and ( temp highp uint)
+0:157              'bits' ( in highp uint)
+0:157              Constant:
+0:157                252645135 (const uint)
+0:157            Constant:
+0:157              4 (const uint)
+0:157          right-shift ( temp highp uint)
+0:157            bitwise and ( temp highp uint)
+0:157              'bits' ( in highp uint)
+0:157              Constant:
+0:157                4042322160 (const uint)
+0:157            Constant:
+0:157              4 (const uint)
+0:158      move second child to first child ( temp highp uint)
+0:158        'bits' ( in highp uint)
+0:158        inclusive-or ( temp highp uint)
+0:158          left-shift ( temp highp uint)
+0:158            bitwise and ( temp highp uint)
+0:158              'bits' ( in highp uint)
+0:158              Constant:
+0:158                16711935 (const uint)
+0:158            Constant:
+0:158              8 (const uint)
+0:158          right-shift ( temp highp uint)
+0:158            bitwise and ( temp highp uint)
+0:158              'bits' ( in highp uint)
+0:158              Constant:
+0:158                4278255360 (const uint)
+0:158            Constant:
+0:158              8 (const uint)
+0:159      Branch: Return with expression
+0:159        component-wise multiply ( temp highp float)
+0:159          Convert uint to float ( temp highp float)
+0:159            'bits' ( in highp uint)
+0:159          Constant:
+0:159            2.3283064365387e-10
+0:161  Function Definition: iTDHammersley(u1;u1; ( global highp 2-component vector of float)
+0:161    Function Parameters: 
+0:161      'i' ( in highp uint)
+0:161      'N' ( in highp uint)
+0:163    Sequence
+0:163      Branch: Return with expression
+0:163        Construct vec2 ( temp highp 2-component vector of float)
+0:163          divide ( temp highp float)
+0:163            Convert uint to float ( temp highp float)
+0:163              'i' ( in highp uint)
+0:163            Convert uint to float ( temp highp float)
+0:163              'N' ( in highp uint)
+0:163          Function Call: iTDRadicalInverse_VdC(u1; ( global highp float)
+0:163            'i' ( in highp uint)
+0:165  Function Definition: iTDImportanceSampleGGX(vf2;f1;vf3; ( global highp 3-component vector of float)
+0:165    Function Parameters: 
+0:165      'Xi' ( in highp 2-component vector of float)
+0:165      'roughness2' ( in highp float)
+0:165      'N' ( in highp 3-component vector of float)
+0:167    Sequence
+0:167      Sequence
+0:167        move second child to first child ( temp highp float)
+0:167          'a' ( temp highp float)
+0:167          'roughness2' ( in highp float)
+0:168      Sequence
+0:168        move second child to first child ( temp highp float)
+0:168          'phi' ( temp highp float)
+0:168          component-wise multiply ( temp highp float)
+0:168            Constant:
+0:168              6.283185
+0:168            direct index ( temp highp float)
+0:168              'Xi' ( in highp 2-component vector of float)
+0:168              Constant:
+0:168                0 (const int)
+0:169      Sequence
+0:169        move second child to first child ( temp highp float)
+0:169          'cosTheta' ( temp highp float)
+0:169          sqrt ( global highp float)
+0:169            divide ( temp highp float)
+0:169              subtract ( temp highp float)
+0:169                Constant:
+0:169                  1.000000
+0:169                direct index ( temp highp float)
+0:169                  'Xi' ( in highp 2-component vector of float)
+0:169                  Constant:
+0:169                    1 (const int)
+0:169              add ( temp highp float)
+0:169                Constant:
+0:169                  1.000000
+0:169                component-wise multiply ( temp highp float)
+0:169                  subtract ( temp highp float)
+0:169                    component-wise multiply ( temp highp float)
+0:169                      'a' ( temp highp float)
+0:169                      'a' ( temp highp float)
+0:169                    Constant:
+0:169                      1.000000
+0:169                  direct index ( temp highp float)
+0:169                    'Xi' ( in highp 2-component vector of float)
+0:169                    Constant:
+0:169                      1 (const int)
+0:170      Sequence
+0:170        move second child to first child ( temp highp float)
+0:170          'sinTheta' ( temp highp float)
+0:170          sqrt ( global highp float)
+0:170            subtract ( temp highp float)
+0:170              Constant:
+0:170                1.000000
+0:170              component-wise multiply ( temp highp float)
+0:170                'cosTheta' ( temp highp float)
+0:170                'cosTheta' ( temp highp float)
+0:173      move second child to first child ( temp highp float)
+0:173        direct index ( temp highp float)
+0:173          'H' ( temp highp 3-component vector of float)
+0:173          Constant:
+0:173            0 (const int)
+0:173        component-wise multiply ( temp highp float)
+0:173          'sinTheta' ( temp highp float)
+0:173          cosine ( global highp float)
+0:173            'phi' ( temp highp float)
+0:174      move second child to first child ( temp highp float)
+0:174        direct index ( temp highp float)
+0:174          'H' ( temp highp 3-component vector of float)
+0:174          Constant:
+0:174            1 (const int)
+0:174        component-wise multiply ( temp highp float)
+0:174          'sinTheta' ( temp highp float)
+0:174          sine ( global highp float)
+0:174            'phi' ( temp highp float)
+0:175      move second child to first child ( temp highp float)
+0:175        direct index ( temp highp float)
+0:175          'H' ( temp highp 3-component vector of float)
+0:175          Constant:
+0:175            2 (const int)
+0:175        'cosTheta' ( temp highp float)
+0:177      Sequence
+0:177        move second child to first child ( temp highp 3-component vector of float)
+0:177          'upVector' ( temp highp 3-component vector of float)
+0:177          Test condition and select ( temp highp 3-component vector of float)
+0:177            Condition
+0:177            Compare Less Than ( temp bool)
+0:177              Absolute value ( global highp float)
+0:177                direct index ( temp highp float)
+0:177                  'N' ( in highp 3-component vector of float)
+0:177                  Constant:
+0:177                    2 (const int)
+0:177              Constant:
+0:177                0.999000
+0:177            true case
+0:177            Constant:
+0:177              0.000000
+0:177              0.000000
+0:177              1.000000
+0:177            false case
+0:177            Constant:
+0:177              1.000000
+0:177              0.000000
+0:177              0.000000
+0:178      Sequence
+0:178        move second child to first child ( temp highp 3-component vector of float)
+0:178          'tangentX' ( temp highp 3-component vector of float)
+0:178          normalize ( global highp 3-component vector of float)
+0:178            cross-product ( global highp 3-component vector of float)
+0:178              'upVector' ( temp highp 3-component vector of float)
+0:178              'N' ( in highp 3-component vector of float)
+0:179      Sequence
+0:179        move second child to first child ( temp highp 3-component vector of float)
+0:179          'tangentY' ( temp highp 3-component vector of float)
+0:179          cross-product ( global highp 3-component vector of float)
+0:179            'N' ( in highp 3-component vector of float)
+0:179            'tangentX' ( temp highp 3-component vector of float)
+0:182      Sequence
+0:182        move second child to first child ( temp highp 3-component vector of float)
+0:182          'worldResult' ( temp highp 3-component vector of float)
+0:182          add ( temp highp 3-component vector of float)
+0:182            add ( temp highp 3-component vector of float)
+0:182              vector-scale ( temp highp 3-component vector of float)
+0:182                'tangentX' ( temp highp 3-component vector of float)
+0:182                direct index ( temp highp float)
+0:182                  'H' ( temp highp 3-component vector of float)
+0:182                  Constant:
+0:182                    0 (const int)
+0:182              vector-scale ( temp highp 3-component vector of float)
+0:182                'tangentY' ( temp highp 3-component vector of float)
+0:182                direct index ( temp highp float)
+0:182                  'H' ( temp highp 3-component vector of float)
+0:182                  Constant:
+0:182                    1 (const int)
+0:182            vector-scale ( temp highp 3-component vector of float)
+0:182              'N' ( in highp 3-component vector of float)
+0:182              direct index ( temp highp float)
+0:182                'H' ( temp highp 3-component vector of float)
+0:182                Constant:
+0:182                  2 (const int)
+0:183      Branch: Return with expression
+0:183        'worldResult' ( temp highp 3-component vector of float)
+0:185  Function Definition: iTDDistributionGGX(vf3;vf3;f1; ( global highp float)
+0:185    Function Parameters: 
+0:185      'normal' ( in highp 3-component vector of float)
+0:185      'half_vector' ( in highp 3-component vector of float)
+0:185      'roughness2' ( in highp float)
+0:?     Sequence
+0:189      Sequence
+0:189        move second child to first child ( temp highp float)
+0:189          'NdotH' ( temp highp float)
+0:189          clamp ( global highp float)
+0:189            dot-product ( global highp float)
+0:189              'normal' ( in highp 3-component vector of float)
+0:189              'half_vector' ( in highp 3-component vector of float)
+0:189            Constant:
+0:189              1.0000000000000e-06
+0:189            Constant:
+0:189              1.000000
+0:191      Sequence
+0:191        move second child to first child ( temp highp float)
+0:191          'alpha2' ( temp highp float)
+0:191          component-wise multiply ( temp highp float)
+0:191            'roughness2' ( in highp float)
+0:191            'roughness2' ( in highp float)
+0:193      Sequence
+0:193        move second child to first child ( temp highp float)
+0:193          'denom' ( temp highp float)
+0:193          add ( temp highp float)
+0:193            component-wise multiply ( temp highp float)
+0:193              component-wise multiply ( temp highp float)
+0:193                'NdotH' ( temp highp float)
+0:193                'NdotH' ( temp highp float)
+0:193              subtract ( temp highp float)
+0:193                'alpha2' ( temp highp float)
+0:193                Constant:
+0:193                  1.000000
+0:193            Constant:
+0:193              1.000000
+0:194      move second child to first child ( temp highp float)
+0:194        'denom' ( temp highp float)
+0:194        max ( global highp float)
+0:194          Constant:
+0:194            1.0000000000000e-08
+0:194          'denom' ( temp highp float)
+0:195      Branch: Return with expression
+0:195        divide ( temp highp float)
+0:195          'alpha2' ( temp highp float)
+0:195          component-wise multiply ( temp highp float)
+0:195            component-wise multiply ( temp highp float)
+0:195              Constant:
+0:195                3.141593
+0:195              'denom' ( temp highp float)
+0:195            'denom' ( temp highp float)
+0:197  Function Definition: iTDCalcF(vf3;f1; ( global highp 3-component vector of float)
+0:197    Function Parameters: 
+0:197      'F0' ( in highp 3-component vector of float)
+0:197      'VdotH' ( in highp float)
+0:198    Sequence
+0:198      Branch: Return with expression
+0:198        add ( temp highp 3-component vector of float)
+0:198          'F0' ( in highp 3-component vector of float)
+0:198          vector-scale ( temp highp 3-component vector of float)
+0:198            subtract ( temp highp 3-component vector of float)
+0:198              Constant:
+0:198                1.000000
+0:198                1.000000
+0:198                1.000000
+0:198              'F0' ( in highp 3-component vector of float)
+0:198            pow ( global highp float)
+0:198              Constant:
+0:198                2.000000
+0:198              component-wise multiply ( temp highp float)
+0:198                subtract ( temp highp float)
+0:198                  component-wise multiply ( temp highp float)
+0:198                    Constant:
+0:198                      -5.554730
+0:198                    'VdotH' ( in highp float)
+0:198                  Constant:
+0:198                    6.983160
+0:198                'VdotH' ( in highp float)
+0:201  Function Definition: iTDCalcG(f1;f1;f1; ( global highp float)
+0:201    Function Parameters: 
+0:201      'NdotL' ( in highp float)
+0:201      'NdotV' ( in highp float)
+0:201      'k' ( in highp float)
+0:202    Sequence
+0:202      Sequence
+0:202        move second child to first child ( temp highp float)
+0:202          'Gl' ( temp highp float)
+0:202          divide ( temp highp float)
+0:202            Constant:
+0:202              1.000000
+0:202            add ( temp highp float)
+0:202              component-wise multiply ( temp highp float)
+0:202                'NdotL' ( in highp float)
+0:202                subtract ( temp highp float)
+0:202                  Constant:
+0:202                    1.000000
+0:202                  'k' ( in highp float)
+0:202              'k' ( in highp float)
+0:203      Sequence
+0:203        move second child to first child ( temp highp float)
+0:203          'Gv' ( temp highp float)
+0:203          divide ( temp highp float)
+0:203            Constant:
+0:203              1.000000
+0:203            add ( temp highp float)
+0:203              component-wise multiply ( temp highp float)
+0:203                'NdotV' ( in highp float)
+0:203                subtract ( temp highp float)
+0:203                  Constant:
+0:203                    1.000000
+0:203                  'k' ( in highp float)
+0:203              'k' ( in highp float)
+0:204      Branch: Return with expression
+0:204        component-wise multiply ( temp highp float)
+0:204          'Gl' ( temp highp float)
+0:204          'Gv' ( temp highp float)
+0:207  Function Definition: TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:207    Function Parameters: 
+0:207      'index' ( in highp int)
+0:207      'diffuseColor' ( in highp 3-component vector of float)
+0:207      'specularColor' ( in highp 3-component vector of float)
+0:207      'worldSpacePos' ( in highp 3-component vector of float)
+0:207      'normal' ( in highp 3-component vector of float)
+0:207      'shadowStrength' ( in highp float)
+0:207      'shadowColor' ( in highp 3-component vector of float)
+0:207      'camVector' ( in highp 3-component vector of float)
+0:207      'roughness' ( in highp float)
+0:?     Sequence
+0:210      Branch: Return with expression
+0:210        'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:213  Function Definition: TDLightingPBR(vf3;vf3;f1;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global void)
+0:213    Function Parameters: 
+0:213      'diffuseContrib' ( inout highp 3-component vector of float)
+0:213      'specularContrib' ( inout highp 3-component vector of float)
+0:213      'shadowStrengthOut' ( inout highp float)
+0:213      'index' ( in highp int)
+0:213      'diffuseColor' ( in highp 3-component vector of float)
+0:213      'specularColor' ( in highp 3-component vector of float)
+0:213      'worldSpacePos' ( in highp 3-component vector of float)
+0:213      'normal' ( in highp 3-component vector of float)
+0:213      'shadowStrength' ( in highp float)
+0:213      'shadowColor' ( in highp 3-component vector of float)
+0:213      'camVector' ( in highp 3-component vector of float)
+0:213      'roughness' ( in highp float)
+0:215    Sequence
+0:215      Sequence
+0:215        move second child to first child ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215          Function Call: TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215            'index' ( in highp int)
+0:215            'diffuseColor' ( in highp 3-component vector of float)
+0:215            'specularColor' ( in highp 3-component vector of float)
+0:215            'worldSpacePos' ( in highp 3-component vector of float)
+0:215            'normal' ( in highp 3-component vector of float)
+0:215            'shadowStrength' ( in highp float)
+0:215            'shadowColor' ( in highp 3-component vector of float)
+0:215            'camVector' ( in highp 3-component vector of float)
+0:215            'roughness' ( in highp float)
+0:215      move second child to first child ( temp highp 3-component vector of float)
+0:215        'diffuseContrib' ( inout highp 3-component vector of float)
+0:215        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:215          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:215          Constant:
+0:215            0 (const int)
+0:216      move second child to first child ( temp highp 3-component vector of float)
+0:216        'specularContrib' ( inout highp 3-component vector of float)
+0:216        specular: direct index for structure ( global highp 3-component vector of float)
+0:216          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:216          Constant:
+0:216            1 (const int)
+0:217      move second child to first child ( temp highp float)
+0:217        'shadowStrengthOut' ( inout highp float)
+0:217        shadowStrength: direct index for structure ( global highp float)
+0:217          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:217          Constant:
+0:217            2 (const int)
+0:220  Function Definition: TDLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global void)
+0:220    Function Parameters: 
+0:220      'diffuseContrib' ( inout highp 3-component vector of float)
+0:220      'specularContrib' ( inout highp 3-component vector of float)
+0:220      'index' ( in highp int)
+0:220      'diffuseColor' ( in highp 3-component vector of float)
+0:220      'specularColor' ( in highp 3-component vector of float)
+0:220      'worldSpacePos' ( in highp 3-component vector of float)
+0:220      'normal' ( in highp 3-component vector of float)
+0:220      'shadowStrength' ( in highp float)
+0:220      'shadowColor' ( in highp 3-component vector of float)
+0:220      'camVector' ( in highp 3-component vector of float)
+0:220      'roughness' ( in highp float)
+0:222    Sequence
+0:222      Sequence
+0:222        move second child to first child ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222          Function Call: TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222            'index' ( in highp int)
+0:222            'diffuseColor' ( in highp 3-component vector of float)
+0:222            'specularColor' ( in highp 3-component vector of float)
+0:222            'worldSpacePos' ( in highp 3-component vector of float)
+0:222            'normal' ( in highp 3-component vector of float)
+0:222            'shadowStrength' ( in highp float)
+0:222            'shadowColor' ( in highp 3-component vector of float)
+0:222            'camVector' ( in highp 3-component vector of float)
+0:222            'roughness' ( in highp float)
+0:222      move second child to first child ( temp highp 3-component vector of float)
+0:222        'diffuseContrib' ( inout highp 3-component vector of float)
+0:222        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:222          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:222          Constant:
+0:222            0 (const int)
+0:223      move second child to first child ( temp highp 3-component vector of float)
+0:223        'specularContrib' ( inout highp 3-component vector of float)
+0:223        specular: direct index for structure ( global highp 3-component vector of float)
+0:223          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:223          Constant:
+0:223            1 (const int)
+0:226  Function Definition: TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:226    Function Parameters: 
+0:226      'index' ( in highp int)
+0:226      'diffuseColor' ( in highp 3-component vector of float)
+0:226      'specularColor' ( in highp 3-component vector of float)
+0:226      'normal' ( in highp 3-component vector of float)
+0:226      'camVector' ( in highp 3-component vector of float)
+0:226      'roughness' ( in highp float)
+0:226      'ambientOcclusion' ( in highp float)
+0:?     Sequence
+0:229      Branch: Return with expression
+0:229        'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:232  Function Definition: TDEnvLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;f1; ( global void)
+0:232    Function Parameters: 
+0:232      'diffuseContrib' ( inout highp 3-component vector of float)
+0:232      'specularContrib' ( inout highp 3-component vector of float)
+0:232      'index' ( in highp int)
+0:232      'diffuseColor' ( in highp 3-component vector of float)
+0:232      'specularColor' ( in highp 3-component vector of float)
+0:232      'normal' ( in highp 3-component vector of float)
+0:232      'camVector' ( in highp 3-component vector of float)
+0:232      'roughness' ( in highp float)
+0:232      'ambientOcclusion' ( in highp float)
+0:234    Sequence
+0:234      Sequence
+0:234        move second child to first child ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:234          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:234          Function Call: TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:234            'index' ( in highp int)
+0:234            'diffuseColor' ( in highp 3-component vector of float)
+0:234            'specularColor' ( in highp 3-component vector of float)
+0:234            'normal' ( in highp 3-component vector of float)
+0:234            'camVector' ( in highp 3-component vector of float)
+0:234            'roughness' ( in highp float)
+0:234            'ambientOcclusion' ( in highp float)
+0:235      move second child to first child ( temp highp 3-component vector of float)
+0:235        'diffuseContrib' ( inout highp 3-component vector of float)
+0:235        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:235          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:235          Constant:
+0:235            0 (const int)
+0:236      move second child to first child ( temp highp 3-component vector of float)
+0:236        'specularContrib' ( inout highp 3-component vector of float)
+0:236        specular: direct index for structure ( global highp 3-component vector of float)
+0:236          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp float shadowStrength})
+0:236          Constant:
+0:236            1 (const int)
+0:239  Function Definition: TDLighting(i1;vf3;vf3;f1;vf3;vf3;f1;f1; ( global structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:239    Function Parameters: 
+0:239      'index' ( in highp int)
+0:239      'worldSpacePos' ( in highp 3-component vector of float)
+0:239      'normal' ( in highp 3-component vector of float)
+0:239      'shadowStrength' ( in highp float)
+0:239      'shadowColor' ( in highp 3-component vector of float)
+0:239      'camVector' ( in highp 3-component vector of float)
+0:239      'shininess' ( in highp float)
+0:239      'shininess2' ( in highp float)
+0:?     Sequence
+0:242      switch
+0:242      condition
+0:242        'index' ( in highp int)
+0:242      body
+0:242        Sequence
+0:244          default: 
+0:?           Sequence
+0:245            move second child to first child ( temp highp 3-component vector of float)
+0:245              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:245                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:245                Constant:
+0:245                  0 (const int)
+0:245              Constant:
+0:245                0.000000
+0:245                0.000000
+0:245                0.000000
+0:246            move second child to first child ( temp highp 3-component vector of float)
+0:246              specular: direct index for structure ( global highp 3-component vector of float)
+0:246                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:246                Constant:
+0:246                  1 (const int)
+0:246              Constant:
+0:246                0.000000
+0:246                0.000000
+0:246                0.000000
+0:247            move second child to first child ( temp highp 3-component vector of float)
+0:247              specular2: direct index for structure ( global highp 3-component vector of float)
+0:247                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:247                Constant:
+0:247                  2 (const int)
+0:247              Constant:
+0:247                0.000000
+0:247                0.000000
+0:247                0.000000
+0:248            move second child to first child ( temp highp float)
+0:248              shadowStrength: direct index for structure ( global highp float)
+0:248                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:248                Constant:
+0:248                  3 (const int)
+0:248              Constant:
+0:248                0.000000
+0:249            Branch: Break
+0:251      Branch: Return with expression
+0:251        'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:254  Function Definition: TDLighting(vf3;vf3;vf3;f1;i1;vf3;vf3;f1;vf3;vf3;f1;f1; ( global void)
+0:254    Function Parameters: 
+0:254      'diffuseContrib' ( inout highp 3-component vector of float)
+0:254      'specularContrib' ( inout highp 3-component vector of float)
+0:254      'specularContrib2' ( inout highp 3-component vector of float)
+0:254      'shadowStrengthOut' ( inout highp float)
+0:254      'index' ( in highp int)
+0:254      'worldSpacePos' ( in highp 3-component vector of float)
+0:254      'normal' ( in highp 3-component vector of float)
+0:254      'shadowStrength' ( in highp float)
+0:254      'shadowColor' ( in highp 3-component vector of float)
+0:254      'camVector' ( in highp 3-component vector of float)
+0:254      'shininess' ( in highp float)
+0:254      'shininess2' ( in highp float)
+0:?     Sequence
+0:257      switch
+0:257      condition
+0:257        'index' ( in highp int)
+0:257      body
+0:257        Sequence
+0:259          default: 
+0:?           Sequence
+0:260            move second child to first child ( temp highp 3-component vector of float)
+0:260              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:260                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:260                Constant:
+0:260                  0 (const int)
+0:260              Constant:
+0:260                0.000000
+0:260                0.000000
+0:260                0.000000
+0:261            move second child to first child ( temp highp 3-component vector of float)
+0:261              specular: direct index for structure ( global highp 3-component vector of float)
+0:261                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:261                Constant:
+0:261                  1 (const int)
+0:261              Constant:
+0:261                0.000000
+0:261                0.000000
+0:261                0.000000
+0:262            move second child to first child ( temp highp 3-component vector of float)
+0:262              specular2: direct index for structure ( global highp 3-component vector of float)
+0:262                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:262                Constant:
+0:262                  2 (const int)
+0:262              Constant:
+0:262                0.000000
+0:262                0.000000
+0:262                0.000000
+0:263            move second child to first child ( temp highp float)
+0:263              shadowStrength: direct index for structure ( global highp float)
+0:263                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:263                Constant:
+0:263                  3 (const int)
+0:263              Constant:
+0:263                0.000000
+0:264            Branch: Break
+0:266      move second child to first child ( temp highp 3-component vector of float)
+0:266        'diffuseContrib' ( inout highp 3-component vector of float)
+0:266        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:266          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:266          Constant:
+0:266            0 (const int)
+0:267      move second child to first child ( temp highp 3-component vector of float)
+0:267        'specularContrib' ( inout highp 3-component vector of float)
+0:267        specular: direct index for structure ( global highp 3-component vector of float)
+0:267          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:267          Constant:
+0:267            1 (const int)
+0:268      move second child to first child ( temp highp 3-component vector of float)
+0:268        'specularContrib2' ( inout highp 3-component vector of float)
+0:268        specular2: direct index for structure ( global highp 3-component vector of float)
+0:268          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:268          Constant:
+0:268            2 (const int)
+0:269      move second child to first child ( temp highp float)
+0:269        'shadowStrengthOut' ( inout highp float)
+0:269        shadowStrength: direct index for structure ( global highp float)
+0:269          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:269          Constant:
+0:269            3 (const int)
+0:272  Function Definition: TDLighting(vf3;vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1;f1; ( global void)
+0:272    Function Parameters: 
+0:272      'diffuseContrib' ( inout highp 3-component vector of float)
+0:272      'specularContrib' ( inout highp 3-component vector of float)
+0:272      'specularContrib2' ( inout highp 3-component vector of float)
+0:272      'index' ( in highp int)
+0:272      'worldSpacePos' ( in highp 3-component vector of float)
+0:272      'normal' ( in highp 3-component vector of float)
+0:272      'shadowStrength' ( in highp float)
+0:272      'shadowColor' ( in highp 3-component vector of float)
+0:272      'camVector' ( in highp 3-component vector of float)
+0:272      'shininess' ( in highp float)
+0:272      'shininess2' ( in highp float)
+0:?     Sequence
+0:275      switch
+0:275      condition
+0:275        'index' ( in highp int)
+0:275      body
+0:275        Sequence
+0:277          default: 
+0:?           Sequence
+0:278            move second child to first child ( temp highp 3-component vector of float)
+0:278              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:278                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:278                Constant:
+0:278                  0 (const int)
+0:278              Constant:
+0:278                0.000000
+0:278                0.000000
+0:278                0.000000
+0:279            move second child to first child ( temp highp 3-component vector of float)
+0:279              specular: direct index for structure ( global highp 3-component vector of float)
+0:279                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:279                Constant:
+0:279                  1 (const int)
+0:279              Constant:
+0:279                0.000000
+0:279                0.000000
+0:279                0.000000
+0:280            move second child to first child ( temp highp 3-component vector of float)
+0:280              specular2: direct index for structure ( global highp 3-component vector of float)
+0:280                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:280                Constant:
+0:280                  2 (const int)
+0:280              Constant:
+0:280                0.000000
+0:280                0.000000
+0:280                0.000000
+0:281            move second child to first child ( temp highp float)
+0:281              shadowStrength: direct index for structure ( global highp float)
+0:281                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:281                Constant:
+0:281                  3 (const int)
+0:281              Constant:
+0:281                0.000000
+0:282            Branch: Break
+0:284      move second child to first child ( temp highp 3-component vector of float)
+0:284        'diffuseContrib' ( inout highp 3-component vector of float)
+0:284        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:284          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:284          Constant:
+0:284            0 (const int)
+0:285      move second child to first child ( temp highp 3-component vector of float)
+0:285        'specularContrib' ( inout highp 3-component vector of float)
+0:285        specular: direct index for structure ( global highp 3-component vector of float)
+0:285          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:285          Constant:
+0:285            1 (const int)
+0:286      move second child to first child ( temp highp 3-component vector of float)
+0:286        'specularContrib2' ( inout highp 3-component vector of float)
+0:286        specular2: direct index for structure ( global highp 3-component vector of float)
+0:286          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:286          Constant:
+0:286            2 (const int)
+0:289  Function Definition: TDLighting(vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1; ( global void)
+0:289    Function Parameters: 
+0:289      'diffuseContrib' ( inout highp 3-component vector of float)
+0:289      'specularContrib' ( inout highp 3-component vector of float)
+0:289      'index' ( in highp int)
+0:289      'worldSpacePos' ( in highp 3-component vector of float)
+0:289      'normal' ( in highp 3-component vector of float)
+0:289      'shadowStrength' ( in highp float)
+0:289      'shadowColor' ( in highp 3-component vector of float)
+0:289      'camVector' ( in highp 3-component vector of float)
+0:289      'shininess' ( in highp float)
+0:?     Sequence
+0:292      switch
+0:292      condition
+0:292        'index' ( in highp int)
+0:292      body
+0:292        Sequence
+0:294          default: 
+0:?           Sequence
+0:295            move second child to first child ( temp highp 3-component vector of float)
+0:295              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:295                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:295                Constant:
+0:295                  0 (const int)
+0:295              Constant:
+0:295                0.000000
+0:295                0.000000
+0:295                0.000000
+0:296            move second child to first child ( temp highp 3-component vector of float)
+0:296              specular: direct index for structure ( global highp 3-component vector of float)
+0:296                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:296                Constant:
+0:296                  1 (const int)
+0:296              Constant:
+0:296                0.000000
+0:296                0.000000
+0:296                0.000000
+0:297            move second child to first child ( temp highp 3-component vector of float)
+0:297              specular2: direct index for structure ( global highp 3-component vector of float)
+0:297                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:297                Constant:
+0:297                  2 (const int)
+0:297              Constant:
+0:297                0.000000
+0:297                0.000000
+0:297                0.000000
+0:298            move second child to first child ( temp highp float)
+0:298              shadowStrength: direct index for structure ( global highp float)
+0:298                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:298                Constant:
+0:298                  3 (const int)
+0:298              Constant:
+0:298                0.000000
+0:299            Branch: Break
+0:301      move second child to first child ( temp highp 3-component vector of float)
+0:301        'diffuseContrib' ( inout highp 3-component vector of float)
+0:301        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:301          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:301          Constant:
+0:301            0 (const int)
+0:302      move second child to first child ( temp highp 3-component vector of float)
+0:302        'specularContrib' ( inout highp 3-component vector of float)
+0:302        specular: direct index for structure ( global highp 3-component vector of float)
+0:302          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:302          Constant:
+0:302            1 (const int)
+0:305  Function Definition: TDLighting(vf3;vf3;vf3;i1;vf3;vf3;vf3;f1;f1; ( global void)
+0:305    Function Parameters: 
+0:305      'diffuseContrib' ( inout highp 3-component vector of float)
+0:305      'specularContrib' ( inout highp 3-component vector of float)
+0:305      'specularContrib2' ( inout highp 3-component vector of float)
+0:305      'index' ( in highp int)
+0:305      'worldSpacePos' ( in highp 3-component vector of float)
+0:305      'normal' ( in highp 3-component vector of float)
+0:305      'camVector' ( in highp 3-component vector of float)
+0:305      'shininess' ( in highp float)
+0:305      'shininess2' ( in highp float)
+0:?     Sequence
+0:308      switch
+0:308      condition
+0:308        'index' ( in highp int)
+0:308      body
+0:308        Sequence
+0:310          default: 
+0:?           Sequence
+0:311            move second child to first child ( temp highp 3-component vector of float)
+0:311              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:311                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:311                Constant:
+0:311                  0 (const int)
+0:311              Constant:
+0:311                0.000000
+0:311                0.000000
+0:311                0.000000
+0:312            move second child to first child ( temp highp 3-component vector of float)
+0:312              specular: direct index for structure ( global highp 3-component vector of float)
+0:312                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:312                Constant:
+0:312                  1 (const int)
+0:312              Constant:
+0:312                0.000000
+0:312                0.000000
+0:312                0.000000
+0:313            move second child to first child ( temp highp 3-component vector of float)
+0:313              specular2: direct index for structure ( global highp 3-component vector of float)
+0:313                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:313                Constant:
+0:313                  2 (const int)
+0:313              Constant:
+0:313                0.000000
+0:313                0.000000
+0:313                0.000000
+0:314            move second child to first child ( temp highp float)
+0:314              shadowStrength: direct index for structure ( global highp float)
+0:314                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:314                Constant:
+0:314                  3 (const int)
+0:314              Constant:
+0:314                0.000000
+0:315            Branch: Break
+0:317      move second child to first child ( temp highp 3-component vector of float)
+0:317        'diffuseContrib' ( inout highp 3-component vector of float)
+0:317        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:317          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:317          Constant:
+0:317            0 (const int)
+0:318      move second child to first child ( temp highp 3-component vector of float)
+0:318        'specularContrib' ( inout highp 3-component vector of float)
+0:318        specular: direct index for structure ( global highp 3-component vector of float)
+0:318          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:318          Constant:
+0:318            1 (const int)
+0:319      move second child to first child ( temp highp 3-component vector of float)
+0:319        'specularContrib2' ( inout highp 3-component vector of float)
+0:319        specular2: direct index for structure ( global highp 3-component vector of float)
+0:319          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:319          Constant:
+0:319            2 (const int)
+0:322  Function Definition: TDLighting(vf3;vf3;i1;vf3;vf3;vf3;f1; ( global void)
+0:322    Function Parameters: 
+0:322      'diffuseContrib' ( inout highp 3-component vector of float)
+0:322      'specularContrib' ( inout highp 3-component vector of float)
+0:322      'index' ( in highp int)
+0:322      'worldSpacePos' ( in highp 3-component vector of float)
+0:322      'normal' ( in highp 3-component vector of float)
+0:322      'camVector' ( in highp 3-component vector of float)
+0:322      'shininess' ( in highp float)
+0:?     Sequence
+0:325      switch
+0:325      condition
+0:325        'index' ( in highp int)
+0:325      body
+0:325        Sequence
+0:327          default: 
+0:?           Sequence
+0:328            move second child to first child ( temp highp 3-component vector of float)
+0:328              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:328                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:328                Constant:
+0:328                  0 (const int)
+0:328              Constant:
+0:328                0.000000
+0:328                0.000000
+0:328                0.000000
+0:329            move second child to first child ( temp highp 3-component vector of float)
+0:329              specular: direct index for structure ( global highp 3-component vector of float)
+0:329                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:329                Constant:
+0:329                  1 (const int)
+0:329              Constant:
+0:329                0.000000
+0:329                0.000000
+0:329                0.000000
+0:330            move second child to first child ( temp highp 3-component vector of float)
+0:330              specular2: direct index for structure ( global highp 3-component vector of float)
+0:330                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:330                Constant:
+0:330                  2 (const int)
+0:330              Constant:
+0:330                0.000000
+0:330                0.000000
+0:330                0.000000
+0:331            move second child to first child ( temp highp float)
+0:331              shadowStrength: direct index for structure ( global highp float)
+0:331                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:331                Constant:
+0:331                  3 (const int)
+0:331              Constant:
+0:331                0.000000
+0:332            Branch: Break
+0:334      move second child to first child ( temp highp 3-component vector of float)
+0:334        'diffuseContrib' ( inout highp 3-component vector of float)
+0:334        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:334          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:334          Constant:
+0:334            0 (const int)
+0:335      move second child to first child ( temp highp 3-component vector of float)
+0:335        'specularContrib' ( inout highp 3-component vector of float)
+0:335        specular: direct index for structure ( global highp 3-component vector of float)
+0:335          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:335          Constant:
+0:335            1 (const int)
+0:338  Function Definition: TDLighting(vf3;i1;vf3;vf3; ( global void)
+0:338    Function Parameters: 
+0:338      'diffuseContrib' ( inout highp 3-component vector of float)
+0:338      'index' ( in highp int)
+0:338      'worldSpacePos' ( in highp 3-component vector of float)
+0:338      'normal' ( in highp 3-component vector of float)
+0:?     Sequence
+0:341      switch
+0:341      condition
+0:341        'index' ( in highp int)
+0:341      body
+0:341        Sequence
+0:343          default: 
+0:?           Sequence
+0:344            move second child to first child ( temp highp 3-component vector of float)
+0:344              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:344                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:344                Constant:
+0:344                  0 (const int)
+0:344              Constant:
+0:344                0.000000
+0:344                0.000000
+0:344                0.000000
+0:345            move second child to first child ( temp highp 3-component vector of float)
+0:345              specular: direct index for structure ( global highp 3-component vector of float)
+0:345                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:345                Constant:
+0:345                  1 (const int)
+0:345              Constant:
+0:345                0.000000
+0:345                0.000000
+0:345                0.000000
+0:346            move second child to first child ( temp highp 3-component vector of float)
+0:346              specular2: direct index for structure ( global highp 3-component vector of float)
+0:346                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:346                Constant:
+0:346                  2 (const int)
+0:346              Constant:
+0:346                0.000000
+0:346                0.000000
+0:346                0.000000
+0:347            move second child to first child ( temp highp float)
+0:347              shadowStrength: direct index for structure ( global highp float)
+0:347                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:347                Constant:
+0:347                  3 (const int)
+0:347              Constant:
+0:347                0.000000
+0:348            Branch: Break
+0:350      move second child to first child ( temp highp 3-component vector of float)
+0:350        'diffuseContrib' ( inout highp 3-component vector of float)
+0:350        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:350          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:350          Constant:
+0:350            0 (const int)
+0:353  Function Definition: TDLighting(vf3;i1;vf3;vf3;f1;vf3; ( global void)
+0:353    Function Parameters: 
+0:353      'diffuseContrib' ( inout highp 3-component vector of float)
+0:353      'index' ( in highp int)
+0:353      'worldSpacePos' ( in highp 3-component vector of float)
+0:353      'normal' ( in highp 3-component vector of float)
+0:353      'shadowStrength' ( in highp float)
+0:353      'shadowColor' ( in highp 3-component vector of float)
+0:?     Sequence
+0:356      switch
+0:356      condition
+0:356        'index' ( in highp int)
+0:356      body
+0:356        Sequence
+0:358          default: 
+0:?           Sequence
+0:359            move second child to first child ( temp highp 3-component vector of float)
+0:359              diffuse: direct index for structure ( global highp 3-component vector of float)
+0:359                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:359                Constant:
+0:359                  0 (const int)
+0:359              Constant:
+0:359                0.000000
+0:359                0.000000
+0:359                0.000000
+0:360            move second child to first child ( temp highp 3-component vector of float)
+0:360              specular: direct index for structure ( global highp 3-component vector of float)
+0:360                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:360                Constant:
+0:360                  1 (const int)
+0:360              Constant:
+0:360                0.000000
+0:360                0.000000
+0:360                0.000000
+0:361            move second child to first child ( temp highp 3-component vector of float)
+0:361              specular2: direct index for structure ( global highp 3-component vector of float)
+0:361                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:361                Constant:
+0:361                  2 (const int)
+0:361              Constant:
+0:361                0.000000
+0:361                0.000000
+0:361                0.000000
+0:362            move second child to first child ( temp highp float)
+0:362              shadowStrength: direct index for structure ( global highp float)
+0:362                'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:362                Constant:
+0:362                  3 (const int)
+0:362              Constant:
+0:362                0.000000
+0:363            Branch: Break
+0:365      move second child to first child ( temp highp 3-component vector of float)
+0:365        'diffuseContrib' ( inout highp 3-component vector of float)
+0:365        diffuse: direct index for structure ( global highp 3-component vector of float)
+0:365          'res' ( temp structure{ global highp 3-component vector of float diffuse,  global highp 3-component vector of float specular,  global highp 3-component vector of float specular2,  global highp float shadowStrength})
+0:365          Constant:
+0:365            0 (const int)
+0:367  Function Definition: TDProjMap(i1;vf3;vf4; ( global highp 4-component vector of float)
+0:367    Function Parameters: 
+0:367      'index' ( in highp int)
+0:367      'worldSpacePos' ( in highp 3-component vector of float)
+0:367      'defaultColor' ( in highp 4-component vector of float)
+0:368    Sequence
+0:368      switch
+0:368      condition
+0:368        'index' ( in highp int)
+0:368      body
+0:368        Sequence
+0:370          default: 
+0:?           Sequence
+0:370            Branch: Return with expression
+0:370              'defaultColor' ( in highp 4-component vector of float)
+0:373  Function Definition: TDFog(vf4;vf3;i1; ( global highp 4-component vector of float)
+0:373    Function Parameters: 
+0:373      'color' ( in highp 4-component vector of float)
+0:373      'lightingSpacePosition' ( in highp 3-component vector of float)
+0:373      'cameraIndex' ( in highp int)
+0:374    Sequence
+0:374      switch
+0:374      condition
+0:374        'cameraIndex' ( in highp int)
+0:374      body
+0:374        Sequence
+0:375          default: 
+0:376          case:  with expression
+0:376            Constant:
+0:376              0 (const int)
+0:?           Sequence
+0:378            Sequence
+0:378              Branch: Return with expression
+0:378                'color' ( in highp 4-component vector of float)
+0:382  Function Definition: TDFog(vf4;vf3; ( global highp 4-component vector of float)
+0:382    Function Parameters: 
+0:382      'color' ( in highp 4-component vector of float)
+0:382      'lightingSpacePosition' ( in highp 3-component vector of float)
+0:384    Sequence
+0:384      Branch: Return with expression
+0:384        Function Call: TDFog(vf4;vf3;i1; ( global highp 4-component vector of float)
+0:384          'color' ( in highp 4-component vector of float)
+0:384          'lightingSpacePosition' ( in highp 3-component vector of float)
+0:384          Constant:
+0:384            0 (const int)
+0:386  Function Definition: TDInstanceTexCoord(i1;vf3; ( global highp 3-component vector of float)
+0:386    Function Parameters: 
+0:386      'index' ( in highp int)
+0:386      't' ( in highp 3-component vector of float)
+0:?     Sequence
+0:388      Sequence
+0:388        move second child to first child ( temp highp int)
+0:388          'coord' ( temp highp int)
+0:388          'index' ( in highp int)
+0:389      Sequence
+0:389        move second child to first child ( temp highp 4-component vector of float)
+0:389          'samp' ( temp highp 4-component vector of float)
+0:389          textureFetch ( global highp 4-component vector of float)
+0:389            'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:389            'coord' ( temp highp int)
+0:390      move second child to first child ( temp highp float)
+0:390        direct index ( temp highp float)
+0:390          'v' ( temp highp 3-component vector of float)
+0:390          Constant:
+0:390            0 (const int)
+0:390        direct index ( temp highp float)
+0:390          't' ( in highp 3-component vector of float)
+0:390          Constant:
+0:390            0 (const int)
+0:391      move second child to first child ( temp highp float)
+0:391        direct index ( temp highp float)
+0:391          'v' ( temp highp 3-component vector of float)
+0:391          Constant:
+0:391            1 (const int)
+0:391        direct index ( temp highp float)
+0:391          't' ( in highp 3-component vector of float)
+0:391          Constant:
+0:391            1 (const int)
+0:392      move second child to first child ( temp highp float)
+0:392        direct index ( temp highp float)
+0:392          'v' ( temp highp 3-component vector of float)
+0:392          Constant:
+0:392            2 (const int)
+0:392        direct index ( temp highp float)
+0:392          'samp' ( temp highp 4-component vector of float)
+0:392          Constant:
+0:392            0 (const int)
+0:393      move second child to first child ( temp highp 3-component vector of float)
+0:393        vector swizzle ( temp highp 3-component vector of float)
+0:393          't' ( in highp 3-component vector of float)
+0:393          Sequence
+0:393            Constant:
+0:393              0 (const int)
+0:393            Constant:
+0:393              1 (const int)
+0:393            Constant:
+0:393              2 (const int)
+0:393        vector swizzle ( temp highp 3-component vector of float)
+0:393          'v' ( temp highp 3-component vector of float)
+0:393          Sequence
+0:393            Constant:
+0:393              0 (const int)
+0:393            Constant:
+0:393              1 (const int)
+0:393            Constant:
+0:393              2 (const int)
+0:394      Branch: Return with expression
+0:394        't' ( in highp 3-component vector of float)
+0:396  Function Definition: TDInstanceActive(i1; ( global bool)
+0:396    Function Parameters: 
+0:396      'index' ( in highp int)
+0:397    Sequence
+0:397      subtract second child into first child ( temp highp int)
+0:397        'index' ( in highp int)
+0:397        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:397          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:397          Constant:
+0:397            0 (const uint)
+0:399      Sequence
+0:399        move second child to first child ( temp highp int)
+0:399          'coord' ( temp highp int)
+0:399          'index' ( in highp int)
+0:400      Sequence
+0:400        move second child to first child ( temp highp 4-component vector of float)
+0:400          'samp' ( temp highp 4-component vector of float)
+0:400          textureFetch ( global highp 4-component vector of float)
+0:400            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:400            'coord' ( temp highp int)
+0:401      move second child to first child ( temp highp float)
+0:401        'v' ( temp highp float)
+0:401        direct index ( temp highp float)
+0:401          'samp' ( temp highp 4-component vector of float)
+0:401          Constant:
+0:401            0 (const int)
+0:402      Branch: Return with expression
+0:402        Compare Not Equal ( temp bool)
+0:402          'v' ( temp highp float)
+0:402          Constant:
+0:402            0.000000
+0:404  Function Definition: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:404    Function Parameters: 
+0:404      'index' ( in highp int)
+0:404      'instanceActive' ( out bool)
+0:405    Sequence
+0:405      Sequence
+0:405        move second child to first child ( temp highp int)
+0:405          'origIndex' ( temp highp int)
+0:405          'index' ( in highp int)
+0:406      subtract second child into first child ( temp highp int)
+0:406        'index' ( in highp int)
+0:406        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:406          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:406          Constant:
+0:406            0 (const uint)
+0:408      Sequence
+0:408        move second child to first child ( temp highp int)
+0:408          'coord' ( temp highp int)
+0:408          'index' ( in highp int)
+0:409      Sequence
+0:409        move second child to first child ( temp highp 4-component vector of float)
+0:409          'samp' ( temp highp 4-component vector of float)
+0:409          textureFetch ( global highp 4-component vector of float)
+0:409            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:409            'coord' ( temp highp int)
+0:410      move second child to first child ( temp highp float)
+0:410        direct index ( temp highp float)
+0:410          'v' ( temp highp 3-component vector of float)
+0:410          Constant:
+0:410            0 (const int)
+0:410        direct index ( temp highp float)
+0:410          'samp' ( temp highp 4-component vector of float)
+0:410          Constant:
+0:410            1 (const int)
+0:411      move second child to first child ( temp highp float)
+0:411        direct index ( temp highp float)
+0:411          'v' ( temp highp 3-component vector of float)
+0:411          Constant:
+0:411            1 (const int)
+0:411        direct index ( temp highp float)
+0:411          'samp' ( temp highp 4-component vector of float)
+0:411          Constant:
+0:411            2 (const int)
+0:412      move second child to first child ( temp highp float)
+0:412        direct index ( temp highp float)
+0:412          'v' ( temp highp 3-component vector of float)
+0:412          Constant:
+0:412            2 (const int)
+0:412        direct index ( temp highp float)
+0:412          'samp' ( temp highp 4-component vector of float)
+0:412          Constant:
+0:412            3 (const int)
+0:413      move second child to first child ( temp bool)
+0:413        'instanceActive' ( out bool)
+0:413        Compare Not Equal ( temp bool)
+0:413          direct index ( temp highp float)
+0:413            'samp' ( temp highp 4-component vector of float)
+0:413            Constant:
+0:413              0 (const int)
+0:413          Constant:
+0:413            0.000000
+0:414      Branch: Return with expression
+0:414        'v' ( temp highp 3-component vector of float)
+0:416  Function Definition: TDInstanceTranslate(i1; ( global highp 3-component vector of float)
+0:416    Function Parameters: 
+0:416      'index' ( in highp int)
+0:417    Sequence
+0:417      subtract second child into first child ( temp highp int)
+0:417        'index' ( in highp int)
+0:417        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:417          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:417          Constant:
+0:417            0 (const uint)
+0:419      Sequence
+0:419        move second child to first child ( temp highp int)
+0:419          'coord' ( temp highp int)
+0:419          'index' ( in highp int)
+0:420      Sequence
+0:420        move second child to first child ( temp highp 4-component vector of float)
+0:420          'samp' ( temp highp 4-component vector of float)
+0:420          textureFetch ( global highp 4-component vector of float)
+0:420            'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:420            'coord' ( temp highp int)
+0:421      move second child to first child ( temp highp float)
+0:421        direct index ( temp highp float)
+0:421          'v' ( temp highp 3-component vector of float)
+0:421          Constant:
+0:421            0 (const int)
+0:421        direct index ( temp highp float)
+0:421          'samp' ( temp highp 4-component vector of float)
+0:421          Constant:
+0:421            1 (const int)
+0:422      move second child to first child ( temp highp float)
+0:422        direct index ( temp highp float)
+0:422          'v' ( temp highp 3-component vector of float)
+0:422          Constant:
+0:422            1 (const int)
+0:422        direct index ( temp highp float)
+0:422          'samp' ( temp highp 4-component vector of float)
+0:422          Constant:
+0:422            2 (const int)
+0:423      move second child to first child ( temp highp float)
+0:423        direct index ( temp highp float)
+0:423          'v' ( temp highp 3-component vector of float)
+0:423          Constant:
+0:423            2 (const int)
+0:423        direct index ( temp highp float)
+0:423          'samp' ( temp highp 4-component vector of float)
+0:423          Constant:
+0:423            3 (const int)
+0:424      Branch: Return with expression
+0:424        'v' ( temp highp 3-component vector of float)
+0:426  Function Definition: TDInstanceRotateMat(i1; ( global highp 3X3 matrix of float)
+0:426    Function Parameters: 
+0:426      'index' ( in highp int)
+0:427    Sequence
+0:427      subtract second child into first child ( temp highp int)
+0:427        'index' ( in highp int)
+0:427        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:427          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:427          Constant:
+0:427            0 (const uint)
+0:428      Sequence
+0:428        move second child to first child ( temp highp 3-component vector of float)
+0:428          'v' ( temp highp 3-component vector of float)
+0:428          Constant:
+0:428            0.000000
+0:428            0.000000
+0:428            0.000000
+0:429      Sequence
+0:429        move second child to first child ( temp highp 3X3 matrix of float)
+0:429          'm' ( temp highp 3X3 matrix of float)
+0:429          Constant:
+0:429            1.000000
+0:429            0.000000
+0:429            0.000000
+0:429            0.000000
+0:429            1.000000
+0:429            0.000000
+0:429            0.000000
+0:429            0.000000
+0:429            1.000000
+0:433      Branch: Return with expression
+0:433        'm' ( temp highp 3X3 matrix of float)
+0:435  Function Definition: TDInstanceScale(i1; ( global highp 3-component vector of float)
+0:435    Function Parameters: 
+0:435      'index' ( in highp int)
+0:436    Sequence
+0:436      subtract second child into first child ( temp highp int)
+0:436        'index' ( in highp int)
+0:436        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:436          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:436          Constant:
+0:436            0 (const uint)
+0:437      Sequence
+0:437        move second child to first child ( temp highp 3-component vector of float)
+0:437          'v' ( temp highp 3-component vector of float)
+0:437          Constant:
+0:437            1.000000
+0:437            1.000000
+0:437            1.000000
+0:438      Branch: Return with expression
+0:438        'v' ( temp highp 3-component vector of float)
+0:440  Function Definition: TDInstancePivot(i1; ( global highp 3-component vector of float)
+0:440    Function Parameters: 
+0:440      'index' ( in highp int)
+0:441    Sequence
+0:441      subtract second child into first child ( temp highp int)
+0:441        'index' ( in highp int)
+0:441        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:441          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:441          Constant:
+0:441            0 (const uint)
+0:442      Sequence
+0:442        move second child to first child ( temp highp 3-component vector of float)
+0:442          'v' ( temp highp 3-component vector of float)
+0:442          Constant:
+0:442            0.000000
+0:442            0.000000
+0:442            0.000000
+0:443      Branch: Return with expression
+0:443        'v' ( temp highp 3-component vector of float)
+0:445  Function Definition: TDInstanceRotTo(i1; ( global highp 3-component vector of float)
+0:445    Function Parameters: 
+0:445      'index' ( in highp int)
+0:446    Sequence
+0:446      subtract second child into first child ( temp highp int)
+0:446        'index' ( in highp int)
+0:446        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:446          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:446          Constant:
+0:446            0 (const uint)
+0:447      Sequence
+0:447        move second child to first child ( temp highp 3-component vector of float)
+0:447          'v' ( temp highp 3-component vector of float)
+0:447          Constant:
+0:447            0.000000
+0:447            0.000000
+0:447            1.000000
+0:448      Branch: Return with expression
+0:448        'v' ( temp highp 3-component vector of float)
+0:450  Function Definition: TDInstanceRotUp(i1; ( global highp 3-component vector of float)
+0:450    Function Parameters: 
+0:450      'index' ( in highp int)
+0:451    Sequence
+0:451      subtract second child into first child ( temp highp int)
+0:451        'index' ( in highp int)
+0:451        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:451          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:451          Constant:
+0:451            0 (const uint)
+0:452      Sequence
+0:452        move second child to first child ( temp highp 3-component vector of float)
+0:452          'v' ( temp highp 3-component vector of float)
+0:452          Constant:
+0:452            0.000000
+0:452            1.000000
+0:452            0.000000
+0:453      Branch: Return with expression
+0:453        'v' ( temp highp 3-component vector of float)
+0:455  Function Definition: TDInstanceMat(i1; ( global highp 4X4 matrix of float)
+0:455    Function Parameters: 
+0:455      'id' ( in highp int)
+0:456    Sequence
+0:456      Sequence
+0:456        move second child to first child ( temp bool)
+0:456          'instanceActive' ( temp bool)
+0:456          Constant:
+0:456            true (const bool)
+0:457      Sequence
+0:457        move second child to first child ( temp highp 3-component vector of float)
+0:457          't' ( temp highp 3-component vector of float)
+0:457          Function Call: iTDInstanceTranslate(i1;b1; ( global highp 3-component vector of float)
+0:457            'id' ( in highp int)
+0:457            'instanceActive' ( temp bool)
+0:458      Test condition and select ( temp void)
+0:458        Condition
+0:458        Negate conditional ( temp bool)
+0:458          'instanceActive' ( temp bool)
+0:458        true case
+0:460        Sequence
+0:460          Branch: Return with expression
+0:460            Constant:
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:460              0.000000
+0:462      Sequence
+0:462        move second child to first child ( temp highp 4X4 matrix of float)
+0:462          'm' ( temp highp 4X4 matrix of float)
+0:462          Constant:
+0:462            1.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            1.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            1.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            0.000000
+0:462            1.000000
+0:464      Sequence
+0:464        Sequence
+0:464          move second child to first child ( temp highp 3-component vector of float)
+0:464            'tt' ( temp highp 3-component vector of float)
+0:464            't' ( temp highp 3-component vector of float)
+0:465        add second child into first child ( temp highp float)
+0:465          direct index ( temp highp float)
+0:465            direct index ( temp highp 4-component vector of float)
+0:465              'm' ( temp highp 4X4 matrix of float)
+0:465              Constant:
+0:465                3 (const int)
+0:465            Constant:
+0:465              0 (const int)
+0:465          component-wise multiply ( temp highp float)
+0:465            direct index ( temp highp float)
+0:465              direct index ( temp highp 4-component vector of float)
+0:465                'm' ( temp highp 4X4 matrix of float)
+0:465                Constant:
+0:465                  0 (const int)
+0:465              Constant:
+0:465                0 (const int)
+0:465            direct index ( temp highp float)
+0:465              'tt' ( temp highp 3-component vector of float)
+0:465              Constant:
+0:465                0 (const int)
+0:466        add second child into first child ( temp highp float)
+0:466          direct index ( temp highp float)
+0:466            direct index ( temp highp 4-component vector of float)
+0:466              'm' ( temp highp 4X4 matrix of float)
+0:466              Constant:
+0:466                3 (const int)
+0:466            Constant:
+0:466              1 (const int)
+0:466          component-wise multiply ( temp highp float)
+0:466            direct index ( temp highp float)
+0:466              direct index ( temp highp 4-component vector of float)
+0:466                'm' ( temp highp 4X4 matrix of float)
+0:466                Constant:
+0:466                  0 (const int)
+0:466              Constant:
+0:466                1 (const int)
+0:466            direct index ( temp highp float)
+0:466              'tt' ( temp highp 3-component vector of float)
+0:466              Constant:
+0:466                0 (const int)
+0:467        add second child into first child ( temp highp float)
+0:467          direct index ( temp highp float)
+0:467            direct index ( temp highp 4-component vector of float)
+0:467              'm' ( temp highp 4X4 matrix of float)
+0:467              Constant:
+0:467                3 (const int)
+0:467            Constant:
+0:467              2 (const int)
+0:467          component-wise multiply ( temp highp float)
+0:467            direct index ( temp highp float)
+0:467              direct index ( temp highp 4-component vector of float)
+0:467                'm' ( temp highp 4X4 matrix of float)
+0:467                Constant:
+0:467                  0 (const int)
+0:467              Constant:
+0:467                2 (const int)
+0:467            direct index ( temp highp float)
+0:467              'tt' ( temp highp 3-component vector of float)
+0:467              Constant:
+0:467                0 (const int)
+0:468        add second child into first child ( temp highp float)
+0:468          direct index ( temp highp float)
+0:468            direct index ( temp highp 4-component vector of float)
+0:468              'm' ( temp highp 4X4 matrix of float)
+0:468              Constant:
+0:468                3 (const int)
+0:468            Constant:
+0:468              3 (const int)
+0:468          component-wise multiply ( temp highp float)
+0:468            direct index ( temp highp float)
+0:468              direct index ( temp highp 4-component vector of float)
+0:468                'm' ( temp highp 4X4 matrix of float)
+0:468                Constant:
+0:468                  0 (const int)
+0:468              Constant:
+0:468                3 (const int)
+0:468            direct index ( temp highp float)
+0:468              'tt' ( temp highp 3-component vector of float)
+0:468              Constant:
+0:468                0 (const int)
+0:469        add second child into first child ( temp highp float)
+0:469          direct index ( temp highp float)
+0:469            direct index ( temp highp 4-component vector of float)
+0:469              'm' ( temp highp 4X4 matrix of float)
+0:469              Constant:
+0:469                3 (const int)
+0:469            Constant:
+0:469              0 (const int)
+0:469          component-wise multiply ( temp highp float)
+0:469            direct index ( temp highp float)
+0:469              direct index ( temp highp 4-component vector of float)
+0:469                'm' ( temp highp 4X4 matrix of float)
+0:469                Constant:
+0:469                  1 (const int)
+0:469              Constant:
+0:469                0 (const int)
+0:469            direct index ( temp highp float)
+0:469              'tt' ( temp highp 3-component vector of float)
+0:469              Constant:
+0:469                1 (const int)
+0:470        add second child into first child ( temp highp float)
+0:470          direct index ( temp highp float)
+0:470            direct index ( temp highp 4-component vector of float)
+0:470              'm' ( temp highp 4X4 matrix of float)
+0:470              Constant:
+0:470                3 (const int)
+0:470            Constant:
+0:470              1 (const int)
+0:470          component-wise multiply ( temp highp float)
+0:470            direct index ( temp highp float)
+0:470              direct index ( temp highp 4-component vector of float)
+0:470                'm' ( temp highp 4X4 matrix of float)
+0:470                Constant:
+0:470                  1 (const int)
+0:470              Constant:
+0:470                1 (const int)
+0:470            direct index ( temp highp float)
+0:470              'tt' ( temp highp 3-component vector of float)
+0:470              Constant:
+0:470                1 (const int)
+0:471        add second child into first child ( temp highp float)
+0:471          direct index ( temp highp float)
+0:471            direct index ( temp highp 4-component vector of float)
+0:471              'm' ( temp highp 4X4 matrix of float)
+0:471              Constant:
+0:471                3 (const int)
+0:471            Constant:
+0:471              2 (const int)
+0:471          component-wise multiply ( temp highp float)
+0:471            direct index ( temp highp float)
+0:471              direct index ( temp highp 4-component vector of float)
+0:471                'm' ( temp highp 4X4 matrix of float)
+0:471                Constant:
+0:471                  1 (const int)
+0:471              Constant:
+0:471                2 (const int)
+0:471            direct index ( temp highp float)
+0:471              'tt' ( temp highp 3-component vector of float)
+0:471              Constant:
+0:471                1 (const int)
+0:472        add second child into first child ( temp highp float)
+0:472          direct index ( temp highp float)
+0:472            direct index ( temp highp 4-component vector of float)
+0:472              'm' ( temp highp 4X4 matrix of float)
+0:472              Constant:
+0:472                3 (const int)
+0:472            Constant:
+0:472              3 (const int)
+0:472          component-wise multiply ( temp highp float)
+0:472            direct index ( temp highp float)
+0:472              direct index ( temp highp 4-component vector of float)
+0:472                'm' ( temp highp 4X4 matrix of float)
+0:472                Constant:
+0:472                  1 (const int)
+0:472              Constant:
+0:472                3 (const int)
+0:472            direct index ( temp highp float)
+0:472              'tt' ( temp highp 3-component vector of float)
+0:472              Constant:
+0:472                1 (const int)
+0:473        add second child into first child ( temp highp float)
+0:473          direct index ( temp highp float)
+0:473            direct index ( temp highp 4-component vector of float)
+0:473              'm' ( temp highp 4X4 matrix of float)
+0:473              Constant:
+0:473                3 (const int)
+0:473            Constant:
+0:473              0 (const int)
+0:473          component-wise multiply ( temp highp float)
+0:473            direct index ( temp highp float)
+0:473              direct index ( temp highp 4-component vector of float)
+0:473                'm' ( temp highp 4X4 matrix of float)
+0:473                Constant:
+0:473                  2 (const int)
+0:473              Constant:
+0:473                0 (const int)
+0:473            direct index ( temp highp float)
+0:473              'tt' ( temp highp 3-component vector of float)
+0:473              Constant:
+0:473                2 (const int)
+0:474        add second child into first child ( temp highp float)
+0:474          direct index ( temp highp float)
+0:474            direct index ( temp highp 4-component vector of float)
+0:474              'm' ( temp highp 4X4 matrix of float)
+0:474              Constant:
+0:474                3 (const int)
+0:474            Constant:
+0:474              1 (const int)
+0:474          component-wise multiply ( temp highp float)
+0:474            direct index ( temp highp float)
+0:474              direct index ( temp highp 4-component vector of float)
+0:474                'm' ( temp highp 4X4 matrix of float)
+0:474                Constant:
+0:474                  2 (const int)
+0:474              Constant:
+0:474                1 (const int)
+0:474            direct index ( temp highp float)
+0:474              'tt' ( temp highp 3-component vector of float)
+0:474              Constant:
+0:474                2 (const int)
+0:475        add second child into first child ( temp highp float)
+0:475          direct index ( temp highp float)
+0:475            direct index ( temp highp 4-component vector of float)
+0:475              'm' ( temp highp 4X4 matrix of float)
+0:475              Constant:
+0:475                3 (const int)
+0:475            Constant:
+0:475              2 (const int)
+0:475          component-wise multiply ( temp highp float)
+0:475            direct index ( temp highp float)
+0:475              direct index ( temp highp 4-component vector of float)
+0:475                'm' ( temp highp 4X4 matrix of float)
+0:475                Constant:
+0:475                  2 (const int)
+0:475              Constant:
+0:475                2 (const int)
+0:475            direct index ( temp highp float)
+0:475              'tt' ( temp highp 3-component vector of float)
+0:475              Constant:
+0:475                2 (const int)
+0:476        add second child into first child ( temp highp float)
+0:476          direct index ( temp highp float)
+0:476            direct index ( temp highp 4-component vector of float)
+0:476              'm' ( temp highp 4X4 matrix of float)
+0:476              Constant:
+0:476                3 (const int)
+0:476            Constant:
+0:476              3 (const int)
+0:476          component-wise multiply ( temp highp float)
+0:476            direct index ( temp highp float)
+0:476              direct index ( temp highp 4-component vector of float)
+0:476                'm' ( temp highp 4X4 matrix of float)
+0:476                Constant:
+0:476                  2 (const int)
+0:476              Constant:
+0:476                3 (const int)
+0:476            direct index ( temp highp float)
+0:476              'tt' ( temp highp 3-component vector of float)
+0:476              Constant:
+0:476                2 (const int)
+0:478      Branch: Return with expression
+0:478        'm' ( temp highp 4X4 matrix of float)
+0:480  Function Definition: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:480    Function Parameters: 
+0:480      'id' ( in highp int)
+0:481    Sequence
+0:481      Sequence
+0:481        move second child to first child ( temp highp 3X3 matrix of float)
+0:481          'm' ( temp highp 3X3 matrix of float)
+0:481          Constant:
+0:481            1.000000
+0:481            0.000000
+0:481            0.000000
+0:481            0.000000
+0:481            1.000000
+0:481            0.000000
+0:481            0.000000
+0:481            0.000000
+0:481            1.000000
+0:482      Branch: Return with expression
+0:482        'm' ( temp highp 3X3 matrix of float)
+0:484  Function Definition: TDInstanceMat3ForNorm(i1; ( global highp 3X3 matrix of float)
+0:484    Function Parameters: 
+0:484      'id' ( in highp int)
+0:485    Sequence
+0:485      Sequence
+0:485        move second child to first child ( temp highp 3X3 matrix of float)
+0:485          'm' ( temp highp 3X3 matrix of float)
+0:485          Function Call: TDInstanceMat3(i1; ( global highp 3X3 matrix of float)
+0:485            'id' ( in highp int)
+0:486      Branch: Return with expression
+0:486        'm' ( temp highp 3X3 matrix of float)
+0:488  Function Definition: TDInstanceColor(i1;vf4; ( global highp 4-component vector of float)
+0:488    Function Parameters: 
+0:488      'index' ( in highp int)
+0:488      'curColor' ( in highp 4-component vector of float)
+0:489    Sequence
+0:489      subtract second child into first child ( temp highp int)
+0:489        'index' ( in highp int)
+0:489        uTDInstanceIDOffset: direct index for structure ( uniform highp int)
+0:489          'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:489          Constant:
+0:489            0 (const uint)
+0:491      Sequence
+0:491        move second child to first child ( temp highp int)
+0:491          'coord' ( temp highp int)
+0:491          'index' ( in highp int)
+0:492      Sequence
+0:492        move second child to first child ( temp highp 4-component vector of float)
+0:492          'samp' ( temp highp 4-component vector of float)
+0:492          textureFetch ( global highp 4-component vector of float)
+0:492            'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+0:492            'coord' ( temp highp int)
+0:493      move second child to first child ( temp highp float)
+0:493        direct index ( temp highp float)
+0:493          'v' ( temp highp 4-component vector of float)
+0:493          Constant:
+0:493            0 (const int)
+0:493        direct index ( temp highp float)
+0:493          'samp' ( temp highp 4-component vector of float)
+0:493          Constant:
+0:493            0 (const int)
+0:494      move second child to first child ( temp highp float)
+0:494        direct index ( temp highp float)
+0:494          'v' ( temp highp 4-component vector of float)
+0:494          Constant:
+0:494            1 (const int)
+0:494        direct index ( temp highp float)
+0:494          'samp' ( temp highp 4-component vector of float)
+0:494          Constant:
+0:494            1 (const int)
+0:495      move second child to first child ( temp highp float)
+0:495        direct index ( temp highp float)
+0:495          'v' ( temp highp 4-component vector of float)
+0:495          Constant:
+0:495            2 (const int)
+0:495        direct index ( temp highp float)
+0:495          'samp' ( temp highp 4-component vector of float)
+0:495          Constant:
+0:495            2 (const int)
+0:496      move second child to first child ( temp highp float)
+0:496        direct index ( temp highp float)
+0:496          'v' ( temp highp 4-component vector of float)
+0:496          Constant:
+0:496            3 (const int)
+0:496        Constant:
+0:496          1.000000
+0:497      move second child to first child ( temp highp float)
+0:497        direct index ( temp highp float)
+0:497          'curColor' ( in highp 4-component vector of float)
+0:497          Constant:
+0:497            0 (const int)
+0:497        direct index ( temp highp float)
+0:497          'v' ( temp highp 4-component vector of float)
+0:497          Constant:
+0:497            0 (const int)
+0:499      move second child to first child ( temp highp float)
+0:499        direct index ( temp highp float)
+0:499          'curColor' ( in highp 4-component vector of float)
+0:499          Constant:
+0:499            1 (const int)
+0:499        direct index ( temp highp float)
+0:499          'v' ( temp highp 4-component vector of float)
+0:499          Constant:
+0:499            1 (const int)
+0:501      move second child to first child ( temp highp float)
+0:501        direct index ( temp highp float)
+0:501          'curColor' ( in highp 4-component vector of float)
+0:501          Constant:
+0:501            2 (const int)
+0:501        direct index ( temp highp float)
+0:501          'v' ( temp highp 4-component vector of float)
+0:501          Constant:
+0:501            2 (const int)
+0:503      Branch: Return with expression
+0:503        'curColor' ( in highp 4-component vector of float)
+0:2  Function Definition: TDOutputSwizzle(vf4; ( global highp 4-component vector of float)
+0:2    Function Parameters: 
+0:2      'c' ( in highp 4-component vector of float)
+0:4    Sequence
+0:4      Branch: Return with expression
+0:4        vector swizzle ( temp highp 4-component vector of float)
+0:4          'c' ( in highp 4-component vector of float)
+0:4          Sequence
+0:4            Constant:
+0:4              0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4            Constant:
+0:4              2 (const int)
+0:4            Constant:
+0:4              3 (const int)
+0:6  Function Definition: TDOutputSwizzle(vu4; ( global highp 4-component vector of uint)
+0:6    Function Parameters: 
+0:6      'c' ( in highp 4-component vector of uint)
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        vector swizzle ( temp highp 4-component vector of uint)
+0:8          'c' ( in highp 4-component vector of uint)
+0:8          Sequence
+0:8            Constant:
+0:8              0 (const int)
+0:8            Constant:
+0:8              1 (const int)
+0:8            Constant:
+0:8              2 (const int)
+0:8            Constant:
+0:8              3 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp int uTDInstanceIDOffset,  uniform highp int uTDNumInstances,  uniform highp float uTDAlphaTestVal,  uniform highp 3-component vector of float uConstant,  uniform highp float uShadowStrength,  uniform highp 3-component vector of float uShadowColor,  uniform highp 4-component vector of float uDiffuseColor,  uniform highp 4-component vector of float uAmbientColor})
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{layout( column_major std140) global highp 4X4 matrix of float world, layout( column_major std140) global highp 4X4 matrix of float worldInverse, layout( column_major std140) global highp 4X4 matrix of float worldCam, layout( column_major std140) global highp 4X4 matrix of float worldCamInverse, layout( column_major std140) global highp 4X4 matrix of float cam, layout( column_major std140) global highp 4X4 matrix of float camInverse, layout( column_major std140) global highp 4X4 matrix of float camProj, layout( column_major std140) global highp 4X4 matrix of float camProjInverse, layout( column_major std140) global highp 4X4 matrix of float proj, layout( column_major std140) global highp 4X4 matrix of float projInverse, layout( column_major std140) global highp 4X4 matrix of float worldCamProj, layout( column_major std140) global highp 4X4 matrix of float worldCamProjInverse, layout( column_major std140) global highp 4X4 matrix of float quadReproject, layout( column_major std140) global highp 3X3 matrix of float worldForNormals, layout( column_major std140) global highp 3X3 matrix of float camForNormals, layout( column_major std140) global highp 3X3 matrix of float worldCamForNormals} uTDMats})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float nearFar,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor,  global highp int renderTOPCameraIndex} uTDCamInfos})
+0:?     'anon@3' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform structure{ global highp 4-component vector of float ambientColor,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float viewport,  global highp 4-component vector of float viewportRes,  global highp 4-component vector of float fog,  global highp 4-component vector of float fogColor} uTDGeneral})
+0:?     'sColorMap' ( uniform highp sampler2DArray)
+0:?     'iVert' ( in block{ in highp 4-component vector of float color,  in highp 3-component vector of float worldSpacePos,  in highp 3-component vector of float texCoord0,  flat in highp int cameraIndex,  flat in highp int instance})
+0:?     'oFragColor' (layout( location=0) out 1-element array of highp 4-component vector of float)
+0:?     'sTDNoiseMap' ( uniform highp sampler2D)
+0:?     'sTDSineLookup' ( uniform highp sampler1D)
+0:?     'sTDWhite2D' ( uniform highp sampler2D)
+0:?     'sTDWhite3D' ( uniform highp sampler3D)
+0:?     'sTDWhite2DArray' ( uniform highp sampler2DArray)
+0:?     'sTDWhiteCube' ( uniform highp samplerCube)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 4-component vector of float position,  global highp 3-component vector of float direction,  global highp 3-component vector of float diffuse,  global highp 4-component vector of float nearFar,  global highp 4-component vector of float lightSize,  global highp 4-component vector of float misc,  global highp 4-component vector of float coneLookupScaleBias,  global highp 4-component vector of float attenScaleBiasRoll, layout( column_major std140) global highp 4X4 matrix of float shadowMapMatrix, layout( column_major std140) global highp 4X4 matrix of float shadowMapCamMatrix,  global highp 4-component vector of float shadowMapRes, layout( column_major std140) global highp 4X4 matrix of float projMapMatrix} uTDLights})
+0:?     'anon@2' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 1-element array of structure{ global highp 3-component vector of float color, layout( column_major std140) global highp 3X3 matrix of float rotate} uTDEnvLights})
+0:?     'uTDEnvLightBuffers' (layout( column_major std430) restrict readonly buffer 1-element array of block{layout( column_major std430 offset=0) restrict readonly buffer 9-element array of highp 3-component vector of float shCoeffs})
+0:?     'sTDInstanceT' (layout( binding=15) uniform highp samplerBuffer)
+0:?     'sTDInstanceTexCoord' (layout( binding=16) uniform highp samplerBuffer)
+0:?     'sTDInstanceColor' (layout( binding=17) uniform highp samplerBuffer)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 939
+
+                              Capability Shader
+                              Capability SampledBuffer
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 207 216 226 238 256 297 905 906
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 20  "iTDCamToProj(vf4;vf3;i1;b1;"
+                              Name 16  "v"
+                              Name 17  "uv"
+                              Name 18  "cameraIndex"
+                              Name 19  "applyPickMod"
+                              Name 26  "iTDWorldToProj(vf4;vf3;i1;b1;"
+                              Name 22  "v"
+                              Name 23  "uv"
+                              Name 24  "cameraIndex"
+                              Name 25  "applyPickMod"
+                              Name 29  "TDInstanceID("
+                              Name 31  "TDCameraIndex("
+                              Name 34  "TDUVUnwrapCoord("
+                              Name 36  "TDPickID("
+                              Name 40  "iTDConvertPickId(i1;"
+                              Name 39  "id"
+                              Name 42  "TDWritePickingValues("
+                              Name 47  "TDWorldToProj(vf4;vf3;"
+                              Name 45  "v"
+                              Name 46  "uv"
+                              Name 52  "TDWorldToProj(vf3;vf3;"
+                              Name 50  "v"
+                              Name 51  "uv"
+                              Name 56  "TDWorldToProj(vf4;"
+                              Name 55  "v"
+                              Name 60  "TDWorldToProj(vf3;"
+                              Name 59  "v"
+                              Name 63  "TDPointColor("
+                              Name 68  "TDInstanceTexCoord(i1;vf3;"
+                              Name 66  "index"
+                              Name 67  "t"
+                              Name 72  "TDInstanceActive(i1;"
+                              Name 71  "index"
+                              Name 77  "iTDInstanceTranslate(i1;b1;"
+                              Name 75  "index"
+                              Name 76  "instanceActive"
+                              Name 81  "TDInstanceTranslate(i1;"
+                              Name 80  "index"
+                              Name 86  "TDInstanceRotateMat(i1;"
+                              Name 85  "index"
+                              Name 89  "TDInstanceScale(i1;"
+                              Name 88  "index"
+                              Name 92  "TDInstancePivot(i1;"
+                              Name 91  "index"
+                              Name 95  "TDInstanceRotTo(i1;"
+                              Name 94  "index"
+                              Name 98  "TDInstanceRotUp(i1;"
+                              Name 97  "index"
+                              Name 103  "TDInstanceMat(i1;"
+                              Name 102  "id"
+                              Name 106  "TDInstanceMat3(i1;"
+                              Name 105  "id"
+                              Name 109  "TDInstanceMat3ForNorm(i1;"
+                              Name 108  "id"
+                              Name 114  "TDInstanceColor(i1;vf4;"
+                              Name 112  "index"
+                              Name 113  "curColor"
+                              Name 118  "TDInstanceDeform(i1;vf4;"
+                              Name 116  "id"
+                              Name 117  "pos"
+                              Name 122  "TDInstanceDeformVec(i1;vf3;"
+                              Name 120  "id"
+                              Name 121  "vec"
+                              Name 126  "TDInstanceDeformNorm(i1;vf3;"
+                              Name 124  "id"
+                              Name 125  "vec"
+                              Name 129  "TDInstanceDeform(vf4;"
+                              Name 128  "pos"
+                              Name 133  "TDInstanceDeformVec(vf3;"
+                              Name 132  "vec"
+                              Name 136  "TDInstanceDeformNorm(vf3;"
+                              Name 135  "vec"
+                              Name 139  "TDInstanceActive("
+                              Name 141  "TDInstanceTranslate("
+                              Name 144  "TDInstanceRotateMat("
+                              Name 146  "TDInstanceScale("
+                              Name 149  "TDInstanceMat("
+                              Name 151  "TDInstanceMat3("
+                              Name 154  "TDInstanceTexCoord(vf3;"
+                              Name 153  "t"
+                              Name 157  "TDInstanceColor(vf4;"
+                              Name 156  "curColor"
+                              Name 160  "TDSkinnedDeform(vf4;"
+                              Name 159  "pos"
+                              Name 163  "TDSkinnedDeformVec(vf3;"
+                              Name 162  "vec"
+                              Name 169  "TDFastDeformTangent(vf3;vf4;vf3;"
+                              Name 166  "oldNorm"
+                              Name 167  "oldTangent"
+                              Name 168  "deformedNorm"
+                              Name 172  "TDBoneMat(i1;"
+                              Name 171  "index"
+                              Name 175  "TDDeform(vf4;"
+                              Name 174  "pos"
+                              Name 180  "TDDeform(i1;vf3;"
+                              Name 178  "instanceID"
+                              Name 179  "p"
+                              Name 183  "TDDeform(vf3;"
+                              Name 182  "pos"
+                              Name 187  "TDDeformVec(i1;vf3;"
+                              Name 185  "instanceID"
+                              Name 186  "vec"
+                              Name 190  "TDDeformVec(vf3;"
+                              Name 189  "vec"
+                              Name 194  "TDDeformNorm(i1;vf3;"
+                              Name 192  "instanceID"
+                              Name 193  "vec"
+                              Name 197  "TDDeformNorm(vf3;"
+                              Name 196  "vec"
+                              Name 200  "TDSkinnedDeformNorm(vf3;"
+                              Name 199  "vec"
+                              Name 202  "texcoord"
+                              Name 207  "uv"
+                              Name 209  "param"
+                              Name 214  "Vertex"
+                              MemberName 214(Vertex) 0  "color"
+                              MemberName 214(Vertex) 1  "worldSpacePos"
+                              MemberName 214(Vertex) 2  "texCoord0"
+                              MemberName 214(Vertex) 3  "cameraIndex"
+                              MemberName 214(Vertex) 4  "instance"
+                              Name 216  "oVert"
+                              Name 225  "worldSpacePos"
+                              Name 226  "P"
+                              Name 227  "param"
+                              Name 230  "uvUnwrapCoord"
+                              Name 232  "param"
+                              Name 236  "gl_PerVertex"
+                              MemberName 236(gl_PerVertex) 0  "gl_Position"
+                              MemberName 236(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 236(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 236(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 238  ""
+                              Name 239  "param"
+                              Name 241  "param"
+                              Name 246  "cameraIndex"
+                              Name 256  "Cd"
+                              Name 257  "param"
+                              Name 269  "TDMatrix"
+                              MemberName 269(TDMatrix) 0  "world"
+                              MemberName 269(TDMatrix) 1  "worldInverse"
+                              MemberName 269(TDMatrix) 2  "worldCam"
+                              MemberName 269(TDMatrix) 3  "worldCamInverse"
+                              MemberName 269(TDMatrix) 4  "cam"
+                              MemberName 269(TDMatrix) 5  "camInverse"
+                              MemberName 269(TDMatrix) 6  "camProj"
+                              MemberName 269(TDMatrix) 7  "camProjInverse"
+                              MemberName 269(TDMatrix) 8  "proj"
+                              MemberName 269(TDMatrix) 9  "projInverse"
+                              MemberName 269(TDMatrix) 10  "worldCamProj"
+                              MemberName 269(TDMatrix) 11  "worldCamProjInverse"
+                              MemberName 269(TDMatrix) 12  "quadReproject"
+                              MemberName 269(TDMatrix) 13  "worldForNormals"
+                              MemberName 269(TDMatrix) 14  "camForNormals"
+                              MemberName 269(TDMatrix) 15  "worldCamForNormals"
+                              Name 271  "TDMatricesBlock"
+                              MemberName 271(TDMatricesBlock) 0  "uTDMats"
+                              Name 273  ""
+                              Name 297  "gl_InstanceIndex"
+                              Name 299  "gl_DefaultUniformBlock"
+                              MemberName 299(gl_DefaultUniformBlock) 0  "uTDInstanceIDOffset"
+                              MemberName 299(gl_DefaultUniformBlock) 1  "uTDNumInstances"
+                              MemberName 299(gl_DefaultUniformBlock) 2  "uTDAlphaTestVal"
+                              MemberName 299(gl_DefaultUniformBlock) 3  "uConstant"
+                              MemberName 299(gl_DefaultUniformBlock) 4  "uShadowStrength"
+                              MemberName 299(gl_DefaultUniformBlock) 5  "uShadowColor"
+                              MemberName 299(gl_DefaultUniformBlock) 6  "uDiffuseColor"
+                              MemberName 299(gl_DefaultUniformBlock) 7  "uAmbientColor"
+                              Name 301  ""
+                              Name 325  "param"
+                              Name 327  "param"
+                              Name 329  "param"
+                              Name 330  "param"
+                              Name 340  "param"
+                              Name 341  "param"
+                              Name 347  "param"
+                              Name 349  "param"
+                              Name 358  "param"
+                              Name 365  "coord"
+                              Name 367  "samp"
+                              Name 371  "sTDInstanceTexCoord"
+                              Name 376  "v"
+                              Name 397  "coord"
+                              Name 399  "samp"
+                              Name 400  "sTDInstanceT"
+                              Name 405  "v"
+                              Name 412  "origIndex"
+                              Name 418  "coord"
+                              Name 420  "samp"
+                              Name 425  "v"
+                              Name 446  "coord"
+                              Name 448  "samp"
+                              Name 453  "v"
+                              Name 470  "v"
+                              Name 472  "m"
+                              Name 484  "v"
+                              Name 493  "v"
+                              Name 501  "v"
+                              Name 509  "v"
+                              Name 513  "instanceActive"
+                              Name 514  "t"
+                              Name 515  "param"
+                              Name 517  "param"
+                              Name 528  "m"
+                              Name 534  "tt"
+                              Name 647  "m"
+                              Name 651  "m"
+                              Name 652  "param"
+                              Name 662  "coord"
+                              Name 664  "samp"
+                              Name 665  "sTDInstanceColor"
+                              Name 670  "v"
+                              Name 693  "param"
+                              Name 705  "m"
+                              Name 706  "param"
+                              Name 725  "m"
+                              Name 726  "param"
+                              Name 745  "param"
+                              Name 746  "param"
+                              Name 752  "param"
+                              Name 753  "param"
+                              Name 759  "param"
+                              Name 760  "param"
+                              Name 766  "param"
+                              Name 771  "param"
+                              Name 776  "param"
+                              Name 781  "param"
+                              Name 786  "param"
+                              Name 791  "param"
+                              Name 796  "param"
+                              Name 797  "param"
+                              Name 803  "param"
+                              Name 804  "param"
+                              Name 821  "param"
+                              Name 824  "param"
+                              Name 830  "pos"
+                              Name 836  "param"
+                              Name 839  "param"
+                              Name 841  "param"
+                              Name 848  "param"
+                              Name 849  "param"
+                              Name 854  "param"
+                              Name 857  "param"
+                              Name 859  "param"
+                              Name 866  "param"
+                              Name 867  "param"
+                              Name 872  "param"
+                              Name 875  "param"
+                              Name 877  "param"
+                              Name 884  "param"
+                              Name 885  "param"
+                              Name 890  "param"
+                              Name 896  "TDCameraInfo"
+                              MemberName 896(TDCameraInfo) 0  "nearFar"
+                              MemberName 896(TDCameraInfo) 1  "fog"
+                              MemberName 896(TDCameraInfo) 2  "fogColor"
+                              MemberName 896(TDCameraInfo) 3  "renderTOPCameraIndex"
+                              Name 898  "TDCameraInfoBlock"
+                              MemberName 898(TDCameraInfoBlock) 0  "uTDCamInfos"
+                              Name 900  ""
+                              Name 901  "TDGeneral"
+                              MemberName 901(TDGeneral) 0  "ambientColor"
+                              MemberName 901(TDGeneral) 1  "nearFar"
+                              MemberName 901(TDGeneral) 2  "viewport"
+                              MemberName 901(TDGeneral) 3  "viewportRes"
+                              MemberName 901(TDGeneral) 4  "fog"
+                              MemberName 901(TDGeneral) 5  "fogColor"
+                              Name 902  "TDGeneralBlock"
+                              MemberName 902(TDGeneralBlock) 0  "uTDGeneral"
+                              Name 904  ""
+                              Name 905  "N"
+                              Name 906  "gl_VertexIndex"
+                              Name 907  "TDLight"
+                              MemberName 907(TDLight) 0  "position"
+                              MemberName 907(TDLight) 1  "direction"
+                              MemberName 907(TDLight) 2  "diffuse"
+                              MemberName 907(TDLight) 3  "nearFar"
+                              MemberName 907(TDLight) 4  "lightSize"
+                              MemberName 907(TDLight) 5  "misc"
+                              MemberName 907(TDLight) 6  "coneLookupScaleBias"
+                              MemberName 907(TDLight) 7  "attenScaleBiasRoll"
+                              MemberName 907(TDLight) 8  "shadowMapMatrix"
+                              MemberName 907(TDLight) 9  "shadowMapCamMatrix"
+                              MemberName 907(TDLight) 10  "shadowMapRes"
+                              MemberName 907(TDLight) 11  "projMapMatrix"
+                              Name 909  "TDLightBlock"
+                              MemberName 909(TDLightBlock) 0  "uTDLights"
+                              Name 911  ""
+                              Name 912  "TDEnvLight"
+                              MemberName 912(TDEnvLight) 0  "color"
+                              MemberName 912(TDEnvLight) 1  "rotate"
+                              Name 914  "TDEnvLightBlock"
+                              MemberName 914(TDEnvLightBlock) 0  "uTDEnvLights"
+                              Name 916  ""
+                              Name 919  "TDEnvLightBuffer"
+                              MemberName 919(TDEnvLightBuffer) 0  "shCoeffs"
+                              Name 922  "uTDEnvLightBuffers"
+                              Name 926  "mTD2DImageOutputs"
+                              Name 930  "mTD2DArrayImageOutputs"
+                              Name 934  "mTD3DImageOutputs"
+                              Name 938  "mTDCubeImageOutputs"
+                              Decorate 207(uv) Location 3
+                              MemberDecorate 214(Vertex) 3 Flat
+                              MemberDecorate 214(Vertex) 4 Flat
+                              Decorate 214(Vertex) Block
+                              Decorate 216(oVert) Location 0
+                              Decorate 226(P) Location 0
+                              MemberDecorate 236(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 236(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 236(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 236(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 236(gl_PerVertex) Block
+                              Decorate 256(Cd) Location 2
+                              MemberDecorate 269(TDMatrix) 0 ColMajor
+                              MemberDecorate 269(TDMatrix) 0 Offset 0
+                              MemberDecorate 269(TDMatrix) 0 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 1 ColMajor
+                              MemberDecorate 269(TDMatrix) 1 Offset 64
+                              MemberDecorate 269(TDMatrix) 1 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 2 ColMajor
+                              MemberDecorate 269(TDMatrix) 2 Offset 128
+                              MemberDecorate 269(TDMatrix) 2 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 3 ColMajor
+                              MemberDecorate 269(TDMatrix) 3 Offset 192
+                              MemberDecorate 269(TDMatrix) 3 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 4 ColMajor
+                              MemberDecorate 269(TDMatrix) 4 Offset 256
+                              MemberDecorate 269(TDMatrix) 4 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 5 ColMajor
+                              MemberDecorate 269(TDMatrix) 5 Offset 320
+                              MemberDecorate 269(TDMatrix) 5 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 6 ColMajor
+                              MemberDecorate 269(TDMatrix) 6 Offset 384
+                              MemberDecorate 269(TDMatrix) 6 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 7 ColMajor
+                              MemberDecorate 269(TDMatrix) 7 Offset 448
+                              MemberDecorate 269(TDMatrix) 7 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 8 ColMajor
+                              MemberDecorate 269(TDMatrix) 8 Offset 512
+                              MemberDecorate 269(TDMatrix) 8 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 9 ColMajor
+                              MemberDecorate 269(TDMatrix) 9 Offset 576
+                              MemberDecorate 269(TDMatrix) 9 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 10 ColMajor
+                              MemberDecorate 269(TDMatrix) 10 Offset 640
+                              MemberDecorate 269(TDMatrix) 10 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 11 ColMajor
+                              MemberDecorate 269(TDMatrix) 11 Offset 704
+                              MemberDecorate 269(TDMatrix) 11 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 12 ColMajor
+                              MemberDecorate 269(TDMatrix) 12 Offset 768
+                              MemberDecorate 269(TDMatrix) 12 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 13 ColMajor
+                              MemberDecorate 269(TDMatrix) 13 Offset 832
+                              MemberDecorate 269(TDMatrix) 13 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 14 ColMajor
+                              MemberDecorate 269(TDMatrix) 14 Offset 880
+                              MemberDecorate 269(TDMatrix) 14 MatrixStride 16
+                              MemberDecorate 269(TDMatrix) 15 ColMajor
+                              MemberDecorate 269(TDMatrix) 15 Offset 928
+                              MemberDecorate 269(TDMatrix) 15 MatrixStride 16
+                              Decorate 270 ArrayStride 976
+                              MemberDecorate 271(TDMatricesBlock) 0 Offset 0
+                              Decorate 271(TDMatricesBlock) Block
+                              Decorate 273 DescriptorSet 0
+                              Decorate 273 Binding 1
+                              Decorate 297(gl_InstanceIndex) BuiltIn InstanceIndex
+                              MemberDecorate 299(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 299(gl_DefaultUniformBlock) 1 Offset 4
+                              MemberDecorate 299(gl_DefaultUniformBlock) 2 Offset 8
+                              MemberDecorate 299(gl_DefaultUniformBlock) 3 Offset 16
+                              MemberDecorate 299(gl_DefaultUniformBlock) 4 Offset 28
+                              MemberDecorate 299(gl_DefaultUniformBlock) 5 Offset 32
+                              MemberDecorate 299(gl_DefaultUniformBlock) 6 Offset 48
+                              MemberDecorate 299(gl_DefaultUniformBlock) 7 Offset 64
+                              Decorate 299(gl_DefaultUniformBlock) Block
+                              Decorate 301 DescriptorSet 0
+                              Decorate 301 Binding 0
+                              Decorate 371(sTDInstanceTexCoord) DescriptorSet 0
+                              Decorate 371(sTDInstanceTexCoord) Binding 16
+                              Decorate 400(sTDInstanceT) DescriptorSet 0
+                              Decorate 400(sTDInstanceT) Binding 15
+                              Decorate 665(sTDInstanceColor) DescriptorSet 0
+                              Decorate 665(sTDInstanceColor) Binding 17
+                              MemberDecorate 896(TDCameraInfo) 0 Offset 0
+                              MemberDecorate 896(TDCameraInfo) 1 Offset 16
+                              MemberDecorate 896(TDCameraInfo) 2 Offset 32
+                              MemberDecorate 896(TDCameraInfo) 3 Offset 48
+                              Decorate 897 ArrayStride 64
+                              MemberDecorate 898(TDCameraInfoBlock) 0 Offset 0
+                              Decorate 898(TDCameraInfoBlock) Block
+                              Decorate 900 DescriptorSet 0
+                              Decorate 900 Binding 0
+                              MemberDecorate 901(TDGeneral) 0 Offset 0
+                              MemberDecorate 901(TDGeneral) 1 Offset 16
+                              MemberDecorate 901(TDGeneral) 2 Offset 32
+                              MemberDecorate 901(TDGeneral) 3 Offset 48
+                              MemberDecorate 901(TDGeneral) 4 Offset 64
+                              MemberDecorate 901(TDGeneral) 5 Offset 80
+                              MemberDecorate 902(TDGeneralBlock) 0 Offset 0
+                              Decorate 902(TDGeneralBlock) Block
+                              Decorate 904 DescriptorSet 0
+                              Decorate 904 Binding 0
+                              Decorate 905(N) Location 1
+                              Decorate 906(gl_VertexIndex) BuiltIn VertexIndex
+                              MemberDecorate 907(TDLight) 0 Offset 0
+                              MemberDecorate 907(TDLight) 1 Offset 16
+                              MemberDecorate 907(TDLight) 2 Offset 32
+                              MemberDecorate 907(TDLight) 3 Offset 48
+                              MemberDecorate 907(TDLight) 4 Offset 64
+                              MemberDecorate 907(TDLight) 5 Offset 80
+                              MemberDecorate 907(TDLight) 6 Offset 96
+                              MemberDecorate 907(TDLight) 7 Offset 112
+                              MemberDecorate 907(TDLight) 8 ColMajor
+                              MemberDecorate 907(TDLight) 8 Offset 128
+                              MemberDecorate 907(TDLight) 8 MatrixStride 16
+                              MemberDecorate 907(TDLight) 9 ColMajor
+                              MemberDecorate 907(TDLight) 9 Offset 192
+                              MemberDecorate 907(TDLight) 9 MatrixStride 16
+                              MemberDecorate 907(TDLight) 10 Offset 256
+                              MemberDecorate 907(TDLight) 11 ColMajor
+                              MemberDecorate 907(TDLight) 11 Offset 272
+                              MemberDecorate 907(TDLight) 11 MatrixStride 16
+                              Decorate 908 ArrayStride 336
+                              MemberDecorate 909(TDLightBlock) 0 Offset 0
+                              Decorate 909(TDLightBlock) Block
+                              Decorate 911 DescriptorSet 0
+                              Decorate 911 Binding 0
+                              MemberDecorate 912(TDEnvLight) 0 Offset 0
+                              MemberDecorate 912(TDEnvLight) 1 ColMajor
+                              MemberDecorate 912(TDEnvLight) 1 Offset 16
+                              MemberDecorate 912(TDEnvLight) 1 MatrixStride 16
+                              Decorate 913 ArrayStride 64
+                              MemberDecorate 914(TDEnvLightBlock) 0 Offset 0
+                              Decorate 914(TDEnvLightBlock) Block
+                              Decorate 916 DescriptorSet 0
+                              Decorate 916 Binding 0
+                              Decorate 918 ArrayStride 16
+                              MemberDecorate 919(TDEnvLightBuffer) 0 Restrict
+                              MemberDecorate 919(TDEnvLightBuffer) 0 NonWritable
+                              MemberDecorate 919(TDEnvLightBuffer) 0 Offset 0
+                              Decorate 919(TDEnvLightBuffer) BufferBlock
+                              Decorate 922(uTDEnvLightBuffers) DescriptorSet 0
+                              Decorate 922(uTDEnvLightBuffers) Binding 0
+                              Decorate 926(mTD2DImageOutputs) DescriptorSet 0
+                              Decorate 926(mTD2DImageOutputs) Binding 0
+                              Decorate 930(mTD2DArrayImageOutputs) DescriptorSet 0
+                              Decorate 930(mTD2DArrayImageOutputs) Binding 0
+                              Decorate 934(mTD3DImageOutputs) DescriptorSet 0
+                              Decorate 934(mTD3DImageOutputs) Binding 0
+                              Decorate 938(mTDCubeImageOutputs) DescriptorSet 0
+                              Decorate 938(mTDCubeImageOutputs) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeVector 6(float) 3
+              10:             TypePointer Function 9(fvec3)
+              11:             TypeInt 32 1
+              12:             TypePointer Function 11(int)
+              13:             TypeBool
+              14:             TypePointer Function 13(bool)
+              15:             TypeFunction 7(fvec4) 8(ptr) 10(ptr) 12(ptr) 14(ptr)
+              28:             TypeFunction 11(int)
+              33:             TypeFunction 9(fvec3)
+              38:             TypeFunction 6(float) 12(ptr)
+              44:             TypeFunction 7(fvec4) 8(ptr) 10(ptr)
+              49:             TypeFunction 7(fvec4) 10(ptr) 10(ptr)
+              54:             TypeFunction 7(fvec4) 8(ptr)
+              58:             TypeFunction 7(fvec4) 10(ptr)
+              62:             TypeFunction 7(fvec4)
+              65:             TypeFunction 9(fvec3) 12(ptr) 10(ptr)
+              70:             TypeFunction 13(bool) 12(ptr)
+              74:             TypeFunction 9(fvec3) 12(ptr) 14(ptr)
+              79:             TypeFunction 9(fvec3) 12(ptr)
+              83:             TypeMatrix 9(fvec3) 3
+              84:             TypeFunction 83 12(ptr)
+             100:             TypeMatrix 7(fvec4) 4
+             101:             TypeFunction 100 12(ptr)
+             111:             TypeFunction 7(fvec4) 12(ptr) 8(ptr)
+             131:             TypeFunction 9(fvec3) 10(ptr)
+             138:             TypeFunction 13(bool)
+             143:             TypeFunction 83
+             148:             TypeFunction 100
+             165:             TypeFunction 9(fvec3) 10(ptr) 8(ptr) 10(ptr)
+             177:             TypeFunction 7(fvec4) 12(ptr) 10(ptr)
+             203:             TypeInt 32 0
+             204:    203(int) Constant 8
+             205:             TypeArray 9(fvec3) 204
+             206:             TypePointer Input 205
+         207(uv):    206(ptr) Variable Input
+             208:     11(int) Constant 0
+             210:             TypePointer Input 9(fvec3)
+     214(Vertex):             TypeStruct 7(fvec4) 9(fvec3) 9(fvec3) 11(int) 11(int)
+             215:             TypePointer Output 214(Vertex)
+      216(oVert):    215(ptr) Variable Output
+             217:     11(int) Constant 2
+             219:             TypePointer Output 9(fvec3)
+             221:     11(int) Constant 4
+             223:             TypePointer Output 11(int)
+          226(P):    210(ptr) Variable Input
+             234:    203(int) Constant 1
+             235:             TypeArray 6(float) 234
+236(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 235 235
+             237:             TypePointer Output 236(gl_PerVertex)
+             238:    237(ptr) Variable Output
+             244:             TypePointer Output 7(fvec4)
+             248:     11(int) Constant 3
+             251:     11(int) Constant 1
+             255:             TypePointer Input 7(fvec4)
+         256(Cd):    255(ptr) Variable Input
+             265:    6(float) Constant 1073741824
+             266:    6(float) Constant 0
+             267:    7(fvec4) ConstantComposite 265 265 265 266
+   269(TDMatrix):             TypeStruct 100 100 100 100 100 100 100 100 100 100 100 100 100 83 83 83
+             270:             TypeArray 269(TDMatrix) 234
+271(TDMatricesBlock):             TypeStruct 270
+             272:             TypePointer Uniform 271(TDMatricesBlock)
+             273:    272(ptr) Variable Uniform
+             274:     11(int) Constant 8
+             275:             TypePointer Uniform 100
+             288:     11(int) Constant 6
+             296:             TypePointer Input 11(int)
+297(gl_InstanceIndex):    296(ptr) Variable Input
+299(gl_DefaultUniformBlock):             TypeStruct 11(int) 11(int) 6(float) 9(fvec3) 6(float) 9(fvec3) 7(fvec4) 7(fvec4)
+             300:             TypePointer Uniform 299(gl_DefaultUniformBlock)
+             301:    300(ptr) Variable Uniform
+             302:             TypePointer Uniform 11(int)
+             316:     11(int) Constant 1073741824
+             324:    13(bool) ConstantTrue
+             335:    6(float) Constant 1065353216
+             346:    9(fvec3) ConstantComposite 266 266 266
+             368:             TypeImage 6(float) Buffer sampled format:Unknown
+             369:             TypeSampledImage 368
+             370:             TypePointer UniformConstant 369
+371(sTDInstanceTexCoord):    370(ptr) Variable UniformConstant
+             377:    203(int) Constant 0
+             378:             TypePointer Function 6(float)
+             387:    203(int) Constant 2
+400(sTDInstanceT):    370(ptr) Variable UniformConstant
+             432:    203(int) Constant 3
+             471:             TypePointer Function 83
+             473:    9(fvec3) ConstantComposite 335 266 266
+             474:    9(fvec3) ConstantComposite 266 335 266
+             475:    9(fvec3) ConstantComposite 266 266 335
+             476:          83 ConstantComposite 473 474 475
+             485:    9(fvec3) ConstantComposite 335 335 335
+             524:    7(fvec4) ConstantComposite 266 266 266 266
+             525:         100 ConstantComposite 524 524 524 524
+             527:             TypePointer Function 100
+             529:    7(fvec4) ConstantComposite 335 266 266 266
+             530:    7(fvec4) ConstantComposite 266 335 266 266
+             531:    7(fvec4) ConstantComposite 266 266 335 266
+             532:    7(fvec4) ConstantComposite 266 266 266 335
+             533:         100 ConstantComposite 529 530 531 532
+665(sTDInstanceColor):    370(ptr) Variable UniformConstant
+             730:     11(int) Constant 13
+             731:             TypePointer Uniform 83
+896(TDCameraInfo):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) 11(int)
+             897:             TypeArray 896(TDCameraInfo) 234
+898(TDCameraInfoBlock):             TypeStruct 897
+             899:             TypePointer Uniform 898(TDCameraInfoBlock)
+             900:    899(ptr) Variable Uniform
+  901(TDGeneral):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4)
+902(TDGeneralBlock):             TypeStruct 901(TDGeneral)
+             903:             TypePointer Uniform 902(TDGeneralBlock)
+             904:    903(ptr) Variable Uniform
+          905(N):    210(ptr) Variable Input
+906(gl_VertexIndex):    296(ptr) Variable Input
+    907(TDLight):             TypeStruct 7(fvec4) 9(fvec3) 9(fvec3) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 100 100 7(fvec4) 100
+             908:             TypeArray 907(TDLight) 234
+909(TDLightBlock):             TypeStruct 908
+             910:             TypePointer Uniform 909(TDLightBlock)
+             911:    910(ptr) Variable Uniform
+ 912(TDEnvLight):             TypeStruct 9(fvec3) 83
+             913:             TypeArray 912(TDEnvLight) 234
+914(TDEnvLightBlock):             TypeStruct 913
+             915:             TypePointer Uniform 914(TDEnvLightBlock)
+             916:    915(ptr) Variable Uniform
+             917:    203(int) Constant 9
+             918:             TypeArray 9(fvec3) 917
+919(TDEnvLightBuffer):             TypeStruct 918
+             920:             TypeArray 919(TDEnvLightBuffer) 234
+             921:             TypePointer Uniform 920
+922(uTDEnvLightBuffers):    921(ptr) Variable Uniform
+             923:             TypeImage 6(float) 2D nonsampled format:Rgba8
+             924:             TypeArray 923 234
+             925:             TypePointer UniformConstant 924
+926(mTD2DImageOutputs):    925(ptr) Variable UniformConstant
+             927:             TypeImage 6(float) 2D array nonsampled format:Rgba8
+             928:             TypeArray 927 234
+             929:             TypePointer UniformConstant 928
+930(mTD2DArrayImageOutputs):    929(ptr) Variable UniformConstant
+             931:             TypeImage 6(float) 3D nonsampled format:Rgba8
+             932:             TypeArray 931 234
+             933:             TypePointer UniformConstant 932
+934(mTD3DImageOutputs):    933(ptr) Variable UniformConstant
+             935:             TypeImage 6(float) Cube nonsampled format:Rgba8
+             936:             TypeArray 935 234
+             937:             TypePointer UniformConstant 936
+938(mTDCubeImageOutputs):    937(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+   202(texcoord):     10(ptr) Variable Function
+      209(param):     10(ptr) Variable Function
+225(worldSpacePos):      8(ptr) Variable Function
+      227(param):     10(ptr) Variable Function
+230(uvUnwrapCoord):     10(ptr) Variable Function
+      232(param):     10(ptr) Variable Function
+      239(param):      8(ptr) Variable Function
+      241(param):     10(ptr) Variable Function
+246(cameraIndex):     12(ptr) Variable Function
+      257(param):      8(ptr) Variable Function
+             211:    210(ptr) AccessChain 207(uv) 208
+             212:    9(fvec3) Load 211
+                              Store 209(param) 212
+             213:    9(fvec3) FunctionCall 154(TDInstanceTexCoord(vf3;) 209(param)
+                              Store 202(texcoord) 213
+             218:    9(fvec3) Load 202(texcoord)
+             220:    219(ptr) AccessChain 216(oVert) 217
+                              Store 220 218
+             222:     11(int) FunctionCall 29(TDInstanceID()
+             224:    223(ptr) AccessChain 216(oVert) 221
+                              Store 224 222
+             228:    9(fvec3) Load 226(P)
+                              Store 227(param) 228
+             229:    7(fvec4) FunctionCall 183(TDDeform(vf3;) 227(param)
+                              Store 225(worldSpacePos) 229
+             231:    9(fvec3) FunctionCall 34(TDUVUnwrapCoord()
+                              Store 232(param) 231
+             233:    9(fvec3) FunctionCall 154(TDInstanceTexCoord(vf3;) 232(param)
+                              Store 230(uvUnwrapCoord) 233
+             240:    7(fvec4) Load 225(worldSpacePos)
+                              Store 239(param) 240
+             242:    9(fvec3) Load 230(uvUnwrapCoord)
+                              Store 241(param) 242
+             243:    7(fvec4) FunctionCall 47(TDWorldToProj(vf4;vf3;) 239(param) 241(param)
+             245:    244(ptr) AccessChain 238 208
+                              Store 245 243
+             247:     11(int) FunctionCall 31(TDCameraIndex()
+                              Store 246(cameraIndex) 247
+             249:     11(int) Load 246(cameraIndex)
+             250:    223(ptr) AccessChain 216(oVert) 248
+                              Store 250 249
+             252:    7(fvec4) Load 225(worldSpacePos)
+             253:    9(fvec3) VectorShuffle 252 252 0 1 2
+             254:    219(ptr) AccessChain 216(oVert) 251
+                              Store 254 253
+             258:    7(fvec4) Load 256(Cd)
+                              Store 257(param) 258
+             259:    7(fvec4) FunctionCall 157(TDInstanceColor(vf4;) 257(param)
+             260:    244(ptr) AccessChain 216(oVert) 208
+                              Store 260 259
+                              Return
+                              FunctionEnd
+20(iTDCamToProj(vf4;vf3;i1;b1;):    7(fvec4) Function None 15
+           16(v):      8(ptr) FunctionParameter
+          17(uv):     10(ptr) FunctionParameter
+ 18(cameraIndex):     12(ptr) FunctionParameter
+19(applyPickMod):     14(ptr) FunctionParameter
+              21:             Label
+             261:    13(bool) FunctionCall 139(TDInstanceActive()
+             262:    13(bool) LogicalNot 261
+                              SelectionMerge 264 None
+                              BranchConditional 262 263 264
+             263:               Label
+                                ReturnValue 267
+             264:             Label
+             276:    275(ptr) AccessChain 273 208 208 274
+             277:         100 Load 276
+             278:    7(fvec4) Load 16(v)
+             279:    7(fvec4) MatrixTimesVector 277 278
+                              Store 16(v) 279
+             280:    7(fvec4) Load 16(v)
+                              ReturnValue 280
+                              FunctionEnd
+26(iTDWorldToProj(vf4;vf3;i1;b1;):    7(fvec4) Function None 15
+           22(v):      8(ptr) FunctionParameter
+          23(uv):     10(ptr) FunctionParameter
+ 24(cameraIndex):     12(ptr) FunctionParameter
+25(applyPickMod):     14(ptr) FunctionParameter
+              27:             Label
+             283:    13(bool) FunctionCall 139(TDInstanceActive()
+             284:    13(bool) LogicalNot 283
+                              SelectionMerge 286 None
+                              BranchConditional 284 285 286
+             285:               Label
+                                ReturnValue 267
+             286:             Label
+             289:    275(ptr) AccessChain 273 208 208 288
+             290:         100 Load 289
+             291:    7(fvec4) Load 22(v)
+             292:    7(fvec4) MatrixTimesVector 290 291
+                              Store 22(v) 292
+             293:    7(fvec4) Load 22(v)
+                              ReturnValue 293
+                              FunctionEnd
+29(TDInstanceID():     11(int) Function None 28
+              30:             Label
+             298:     11(int) Load 297(gl_InstanceIndex)
+             303:    302(ptr) AccessChain 301 208
+             304:     11(int) Load 303
+             305:     11(int) IAdd 298 304
+                              ReturnValue 305
+                              FunctionEnd
+31(TDCameraIndex():     11(int) Function None 28
+              32:             Label
+                              ReturnValue 208
+                              FunctionEnd
+34(TDUVUnwrapCoord():    9(fvec3) Function None 33
+              35:             Label
+             310:    210(ptr) AccessChain 207(uv) 208
+             311:    9(fvec3) Load 310
+                              ReturnValue 311
+                              FunctionEnd
+   36(TDPickID():     11(int) Function None 28
+              37:             Label
+                              ReturnValue 208
+                              FunctionEnd
+40(iTDConvertPickId(i1;):    6(float) Function None 38
+          39(id):     12(ptr) FunctionParameter
+              41:             Label
+             317:     11(int) Load 39(id)
+             318:     11(int) BitwiseOr 317 316
+                              Store 39(id) 318
+             319:     11(int) Load 39(id)
+             320:    6(float) Bitcast 319
+                              ReturnValue 320
+                              FunctionEnd
+42(TDWritePickingValues():           2 Function None 3
+              43:             Label
+                              Return
+                              FunctionEnd
+47(TDWorldToProj(vf4;vf3;):    7(fvec4) Function None 44
+           45(v):      8(ptr) FunctionParameter
+          46(uv):     10(ptr) FunctionParameter
+              48:             Label
+      325(param):      8(ptr) Variable Function
+      327(param):     10(ptr) Variable Function
+      329(param):     12(ptr) Variable Function
+      330(param):     14(ptr) Variable Function
+             323:     11(int) FunctionCall 31(TDCameraIndex()
+             326:    7(fvec4) Load 45(v)
+                              Store 325(param) 326
+             328:    9(fvec3) Load 46(uv)
+                              Store 327(param) 328
+                              Store 329(param) 323
+                              Store 330(param) 324
+             331:    7(fvec4) FunctionCall 26(iTDWorldToProj(vf4;vf3;i1;b1;) 325(param) 327(param) 329(param) 330(param)
+                              ReturnValue 331
+                              FunctionEnd
+52(TDWorldToProj(vf3;vf3;):    7(fvec4) Function None 49
+           50(v):     10(ptr) FunctionParameter
+          51(uv):     10(ptr) FunctionParameter
+              53:             Label
+      340(param):      8(ptr) Variable Function
+      341(param):     10(ptr) Variable Function
+             334:    9(fvec3) Load 50(v)
+             336:    6(float) CompositeExtract 334 0
+             337:    6(float) CompositeExtract 334 1
+             338:    6(float) CompositeExtract 334 2
+             339:    7(fvec4) CompositeConstruct 336 337 338 335
+                              Store 340(param) 339
+             342:    9(fvec3) Load 51(uv)
+                              Store 341(param) 342
+             343:    7(fvec4) FunctionCall 47(TDWorldToProj(vf4;vf3;) 340(param) 341(param)
+                              ReturnValue 343
+                              FunctionEnd
+56(TDWorldToProj(vf4;):    7(fvec4) Function None 54
+           55(v):      8(ptr) FunctionParameter
+              57:             Label
+      347(param):      8(ptr) Variable Function
+      349(param):     10(ptr) Variable Function
+             348:    7(fvec4) Load 55(v)
+                              Store 347(param) 348
+                              Store 349(param) 346
+             350:    7(fvec4) FunctionCall 47(TDWorldToProj(vf4;vf3;) 347(param) 349(param)
+                              ReturnValue 350
+                              FunctionEnd
+60(TDWorldToProj(vf3;):    7(fvec4) Function None 58
+           59(v):     10(ptr) FunctionParameter
+              61:             Label
+      358(param):      8(ptr) Variable Function
+             353:    9(fvec3) Load 59(v)
+             354:    6(float) CompositeExtract 353 0
+             355:    6(float) CompositeExtract 353 1
+             356:    6(float) CompositeExtract 353 2
+             357:    7(fvec4) CompositeConstruct 354 355 356 335
+                              Store 358(param) 357
+             359:    7(fvec4) FunctionCall 56(TDWorldToProj(vf4;) 358(param)
+                              ReturnValue 359
+                              FunctionEnd
+63(TDPointColor():    7(fvec4) Function None 62
+              64:             Label
+             362:    7(fvec4) Load 256(Cd)
+                              ReturnValue 362
+                              FunctionEnd
+68(TDInstanceTexCoord(i1;vf3;):    9(fvec3) Function None 65
+       66(index):     12(ptr) FunctionParameter
+           67(t):     10(ptr) FunctionParameter
+              69:             Label
+      365(coord):     12(ptr) Variable Function
+       367(samp):      8(ptr) Variable Function
+          376(v):     10(ptr) Variable Function
+             366:     11(int) Load 66(index)
+                              Store 365(coord) 366
+             372:         369 Load 371(sTDInstanceTexCoord)
+             373:     11(int) Load 365(coord)
+             374:         368 Image 372
+             375:    7(fvec4) ImageFetch 374 373
+                              Store 367(samp) 375
+             379:    378(ptr) AccessChain 67(t) 377
+             380:    6(float) Load 379
+             381:    378(ptr) AccessChain 376(v) 377
+                              Store 381 380
+             382:    378(ptr) AccessChain 67(t) 234
+             383:    6(float) Load 382
+             384:    378(ptr) AccessChain 376(v) 234
+                              Store 384 383
+             385:    378(ptr) AccessChain 367(samp) 377
+             386:    6(float) Load 385
+             388:    378(ptr) AccessChain 376(v) 387
+                              Store 388 386
+             389:    9(fvec3) Load 376(v)
+                              Store 67(t) 389
+             390:    9(fvec3) Load 67(t)
+                              ReturnValue 390
+                              FunctionEnd
+72(TDInstanceActive(i1;):    13(bool) Function None 70
+       71(index):     12(ptr) FunctionParameter
+              73:             Label
+      397(coord):     12(ptr) Variable Function
+       399(samp):      8(ptr) Variable Function
+          405(v):    378(ptr) Variable Function
+             393:    302(ptr) AccessChain 301 208
+             394:     11(int) Load 393
+             395:     11(int) Load 71(index)
+             396:     11(int) ISub 395 394
+                              Store 71(index) 396
+             398:     11(int) Load 71(index)
+                              Store 397(coord) 398
+             401:         369 Load 400(sTDInstanceT)
+             402:     11(int) Load 397(coord)
+             403:         368 Image 401
+             404:    7(fvec4) ImageFetch 403 402
+                              Store 399(samp) 404
+             406:    378(ptr) AccessChain 399(samp) 377
+             407:    6(float) Load 406
+                              Store 405(v) 407
+             408:    6(float) Load 405(v)
+             409:    13(bool) FUnordNotEqual 408 266
+                              ReturnValue 409
+                              FunctionEnd
+77(iTDInstanceTranslate(i1;b1;):    9(fvec3) Function None 74
+       75(index):     12(ptr) FunctionParameter
+76(instanceActive):     14(ptr) FunctionParameter
+              78:             Label
+  412(origIndex):     12(ptr) Variable Function
+      418(coord):     12(ptr) Variable Function
+       420(samp):      8(ptr) Variable Function
+          425(v):     10(ptr) Variable Function
+             413:     11(int) Load 75(index)
+                              Store 412(origIndex) 413
+             414:    302(ptr) AccessChain 301 208
+             415:     11(int) Load 414
+             416:     11(int) Load 75(index)
+             417:     11(int) ISub 416 415
+                              Store 75(index) 417
+             419:     11(int) Load 75(index)
+                              Store 418(coord) 419
+             421:         369 Load 400(sTDInstanceT)
+             422:     11(int) Load 418(coord)
+             423:         368 Image 421
+             424:    7(fvec4) ImageFetch 423 422
+                              Store 420(samp) 424
+             426:    378(ptr) AccessChain 420(samp) 234
+             427:    6(float) Load 426
+             428:    378(ptr) AccessChain 425(v) 377
+                              Store 428 427
+             429:    378(ptr) AccessChain 420(samp) 387
+             430:    6(float) Load 429
+             431:    378(ptr) AccessChain 425(v) 234
+                              Store 431 430
+             433:    378(ptr) AccessChain 420(samp) 432
+             434:    6(float) Load 433
+             435:    378(ptr) AccessChain 425(v) 387
+                              Store 435 434
+             436:    378(ptr) AccessChain 420(samp) 377
+             437:    6(float) Load 436
+             438:    13(bool) FUnordNotEqual 437 266
+                              Store 76(instanceActive) 438
+             439:    9(fvec3) Load 425(v)
+                              ReturnValue 439
+                              FunctionEnd
+81(TDInstanceTranslate(i1;):    9(fvec3) Function None 79
+       80(index):     12(ptr) FunctionParameter
+              82:             Label
+      446(coord):     12(ptr) Variable Function
+       448(samp):      8(ptr) Variable Function
+          453(v):     10(ptr) Variable Function
+             442:    302(ptr) AccessChain 301 208
+             443:     11(int) Load 442
+             444:     11(int) Load 80(index)
+             445:     11(int) ISub 444 443
+                              Store 80(index) 445
+             447:     11(int) Load 80(index)
+                              Store 446(coord) 447
+             449:         369 Load 400(sTDInstanceT)
+             450:     11(int) Load 446(coord)
+             451:         368 Image 449
+             452:    7(fvec4) ImageFetch 451 450
+                              Store 448(samp) 452
+             454:    378(ptr) AccessChain 448(samp) 234
+             455:    6(float) Load 454
+             456:    378(ptr) AccessChain 453(v) 377
+                              Store 456 455
+             457:    378(ptr) AccessChain 448(samp) 387
+             458:    6(float) Load 457
+             459:    378(ptr) AccessChain 453(v) 234
+                              Store 459 458
+             460:    378(ptr) AccessChain 448(samp) 432
+             461:    6(float) Load 460
+             462:    378(ptr) AccessChain 453(v) 387
+                              Store 462 461
+             463:    9(fvec3) Load 453(v)
+                              ReturnValue 463
+                              FunctionEnd
+86(TDInstanceRotateMat(i1;):          83 Function None 84
+       85(index):     12(ptr) FunctionParameter
+              87:             Label
+          470(v):     10(ptr) Variable Function
+          472(m):    471(ptr) Variable Function
+             466:    302(ptr) AccessChain 301 208
+             467:     11(int) Load 466
+             468:     11(int) Load 85(index)
+             469:     11(int) ISub 468 467
+                              Store 85(index) 469
+                              Store 470(v) 346
+                              Store 472(m) 476
+             477:          83 Load 472(m)
+                              ReturnValue 477
+                              FunctionEnd
+89(TDInstanceScale(i1;):    9(fvec3) Function None 79
+       88(index):     12(ptr) FunctionParameter
+              90:             Label
+          484(v):     10(ptr) Variable Function
+             480:    302(ptr) AccessChain 301 208
+             481:     11(int) Load 480
+             482:     11(int) Load 88(index)
+             483:     11(int) ISub 482 481
+                              Store 88(index) 483
+                              Store 484(v) 485
+             486:    9(fvec3) Load 484(v)
+                              ReturnValue 486
+                              FunctionEnd
+92(TDInstancePivot(i1;):    9(fvec3) Function None 79
+       91(index):     12(ptr) FunctionParameter
+              93:             Label
+          493(v):     10(ptr) Variable Function
+             489:    302(ptr) AccessChain 301 208
+             490:     11(int) Load 489
+             491:     11(int) Load 91(index)
+             492:     11(int) ISub 491 490
+                              Store 91(index) 492
+                              Store 493(v) 346
+             494:    9(fvec3) Load 493(v)
+                              ReturnValue 494
+                              FunctionEnd
+95(TDInstanceRotTo(i1;):    9(fvec3) Function None 79
+       94(index):     12(ptr) FunctionParameter
+              96:             Label
+          501(v):     10(ptr) Variable Function
+             497:    302(ptr) AccessChain 301 208
+             498:     11(int) Load 497
+             499:     11(int) Load 94(index)
+             500:     11(int) ISub 499 498
+                              Store 94(index) 500
+                              Store 501(v) 475
+             502:    9(fvec3) Load 501(v)
+                              ReturnValue 502
+                              FunctionEnd
+98(TDInstanceRotUp(i1;):    9(fvec3) Function None 79
+       97(index):     12(ptr) FunctionParameter
+              99:             Label
+          509(v):     10(ptr) Variable Function
+             505:    302(ptr) AccessChain 301 208
+             506:     11(int) Load 505
+             507:     11(int) Load 97(index)
+             508:     11(int) ISub 507 506
+                              Store 97(index) 508
+                              Store 509(v) 474
+             510:    9(fvec3) Load 509(v)
+                              ReturnValue 510
+                              FunctionEnd
+103(TDInstanceMat(i1;):         100 Function None 101
+         102(id):     12(ptr) FunctionParameter
+             104:             Label
+513(instanceActive):     14(ptr) Variable Function
+          514(t):     10(ptr) Variable Function
+      515(param):     12(ptr) Variable Function
+      517(param):     14(ptr) Variable Function
+          528(m):    527(ptr) Variable Function
+         534(tt):     10(ptr) Variable Function
+                              Store 513(instanceActive) 324
+             516:     11(int) Load 102(id)
+                              Store 515(param) 516
+             518:    9(fvec3) FunctionCall 77(iTDInstanceTranslate(i1;b1;) 515(param) 517(param)
+             519:    13(bool) Load 517(param)
+                              Store 513(instanceActive) 519
+                              Store 514(t) 518
+             520:    13(bool) Load 513(instanceActive)
+             521:    13(bool) LogicalNot 520
+                              SelectionMerge 523 None
+                              BranchConditional 521 522 523
+             522:               Label
+                                ReturnValue 525
+             523:             Label
+                              Store 528(m) 533
+             535:    9(fvec3) Load 514(t)
+                              Store 534(tt) 535
+             536:    378(ptr) AccessChain 528(m) 208 377
+             537:    6(float) Load 536
+             538:    378(ptr) AccessChain 534(tt) 377
+             539:    6(float) Load 538
+             540:    6(float) FMul 537 539
+             541:    378(ptr) AccessChain 528(m) 248 377
+             542:    6(float) Load 541
+             543:    6(float) FAdd 542 540
+             544:    378(ptr) AccessChain 528(m) 248 377
+                              Store 544 543
+             545:    378(ptr) AccessChain 528(m) 208 234
+             546:    6(float) Load 545
+             547:    378(ptr) AccessChain 534(tt) 377
+             548:    6(float) Load 547
+             549:    6(float) FMul 546 548
+             550:    378(ptr) AccessChain 528(m) 248 234
+             551:    6(float) Load 550
+             552:    6(float) FAdd 551 549
+             553:    378(ptr) AccessChain 528(m) 248 234
+                              Store 553 552
+             554:    378(ptr) AccessChain 528(m) 208 387
+             555:    6(float) Load 554
+             556:    378(ptr) AccessChain 534(tt) 377
+             557:    6(float) Load 556
+             558:    6(float) FMul 555 557
+             559:    378(ptr) AccessChain 528(m) 248 387
+             560:    6(float) Load 559
+             561:    6(float) FAdd 560 558
+             562:    378(ptr) AccessChain 528(m) 248 387
+                              Store 562 561
+             563:    378(ptr) AccessChain 528(m) 208 432
+             564:    6(float) Load 563
+             565:    378(ptr) AccessChain 534(tt) 377
+             566:    6(float) Load 565
+             567:    6(float) FMul 564 566
+             568:    378(ptr) AccessChain 528(m) 248 432
+             569:    6(float) Load 568
+             570:    6(float) FAdd 569 567
+             571:    378(ptr) AccessChain 528(m) 248 432
+                              Store 571 570
+             572:    378(ptr) AccessChain 528(m) 251 377
+             573:    6(float) Load 572
+             574:    378(ptr) AccessChain 534(tt) 234
+             575:    6(float) Load 574
+             576:    6(float) FMul 573 575
+             577:    378(ptr) AccessChain 528(m) 248 377
+             578:    6(float) Load 577
+             579:    6(float) FAdd 578 576
+             580:    378(ptr) AccessChain 528(m) 248 377
+                              Store 580 579
+             581:    378(ptr) AccessChain 528(m) 251 234
+             582:    6(float) Load 581
+             583:    378(ptr) AccessChain 534(tt) 234
+             584:    6(float) Load 583
+             585:    6(float) FMul 582 584
+             586:    378(ptr) AccessChain 528(m) 248 234
+             587:    6(float) Load 586
+             588:    6(float) FAdd 587 585
+             589:    378(ptr) AccessChain 528(m) 248 234
+                              Store 589 588
+             590:    378(ptr) AccessChain 528(m) 251 387
+             591:    6(float) Load 590
+             592:    378(ptr) AccessChain 534(tt) 234
+             593:    6(float) Load 592
+             594:    6(float) FMul 591 593
+             595:    378(ptr) AccessChain 528(m) 248 387
+             596:    6(float) Load 595
+             597:    6(float) FAdd 596 594
+             598:    378(ptr) AccessChain 528(m) 248 387
+                              Store 598 597
+             599:    378(ptr) AccessChain 528(m) 251 432
+             600:    6(float) Load 599
+             601:    378(ptr) AccessChain 534(tt) 234
+             602:    6(float) Load 601
+             603:    6(float) FMul 600 602
+             604:    378(ptr) AccessChain 528(m) 248 432
+             605:    6(float) Load 604
+             606:    6(float) FAdd 605 603
+             607:    378(ptr) AccessChain 528(m) 248 432
+                              Store 607 606
+             608:    378(ptr) AccessChain 528(m) 217 377
+             609:    6(float) Load 608
+             610:    378(ptr) AccessChain 534(tt) 387
+             611:    6(float) Load 610
+             612:    6(float) FMul 609 611
+             613:    378(ptr) AccessChain 528(m) 248 377
+             614:    6(float) Load 613
+             615:    6(float) FAdd 614 612
+             616:    378(ptr) AccessChain 528(m) 248 377
+                              Store 616 615
+             617:    378(ptr) AccessChain 528(m) 217 234
+             618:    6(float) Load 617
+             619:    378(ptr) AccessChain 534(tt) 387
+             620:    6(float) Load 619
+             621:    6(float) FMul 618 620
+             622:    378(ptr) AccessChain 528(m) 248 234
+             623:    6(float) Load 622
+             624:    6(float) FAdd 623 621
+             625:    378(ptr) AccessChain 528(m) 248 234
+                              Store 625 624
+             626:    378(ptr) AccessChain 528(m) 217 387
+             627:    6(float) Load 626
+             628:    378(ptr) AccessChain 534(tt) 387
+             629:    6(float) Load 628
+             630:    6(float) FMul 627 629
+             631:    378(ptr) AccessChain 528(m) 248 387
+             632:    6(float) Load 631
+             633:    6(float) FAdd 632 630
+             634:    378(ptr) AccessChain 528(m) 248 387
+                              Store 634 633
+             635:    378(ptr) AccessChain 528(m) 217 432
+             636:    6(float) Load 635
+             637:    378(ptr) AccessChain 534(tt) 387
+             638:    6(float) Load 637
+             639:    6(float) FMul 636 638
+             640:    378(ptr) AccessChain 528(m) 248 432
+             641:    6(float) Load 640
+             642:    6(float) FAdd 641 639
+             643:    378(ptr) AccessChain 528(m) 248 432
+                              Store 643 642
+             644:         100 Load 528(m)
+                              ReturnValue 644
+                              FunctionEnd
+106(TDInstanceMat3(i1;):          83 Function None 84
+         105(id):     12(ptr) FunctionParameter
+             107:             Label
+          647(m):    471(ptr) Variable Function
+                              Store 647(m) 476
+             648:          83 Load 647(m)
+                              ReturnValue 648
+                              FunctionEnd
+109(TDInstanceMat3ForNorm(i1;):          83 Function None 84
+         108(id):     12(ptr) FunctionParameter
+             110:             Label
+          651(m):    471(ptr) Variable Function
+      652(param):     12(ptr) Variable Function
+             653:     11(int) Load 108(id)
+                              Store 652(param) 653
+             654:          83 FunctionCall 106(TDInstanceMat3(i1;) 652(param)
+                              Store 651(m) 654
+             655:          83 Load 651(m)
+                              ReturnValue 655
+                              FunctionEnd
+114(TDInstanceColor(i1;vf4;):    7(fvec4) Function None 111
+      112(index):     12(ptr) FunctionParameter
+   113(curColor):      8(ptr) FunctionParameter
+             115:             Label
+      662(coord):     12(ptr) Variable Function
+       664(samp):      8(ptr) Variable Function
+          670(v):      8(ptr) Variable Function
+             658:    302(ptr) AccessChain 301 208
+             659:     11(int) Load 658
+             660:     11(int) Load 112(index)
+             661:     11(int) ISub 660 659
+                              Store 112(index) 661
+             663:     11(int) Load 112(index)
+                              Store 662(coord) 663
+             666:         369 Load 665(sTDInstanceColor)
+             667:     11(int) Load 662(coord)
+             668:         368 Image 666
+             669:    7(fvec4) ImageFetch 668 667
+                              Store 664(samp) 669
+             671:    378(ptr) AccessChain 664(samp) 377
+             672:    6(float) Load 671
+             673:    378(ptr) AccessChain 670(v) 377
+                              Store 673 672
+             674:    378(ptr) AccessChain 664(samp) 234
+             675:    6(float) Load 674
+             676:    378(ptr) AccessChain 670(v) 234
+                              Store 676 675
+             677:    378(ptr) AccessChain 664(samp) 387
+             678:    6(float) Load 677
+             679:    378(ptr) AccessChain 670(v) 387
+                              Store 679 678
+             680:    378(ptr) AccessChain 670(v) 432
+                              Store 680 335
+             681:    378(ptr) AccessChain 670(v) 377
+             682:    6(float) Load 681
+             683:    378(ptr) AccessChain 113(curColor) 377
+                              Store 683 682
+             684:    378(ptr) AccessChain 670(v) 234
+             685:    6(float) Load 684
+             686:    378(ptr) AccessChain 113(curColor) 234
+                              Store 686 685
+             687:    378(ptr) AccessChain 670(v) 387
+             688:    6(float) Load 687
+             689:    378(ptr) AccessChain 113(curColor) 387
+                              Store 689 688
+             690:    7(fvec4) Load 113(curColor)
+                              ReturnValue 690
+                              FunctionEnd
+118(TDInstanceDeform(i1;vf4;):    7(fvec4) Function None 111
+         116(id):     12(ptr) FunctionParameter
+        117(pos):      8(ptr) FunctionParameter
+             119:             Label
+      693(param):     12(ptr) Variable Function
+             694:     11(int) Load 116(id)
+                              Store 693(param) 694
+             695:         100 FunctionCall 103(TDInstanceMat(i1;) 693(param)
+             696:    7(fvec4) Load 117(pos)
+             697:    7(fvec4) MatrixTimesVector 695 696
+                              Store 117(pos) 697
+             698:     11(int) FunctionCall 31(TDCameraIndex()
+             699:    275(ptr) AccessChain 273 208 698 208
+             700:         100 Load 699
+             701:    7(fvec4) Load 117(pos)
+             702:    7(fvec4) MatrixTimesVector 700 701
+                              ReturnValue 702
+                              FunctionEnd
+122(TDInstanceDeformVec(i1;vf3;):    9(fvec3) Function None 65
+         120(id):     12(ptr) FunctionParameter
+        121(vec):     10(ptr) FunctionParameter
+             123:             Label
+          705(m):    471(ptr) Variable Function
+      706(param):     12(ptr) Variable Function
+             707:     11(int) Load 120(id)
+                              Store 706(param) 707
+             708:          83 FunctionCall 106(TDInstanceMat3(i1;) 706(param)
+                              Store 705(m) 708
+             709:     11(int) FunctionCall 31(TDCameraIndex()
+             710:    275(ptr) AccessChain 273 208 709 208
+             711:         100 Load 710
+             712:    7(fvec4) CompositeExtract 711 0
+             713:    9(fvec3) VectorShuffle 712 712 0 1 2
+             714:    7(fvec4) CompositeExtract 711 1
+             715:    9(fvec3) VectorShuffle 714 714 0 1 2
+             716:    7(fvec4) CompositeExtract 711 2
+             717:    9(fvec3) VectorShuffle 716 716 0 1 2
+             718:          83 CompositeConstruct 713 715 717
+             719:          83 Load 705(m)
+             720:    9(fvec3) Load 121(vec)
+             721:    9(fvec3) MatrixTimesVector 719 720
+             722:    9(fvec3) MatrixTimesVector 718 721
+                              ReturnValue 722
+                              FunctionEnd
+126(TDInstanceDeformNorm(i1;vf3;):    9(fvec3) Function None 65
+         124(id):     12(ptr) FunctionParameter
+        125(vec):     10(ptr) FunctionParameter
+             127:             Label
+          725(m):    471(ptr) Variable Function
+      726(param):     12(ptr) Variable Function
+             727:     11(int) Load 124(id)
+                              Store 726(param) 727
+             728:          83 FunctionCall 109(TDInstanceMat3ForNorm(i1;) 726(param)
+                              Store 725(m) 728
+             729:     11(int) FunctionCall 31(TDCameraIndex()
+             732:    731(ptr) AccessChain 273 208 729 730
+             733:          83 Load 732
+             734:    9(fvec3) CompositeExtract 733 0
+             735:    9(fvec3) CompositeExtract 733 1
+             736:    9(fvec3) CompositeExtract 733 2
+             737:          83 CompositeConstruct 734 735 736
+             738:          83 Load 725(m)
+             739:    9(fvec3) Load 125(vec)
+             740:    9(fvec3) MatrixTimesVector 738 739
+             741:    9(fvec3) MatrixTimesVector 737 740
+                              ReturnValue 741
+                              FunctionEnd
+129(TDInstanceDeform(vf4;):    7(fvec4) Function None 54
+        128(pos):      8(ptr) FunctionParameter
+             130:             Label
+      745(param):     12(ptr) Variable Function
+      746(param):      8(ptr) Variable Function
+             744:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 745(param) 744
+             747:    7(fvec4) Load 128(pos)
+                              Store 746(param) 747
+             748:    7(fvec4) FunctionCall 118(TDInstanceDeform(i1;vf4;) 745(param) 746(param)
+                              ReturnValue 748
+                              FunctionEnd
+133(TDInstanceDeformVec(vf3;):    9(fvec3) Function None 131
+        132(vec):     10(ptr) FunctionParameter
+             134:             Label
+      752(param):     12(ptr) Variable Function
+      753(param):     10(ptr) Variable Function
+             751:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 752(param) 751
+             754:    9(fvec3) Load 132(vec)
+                              Store 753(param) 754
+             755:    9(fvec3) FunctionCall 122(TDInstanceDeformVec(i1;vf3;) 752(param) 753(param)
+                              ReturnValue 755
+                              FunctionEnd
+136(TDInstanceDeformNorm(vf3;):    9(fvec3) Function None 131
+        135(vec):     10(ptr) FunctionParameter
+             137:             Label
+      759(param):     12(ptr) Variable Function
+      760(param):     10(ptr) Variable Function
+             758:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 759(param) 758
+             761:    9(fvec3) Load 135(vec)
+                              Store 760(param) 761
+             762:    9(fvec3) FunctionCall 126(TDInstanceDeformNorm(i1;vf3;) 759(param) 760(param)
+                              ReturnValue 762
+                              FunctionEnd
+139(TDInstanceActive():    13(bool) Function None 138
+             140:             Label
+      766(param):     12(ptr) Variable Function
+             765:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 766(param) 765
+             767:    13(bool) FunctionCall 72(TDInstanceActive(i1;) 766(param)
+                              ReturnValue 767
+                              FunctionEnd
+141(TDInstanceTranslate():    9(fvec3) Function None 33
+             142:             Label
+      771(param):     12(ptr) Variable Function
+             770:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 771(param) 770
+             772:    9(fvec3) FunctionCall 81(TDInstanceTranslate(i1;) 771(param)
+                              ReturnValue 772
+                              FunctionEnd
+144(TDInstanceRotateMat():          83 Function None 143
+             145:             Label
+      776(param):     12(ptr) Variable Function
+             775:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 776(param) 775
+             777:          83 FunctionCall 86(TDInstanceRotateMat(i1;) 776(param)
+                              ReturnValue 777
+                              FunctionEnd
+146(TDInstanceScale():    9(fvec3) Function None 33
+             147:             Label
+      781(param):     12(ptr) Variable Function
+             780:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 781(param) 780
+             782:    9(fvec3) FunctionCall 89(TDInstanceScale(i1;) 781(param)
+                              ReturnValue 782
+                              FunctionEnd
+149(TDInstanceMat():         100 Function None 148
+             150:             Label
+      786(param):     12(ptr) Variable Function
+             785:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 786(param) 785
+             787:         100 FunctionCall 103(TDInstanceMat(i1;) 786(param)
+                              ReturnValue 787
+                              FunctionEnd
+151(TDInstanceMat3():          83 Function None 143
+             152:             Label
+      791(param):     12(ptr) Variable Function
+             790:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 791(param) 790
+             792:          83 FunctionCall 106(TDInstanceMat3(i1;) 791(param)
+                              ReturnValue 792
+                              FunctionEnd
+154(TDInstanceTexCoord(vf3;):    9(fvec3) Function None 131
+          153(t):     10(ptr) FunctionParameter
+             155:             Label
+      796(param):     12(ptr) Variable Function
+      797(param):     10(ptr) Variable Function
+             795:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 796(param) 795
+             798:    9(fvec3) Load 153(t)
+                              Store 797(param) 798
+             799:    9(fvec3) FunctionCall 68(TDInstanceTexCoord(i1;vf3;) 796(param) 797(param)
+                              ReturnValue 799
+                              FunctionEnd
+157(TDInstanceColor(vf4;):    7(fvec4) Function None 54
+   156(curColor):      8(ptr) FunctionParameter
+             158:             Label
+      803(param):     12(ptr) Variable Function
+      804(param):      8(ptr) Variable Function
+             802:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 803(param) 802
+             805:    7(fvec4) Load 156(curColor)
+                              Store 804(param) 805
+             806:    7(fvec4) FunctionCall 114(TDInstanceColor(i1;vf4;) 803(param) 804(param)
+                              ReturnValue 806
+                              FunctionEnd
+160(TDSkinnedDeform(vf4;):    7(fvec4) Function None 54
+        159(pos):      8(ptr) FunctionParameter
+             161:             Label
+             809:    7(fvec4) Load 159(pos)
+                              ReturnValue 809
+                              FunctionEnd
+163(TDSkinnedDeformVec(vf3;):    9(fvec3) Function None 131
+        162(vec):     10(ptr) FunctionParameter
+             164:             Label
+             812:    9(fvec3) Load 162(vec)
+                              ReturnValue 812
+                              FunctionEnd
+169(TDFastDeformTangent(vf3;vf4;vf3;):    9(fvec3) Function None 165
+    166(oldNorm):     10(ptr) FunctionParameter
+ 167(oldTangent):      8(ptr) FunctionParameter
+168(deformedNorm):     10(ptr) FunctionParameter
+             170:             Label
+             815:    7(fvec4) Load 167(oldTangent)
+             816:    9(fvec3) VectorShuffle 815 815 0 1 2
+                              ReturnValue 816
+                              FunctionEnd
+172(TDBoneMat(i1;):         100 Function None 101
+      171(index):     12(ptr) FunctionParameter
+             173:             Label
+                              ReturnValue 533
+                              FunctionEnd
+175(TDDeform(vf4;):    7(fvec4) Function None 54
+        174(pos):      8(ptr) FunctionParameter
+             176:             Label
+      821(param):      8(ptr) Variable Function
+      824(param):      8(ptr) Variable Function
+             822:    7(fvec4) Load 174(pos)
+                              Store 821(param) 822
+             823:    7(fvec4) FunctionCall 160(TDSkinnedDeform(vf4;) 821(param)
+                              Store 174(pos) 823
+             825:    7(fvec4) Load 174(pos)
+                              Store 824(param) 825
+             826:    7(fvec4) FunctionCall 129(TDInstanceDeform(vf4;) 824(param)
+                              Store 174(pos) 826
+             827:    7(fvec4) Load 174(pos)
+                              ReturnValue 827
+                              FunctionEnd
+180(TDDeform(i1;vf3;):    7(fvec4) Function None 177
+ 178(instanceID):     12(ptr) FunctionParameter
+          179(p):     10(ptr) FunctionParameter
+             181:             Label
+        830(pos):      8(ptr) Variable Function
+      836(param):      8(ptr) Variable Function
+      839(param):     12(ptr) Variable Function
+      841(param):      8(ptr) Variable Function
+             831:    9(fvec3) Load 179(p)
+             832:    6(float) CompositeExtract 831 0
+             833:    6(float) CompositeExtract 831 1
+             834:    6(float) CompositeExtract 831 2
+             835:    7(fvec4) CompositeConstruct 832 833 834 335
+                              Store 830(pos) 835
+             837:    7(fvec4) Load 830(pos)
+                              Store 836(param) 837
+             838:    7(fvec4) FunctionCall 160(TDSkinnedDeform(vf4;) 836(param)
+                              Store 830(pos) 838
+             840:     11(int) Load 178(instanceID)
+                              Store 839(param) 840
+             842:    7(fvec4) Load 830(pos)
+                              Store 841(param) 842
+             843:    7(fvec4) FunctionCall 118(TDInstanceDeform(i1;vf4;) 839(param) 841(param)
+                              Store 830(pos) 843
+             844:    7(fvec4) Load 830(pos)
+                              ReturnValue 844
+                              FunctionEnd
+183(TDDeform(vf3;):    7(fvec4) Function None 58
+        182(pos):     10(ptr) FunctionParameter
+             184:             Label
+      848(param):     12(ptr) Variable Function
+      849(param):     10(ptr) Variable Function
+             847:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 848(param) 847
+             850:    9(fvec3) Load 182(pos)
+                              Store 849(param) 850
+             851:    7(fvec4) FunctionCall 180(TDDeform(i1;vf3;) 848(param) 849(param)
+                              ReturnValue 851
+                              FunctionEnd
+187(TDDeformVec(i1;vf3;):    9(fvec3) Function None 65
+ 185(instanceID):     12(ptr) FunctionParameter
+        186(vec):     10(ptr) FunctionParameter
+             188:             Label
+      854(param):     10(ptr) Variable Function
+      857(param):     12(ptr) Variable Function
+      859(param):     10(ptr) Variable Function
+             855:    9(fvec3) Load 186(vec)
+                              Store 854(param) 855
+             856:    9(fvec3) FunctionCall 163(TDSkinnedDeformVec(vf3;) 854(param)
+                              Store 186(vec) 856
+             858:     11(int) Load 185(instanceID)
+                              Store 857(param) 858
+             860:    9(fvec3) Load 186(vec)
+                              Store 859(param) 860
+             861:    9(fvec3) FunctionCall 122(TDInstanceDeformVec(i1;vf3;) 857(param) 859(param)
+                              Store 186(vec) 861
+             862:    9(fvec3) Load 186(vec)
+                              ReturnValue 862
+                              FunctionEnd
+190(TDDeformVec(vf3;):    9(fvec3) Function None 131
+        189(vec):     10(ptr) FunctionParameter
+             191:             Label
+      866(param):     12(ptr) Variable Function
+      867(param):     10(ptr) Variable Function
+             865:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 866(param) 865
+             868:    9(fvec3) Load 189(vec)
+                              Store 867(param) 868
+             869:    9(fvec3) FunctionCall 187(TDDeformVec(i1;vf3;) 866(param) 867(param)
+                              ReturnValue 869
+                              FunctionEnd
+194(TDDeformNorm(i1;vf3;):    9(fvec3) Function None 65
+ 192(instanceID):     12(ptr) FunctionParameter
+        193(vec):     10(ptr) FunctionParameter
+             195:             Label
+      872(param):     10(ptr) Variable Function
+      875(param):     12(ptr) Variable Function
+      877(param):     10(ptr) Variable Function
+             873:    9(fvec3) Load 193(vec)
+                              Store 872(param) 873
+             874:    9(fvec3) FunctionCall 163(TDSkinnedDeformVec(vf3;) 872(param)
+                              Store 193(vec) 874
+             876:     11(int) Load 192(instanceID)
+                              Store 875(param) 876
+             878:    9(fvec3) Load 193(vec)
+                              Store 877(param) 878
+             879:    9(fvec3) FunctionCall 126(TDInstanceDeformNorm(i1;vf3;) 875(param) 877(param)
+                              Store 193(vec) 879
+             880:    9(fvec3) Load 193(vec)
+                              ReturnValue 880
+                              FunctionEnd
+197(TDDeformNorm(vf3;):    9(fvec3) Function None 131
+        196(vec):     10(ptr) FunctionParameter
+             198:             Label
+      884(param):     12(ptr) Variable Function
+      885(param):     10(ptr) Variable Function
+             883:     11(int) FunctionCall 29(TDInstanceID()
+                              Store 884(param) 883
+             886:    9(fvec3) Load 196(vec)
+                              Store 885(param) 886
+             887:    9(fvec3) FunctionCall 194(TDDeformNorm(i1;vf3;) 884(param) 885(param)
+                              ReturnValue 887
+                              FunctionEnd
+200(TDSkinnedDeformNorm(vf3;):    9(fvec3) Function None 131
+        199(vec):     10(ptr) FunctionParameter
+             201:             Label
+      890(param):     10(ptr) Variable Function
+             891:    9(fvec3) Load 199(vec)
+                              Store 890(param) 891
+             892:    9(fvec3) FunctionCall 163(TDSkinnedDeformVec(vf3;) 890(param)
+                              Store 199(vec) 892
+             893:    9(fvec3) Load 199(vec)
+                              ReturnValue 893
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 1297
+
+                              Capability Shader
+                              Capability Sampled1D
+                              Capability SampledBuffer
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 336 429 458 485
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 11  "TDColor(vf4;"
+                              Name 10  "color"
+                              Name 13  "TDCheckOrderIndTrans("
+                              Name 15  "TDCheckDiscard("
+                              Name 18  "TDDither(vf4;"
+                              Name 17  "color"
+                              Name 26  "TDFrontFacing(vf3;vf3;"
+                              Name 24  "pos"
+                              Name 25  "normal"
+                              Name 34  "TDAttenuateLight(i1;f1;"
+                              Name 32  "index"
+                              Name 33  "lightDist"
+                              Name 38  "TDAlphaTest(f1;"
+                              Name 37  "alpha"
+                              Name 43  "TDHardShadow(i1;vf3;"
+                              Name 41  "lightIndex"
+                              Name 42  "worldSpacePos"
+                              Name 50  "TDSoftShadow(i1;vf3;i1;i1;"
+                              Name 46  "lightIndex"
+                              Name 47  "worldSpacePos"
+                              Name 48  "samples"
+                              Name 49  "steps"
+                              Name 54  "TDSoftShadow(i1;vf3;"
+                              Name 52  "lightIndex"
+                              Name 53  "worldSpacePos"
+                              Name 58  "TDShadow(i1;vf3;"
+                              Name 56  "lightIndex"
+                              Name 57  "worldSpacePos"
+                              Name 64  "iTDRadicalInverse_VdC(u1;"
+                              Name 63  "bits"
+                              Name 70  "iTDHammersley(u1;u1;"
+                              Name 68  "i"
+                              Name 69  "N"
+                              Name 77  "iTDImportanceSampleGGX(vf2;f1;vf3;"
+                              Name 74  "Xi"
+                              Name 75  "roughness2"
+                              Name 76  "N"
+                              Name 83  "iTDDistributionGGX(vf3;vf3;f1;"
+                              Name 80  "normal"
+                              Name 81  "half_vector"
+                              Name 82  "roughness2"
+                              Name 88  "iTDCalcF(vf3;f1;"
+                              Name 86  "F0"
+                              Name 87  "VdotH"
+                              Name 94  "iTDCalcG(f1;f1;f1;"
+                              Name 91  "NdotL"
+                              Name 92  "NdotV"
+                              Name 93  "k"
+                              Name 96  "TDPBRResult"
+                              MemberName 96(TDPBRResult) 0  "diffuse"
+                              MemberName 96(TDPBRResult) 1  "specular"
+                              MemberName 96(TDPBRResult) 2  "shadowStrength"
+                              Name 107  "TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;"
+                              Name 98  "index"
+                              Name 99  "diffuseColor"
+                              Name 100  "specularColor"
+                              Name 101  "worldSpacePos"
+                              Name 102  "normal"
+                              Name 103  "shadowStrength"
+                              Name 104  "shadowColor"
+                              Name 105  "camVector"
+                              Name 106  "roughness"
+                              Name 122  "TDLightingPBR(vf3;vf3;f1;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;"
+                              Name 110  "diffuseContrib"
+                              Name 111  "specularContrib"
+                              Name 112  "shadowStrengthOut"
+                              Name 113  "index"
+                              Name 114  "diffuseColor"
+                              Name 115  "specularColor"
+                              Name 116  "worldSpacePos"
+                              Name 117  "normal"
+                              Name 118  "shadowStrength"
+                              Name 119  "shadowColor"
+                              Name 120  "camVector"
+                              Name 121  "roughness"
+                              Name 136  "TDLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;"
+                              Name 125  "diffuseContrib"
+                              Name 126  "specularContrib"
+                              Name 127  "index"
+                              Name 128  "diffuseColor"
+                              Name 129  "specularColor"
+                              Name 130  "worldSpacePos"
+                              Name 131  "normal"
+                              Name 132  "shadowStrength"
+                              Name 133  "shadowColor"
+                              Name 134  "camVector"
+                              Name 135  "roughness"
+                              Name 146  "TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1;"
+                              Name 139  "index"
+                              Name 140  "diffuseColor"
+                              Name 141  "specularColor"
+                              Name 142  "normal"
+                              Name 143  "camVector"
+                              Name 144  "roughness"
+                              Name 145  "ambientOcclusion"
+                              Name 158  "TDEnvLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;f1;"
+                              Name 149  "diffuseContrib"
+                              Name 150  "specularContrib"
+                              Name 151  "index"
+                              Name 152  "diffuseColor"
+                              Name 153  "specularColor"
+                              Name 154  "normal"
+                              Name 155  "camVector"
+                              Name 156  "roughness"
+                              Name 157  "ambientOcclusion"
+                              Name 160  "TDPhongResult"
+                              MemberName 160(TDPhongResult) 0  "diffuse"
+                              MemberName 160(TDPhongResult) 1  "specular"
+                              MemberName 160(TDPhongResult) 2  "specular2"
+                              MemberName 160(TDPhongResult) 3  "shadowStrength"
+                              Name 170  "TDLighting(i1;vf3;vf3;f1;vf3;vf3;f1;f1;"
+                              Name 162  "index"
+                              Name 163  "worldSpacePos"
+                              Name 164  "normal"
+                              Name 165  "shadowStrength"
+                              Name 166  "shadowColor"
+                              Name 167  "camVector"
+                              Name 168  "shininess"
+                              Name 169  "shininess2"
+                              Name 185  "TDLighting(vf3;vf3;vf3;f1;i1;vf3;vf3;f1;vf3;vf3;f1;f1;"
+                              Name 173  "diffuseContrib"
+                              Name 174  "specularContrib"
+                              Name 175  "specularContrib2"
+                              Name 176  "shadowStrengthOut"
+                              Name 177  "index"
+                              Name 178  "worldSpacePos"
+                              Name 179  "normal"
+                              Name 180  "shadowStrength"
+                              Name 181  "shadowColor"
+                              Name 182  "camVector"
+                              Name 183  "shininess"
+                              Name 184  "shininess2"
+                              Name 199  "TDLighting(vf3;vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1;f1;"
+                              Name 188  "diffuseContrib"
+                              Name 189  "specularContrib"
+                              Name 190  "specularContrib2"
+                              Name 191  "index"
+                              Name 192  "worldSpacePos"
+                              Name 193  "normal"
+                              Name 194  "shadowStrength"
+                              Name 195  "shadowColor"
+                              Name 196  "camVector"
+                              Name 197  "shininess"
+                              Name 198  "shininess2"
+                              Name 211  "TDLighting(vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1;"
+                              Name 202  "diffuseContrib"
+                              Name 203  "specularContrib"
+                              Name 204  "index"
+                              Name 205  "worldSpacePos"
+                              Name 206  "normal"
+                              Name 207  "shadowStrength"
+                              Name 208  "shadowColor"
+                              Name 209  "camVector"
+                              Name 210  "shininess"
+                              Name 223  "TDLighting(vf3;vf3;vf3;i1;vf3;vf3;vf3;f1;f1;"
+                              Name 214  "diffuseContrib"
+                              Name 215  "specularContrib"
+                              Name 216  "specularContrib2"
+                              Name 217  "index"
+                              Name 218  "worldSpacePos"
+                              Name 219  "normal"
+                              Name 220  "camVector"
+                              Name 221  "shininess"
+                              Name 222  "shininess2"
+                              Name 233  "TDLighting(vf3;vf3;i1;vf3;vf3;vf3;f1;"
+                              Name 226  "diffuseContrib"
+                              Name 227  "specularContrib"
+                              Name 228  "index"
+                              Name 229  "worldSpacePos"
+                              Name 230  "normal"
+                              Name 231  "camVector"
+                              Name 232  "shininess"
+                              Name 240  "TDLighting(vf3;i1;vf3;vf3;"
+                              Name 236  "diffuseContrib"
+                              Name 237  "index"
+                              Name 238  "worldSpacePos"
+                              Name 239  "normal"
+                              Name 249  "TDLighting(vf3;i1;vf3;vf3;f1;vf3;"
+                              Name 243  "diffuseContrib"
+                              Name 244  "index"
+                              Name 245  "worldSpacePos"
+                              Name 246  "normal"
+                              Name 247  "shadowStrength"
+                              Name 248  "shadowColor"
+                              Name 255  "TDProjMap(i1;vf3;vf4;"
+                              Name 252  "index"
+                              Name 253  "worldSpacePos"
+                              Name 254  "defaultColor"
+                              Name 261  "TDFog(vf4;vf3;i1;"
+                              Name 258  "color"
+                              Name 259  "lightingSpacePosition"
+                              Name 260  "cameraIndex"
+                              Name 266  "TDFog(vf4;vf3;"
+                              Name 264  "color"
+                              Name 265  "lightingSpacePosition"
+                              Name 271  "TDInstanceTexCoord(i1;vf3;"
+                              Name 269  "index"
+                              Name 270  "t"
+                              Name 275  "TDInstanceActive(i1;"
+                              Name 274  "index"
+                              Name 281  "iTDInstanceTranslate(i1;b1;"
+                              Name 279  "index"
+                              Name 280  "instanceActive"
+                              Name 285  "TDInstanceTranslate(i1;"
+                              Name 284  "index"
+                              Name 290  "TDInstanceRotateMat(i1;"
+                              Name 289  "index"
+                              Name 293  "TDInstanceScale(i1;"
+                              Name 292  "index"
+                              Name 296  "TDInstancePivot(i1;"
+                              Name 295  "index"
+                              Name 299  "TDInstanceRotTo(i1;"
+                              Name 298  "index"
+                              Name 302  "TDInstanceRotUp(i1;"
+                              Name 301  "index"
+                              Name 307  "TDInstanceMat(i1;"
+                              Name 306  "id"
+                              Name 310  "TDInstanceMat3(i1;"
+                              Name 309  "id"
+                              Name 313  "TDInstanceMat3ForNorm(i1;"
+                              Name 312  "id"
+                              Name 318  "TDInstanceColor(i1;vf4;"
+                              Name 316  "index"
+                              Name 317  "curColor"
+                              Name 321  "TDOutputSwizzle(vf4;"
+                              Name 320  "c"
+                              Name 327  "TDOutputSwizzle(vu4;"
+                              Name 326  "c"
+                              Name 330  "outcol"
+                              Name 333  "texCoord0"
+                              Name 334  "Vertex"
+                              MemberName 334(Vertex) 0  "color"
+                              MemberName 334(Vertex) 1  "worldSpacePos"
+                              MemberName 334(Vertex) 2  "texCoord0"
+                              MemberName 334(Vertex) 3  "cameraIndex"
+                              MemberName 334(Vertex) 4  "instance"
+                              Name 336  "iVert"
+                              Name 341  "actualTexZ"
+                              Name 349  "instanceLoop"
+                              Name 359  "colorMapColor"
+                              Name 363  "sColorMap"
+                              Name 367  "red"
+                              Name 374  "gl_DefaultUniformBlock"
+                              MemberName 374(gl_DefaultUniformBlock) 0  "uTDInstanceIDOffset"
+                              MemberName 374(gl_DefaultUniformBlock) 1  "uTDNumInstances"
+                              MemberName 374(gl_DefaultUniformBlock) 2  "uTDAlphaTestVal"
+                              MemberName 374(gl_DefaultUniformBlock) 3  "uConstant"
+                              MemberName 374(gl_DefaultUniformBlock) 4  "uShadowStrength"
+                              MemberName 374(gl_DefaultUniformBlock) 5  "uShadowColor"
+                              MemberName 374(gl_DefaultUniformBlock) 6  "uDiffuseColor"
+                              MemberName 374(gl_DefaultUniformBlock) 7  "uAmbientColor"
+                              Name 376  ""
+                              Name 401  "alpha"
+                              Name 409  "param"
+                              Name 422  "param"
+                              Name 429  "oFragColor"
+                              Name 430  "param"
+                              Name 435  "i"
+                              Name 452  "d"
+                              Name 456  "sTDNoiseMap"
+                              Name 458  "gl_FragCoord"
+                              Name 485  "gl_FrontFacing"
+                              Name 555  "param"
+                              Name 561  "a"
+                              Name 563  "phi"
+                              Name 568  "cosTheta"
+                              Name 582  "sinTheta"
+                              Name 588  "H"
+                              Name 601  "upVector"
+                              Name 612  "tangentX"
+                              Name 617  "tangentY"
+                              Name 621  "worldResult"
+                              Name 639  "NdotH"
+                              Name 645  "alpha2"
+                              Name 649  "denom"
+                              Name 686  "Gl"
+                              Name 694  "Gv"
+                              Name 708  "res"
+                              Name 712  "res"
+                              Name 713  "param"
+                              Name 715  "param"
+                              Name 717  "param"
+                              Name 719  "param"
+                              Name 721  "param"
+                              Name 723  "param"
+                              Name 725  "param"
+                              Name 727  "param"
+                              Name 729  "param"
+                              Name 738  "res"
+                              Name 739  "param"
+                              Name 741  "param"
+                              Name 743  "param"
+                              Name 745  "param"
+                              Name 747  "param"
+                              Name 749  "param"
+                              Name 751  "param"
+                              Name 753  "param"
+                              Name 755  "param"
+                              Name 762  "res"
+                              Name 766  "res"
+                              Name 767  "param"
+                              Name 769  "param"
+                              Name 771  "param"
+                              Name 773  "param"
+                              Name 775  "param"
+                              Name 777  "param"
+                              Name 779  "param"
+                              Name 790  "res"
+                              Name 804  "res"
+                              Name 822  "res"
+                              Name 838  "res"
+                              Name 852  "res"
+                              Name 868  "res"
+                              Name 882  "res"
+                              Name 894  "res"
+                              Name 917  "param"
+                              Name 919  "param"
+                              Name 921  "param"
+                              Name 925  "coord"
+                              Name 927  "samp"
+                              Name 931  "sTDInstanceTexCoord"
+                              Name 936  "v"
+                              Name 955  "coord"
+                              Name 957  "samp"
+                              Name 958  "sTDInstanceT"
+                              Name 963  "v"
+                              Name 970  "origIndex"
+                              Name 976  "coord"
+                              Name 978  "samp"
+                              Name 983  "v"
+                              Name 1003  "coord"
+                              Name 1005  "samp"
+                              Name 1010  "v"
+                              Name 1027  "v"
+                              Name 1029  "m"
+                              Name 1039  "v"
+                              Name 1047  "v"
+                              Name 1055  "v"
+                              Name 1063  "v"
+                              Name 1067  "instanceActive"
+                              Name 1069  "t"
+                              Name 1070  "param"
+                              Name 1072  "param"
+                              Name 1082  "m"
+                              Name 1088  "tt"
+                              Name 1201  "m"
+                              Name 1205  "m"
+                              Name 1206  "param"
+                              Name 1216  "coord"
+                              Name 1218  "samp"
+                              Name 1219  "sTDInstanceColor"
+                              Name 1224  "v"
+                              Name 1253  "TDMatrix"
+                              MemberName 1253(TDMatrix) 0  "world"
+                              MemberName 1253(TDMatrix) 1  "worldInverse"
+                              MemberName 1253(TDMatrix) 2  "worldCam"
+                              MemberName 1253(TDMatrix) 3  "worldCamInverse"
+                              MemberName 1253(TDMatrix) 4  "cam"
+                              MemberName 1253(TDMatrix) 5  "camInverse"
+                              MemberName 1253(TDMatrix) 6  "camProj"
+                              MemberName 1253(TDMatrix) 7  "camProjInverse"
+                              MemberName 1253(TDMatrix) 8  "proj"
+                              MemberName 1253(TDMatrix) 9  "projInverse"
+                              MemberName 1253(TDMatrix) 10  "worldCamProj"
+                              MemberName 1253(TDMatrix) 11  "worldCamProjInverse"
+                              MemberName 1253(TDMatrix) 12  "quadReproject"
+                              MemberName 1253(TDMatrix) 13  "worldForNormals"
+                              MemberName 1253(TDMatrix) 14  "camForNormals"
+                              MemberName 1253(TDMatrix) 15  "worldCamForNormals"
+                              Name 1255  "TDMatricesBlock"
+                              MemberName 1255(TDMatricesBlock) 0  "uTDMats"
+                              Name 1257  ""
+                              Name 1258  "TDCameraInfo"
+                              MemberName 1258(TDCameraInfo) 0  "nearFar"
+                              MemberName 1258(TDCameraInfo) 1  "fog"
+                              MemberName 1258(TDCameraInfo) 2  "fogColor"
+                              MemberName 1258(TDCameraInfo) 3  "renderTOPCameraIndex"
+                              Name 1260  "TDCameraInfoBlock"
+                              MemberName 1260(TDCameraInfoBlock) 0  "uTDCamInfos"
+                              Name 1262  ""
+                              Name 1263  "TDGeneral"
+                              MemberName 1263(TDGeneral) 0  "ambientColor"
+                              MemberName 1263(TDGeneral) 1  "nearFar"
+                              MemberName 1263(TDGeneral) 2  "viewport"
+                              MemberName 1263(TDGeneral) 3  "viewportRes"
+                              MemberName 1263(TDGeneral) 4  "fog"
+                              MemberName 1263(TDGeneral) 5  "fogColor"
+                              Name 1264  "TDGeneralBlock"
+                              MemberName 1264(TDGeneralBlock) 0  "uTDGeneral"
+                              Name 1266  ""
+                              Name 1270  "sTDSineLookup"
+                              Name 1271  "sTDWhite2D"
+                              Name 1275  "sTDWhite3D"
+                              Name 1276  "sTDWhite2DArray"
+                              Name 1280  "sTDWhiteCube"
+                              Name 1281  "TDLight"
+                              MemberName 1281(TDLight) 0  "position"
+                              MemberName 1281(TDLight) 1  "direction"
+                              MemberName 1281(TDLight) 2  "diffuse"
+                              MemberName 1281(TDLight) 3  "nearFar"
+                              MemberName 1281(TDLight) 4  "lightSize"
+                              MemberName 1281(TDLight) 5  "misc"
+                              MemberName 1281(TDLight) 6  "coneLookupScaleBias"
+                              MemberName 1281(TDLight) 7  "attenScaleBiasRoll"
+                              MemberName 1281(TDLight) 8  "shadowMapMatrix"
+                              MemberName 1281(TDLight) 9  "shadowMapCamMatrix"
+                              MemberName 1281(TDLight) 10  "shadowMapRes"
+                              MemberName 1281(TDLight) 11  "projMapMatrix"
+                              Name 1283  "TDLightBlock"
+                              MemberName 1283(TDLightBlock) 0  "uTDLights"
+                              Name 1285  ""
+                              Name 1286  "TDEnvLight"
+                              MemberName 1286(TDEnvLight) 0  "color"
+                              MemberName 1286(TDEnvLight) 1  "rotate"
+                              Name 1288  "TDEnvLightBlock"
+                              MemberName 1288(TDEnvLightBlock) 0  "uTDEnvLights"
+                              Name 1290  ""
+                              Name 1293  "TDEnvLightBuffer"
+                              MemberName 1293(TDEnvLightBuffer) 0  "shCoeffs"
+                              Name 1296  "uTDEnvLightBuffers"
+                              MemberDecorate 334(Vertex) 3 Flat
+                              MemberDecorate 334(Vertex) 4 Flat
+                              Decorate 334(Vertex) Block
+                              Decorate 336(iVert) Location 0
+                              Decorate 363(sColorMap) DescriptorSet 0
+                              Decorate 363(sColorMap) Binding 2
+                              MemberDecorate 374(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 374(gl_DefaultUniformBlock) 1 Offset 4
+                              MemberDecorate 374(gl_DefaultUniformBlock) 2 Offset 8
+                              MemberDecorate 374(gl_DefaultUniformBlock) 3 Offset 16
+                              MemberDecorate 374(gl_DefaultUniformBlock) 4 Offset 28
+                              MemberDecorate 374(gl_DefaultUniformBlock) 5 Offset 32
+                              MemberDecorate 374(gl_DefaultUniformBlock) 6 Offset 48
+                              MemberDecorate 374(gl_DefaultUniformBlock) 7 Offset 64
+                              Decorate 374(gl_DefaultUniformBlock) Block
+                              Decorate 376 DescriptorSet 0
+                              Decorate 376 Binding 0
+                              Decorate 429(oFragColor) Location 0
+                              Decorate 456(sTDNoiseMap) DescriptorSet 0
+                              Decorate 456(sTDNoiseMap) Binding 3
+                              Decorate 458(gl_FragCoord) BuiltIn FragCoord
+                              Decorate 485(gl_FrontFacing) BuiltIn FrontFacing
+                              Decorate 931(sTDInstanceTexCoord) DescriptorSet 0
+                              Decorate 931(sTDInstanceTexCoord) Binding 16
+                              Decorate 958(sTDInstanceT) DescriptorSet 0
+                              Decorate 958(sTDInstanceT) Binding 15
+                              Decorate 1219(sTDInstanceColor) DescriptorSet 0
+                              Decorate 1219(sTDInstanceColor) Binding 17
+                              MemberDecorate 1253(TDMatrix) 0 ColMajor
+                              MemberDecorate 1253(TDMatrix) 0 Offset 0
+                              MemberDecorate 1253(TDMatrix) 0 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 1 ColMajor
+                              MemberDecorate 1253(TDMatrix) 1 Offset 64
+                              MemberDecorate 1253(TDMatrix) 1 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 2 ColMajor
+                              MemberDecorate 1253(TDMatrix) 2 Offset 128
+                              MemberDecorate 1253(TDMatrix) 2 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 3 ColMajor
+                              MemberDecorate 1253(TDMatrix) 3 Offset 192
+                              MemberDecorate 1253(TDMatrix) 3 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 4 ColMajor
+                              MemberDecorate 1253(TDMatrix) 4 Offset 256
+                              MemberDecorate 1253(TDMatrix) 4 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 5 ColMajor
+                              MemberDecorate 1253(TDMatrix) 5 Offset 320
+                              MemberDecorate 1253(TDMatrix) 5 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 6 ColMajor
+                              MemberDecorate 1253(TDMatrix) 6 Offset 384
+                              MemberDecorate 1253(TDMatrix) 6 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 7 ColMajor
+                              MemberDecorate 1253(TDMatrix) 7 Offset 448
+                              MemberDecorate 1253(TDMatrix) 7 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 8 ColMajor
+                              MemberDecorate 1253(TDMatrix) 8 Offset 512
+                              MemberDecorate 1253(TDMatrix) 8 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 9 ColMajor
+                              MemberDecorate 1253(TDMatrix) 9 Offset 576
+                              MemberDecorate 1253(TDMatrix) 9 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 10 ColMajor
+                              MemberDecorate 1253(TDMatrix) 10 Offset 640
+                              MemberDecorate 1253(TDMatrix) 10 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 11 ColMajor
+                              MemberDecorate 1253(TDMatrix) 11 Offset 704
+                              MemberDecorate 1253(TDMatrix) 11 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 12 ColMajor
+                              MemberDecorate 1253(TDMatrix) 12 Offset 768
+                              MemberDecorate 1253(TDMatrix) 12 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 13 ColMajor
+                              MemberDecorate 1253(TDMatrix) 13 Offset 832
+                              MemberDecorate 1253(TDMatrix) 13 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 14 ColMajor
+                              MemberDecorate 1253(TDMatrix) 14 Offset 880
+                              MemberDecorate 1253(TDMatrix) 14 MatrixStride 16
+                              MemberDecorate 1253(TDMatrix) 15 ColMajor
+                              MemberDecorate 1253(TDMatrix) 15 Offset 928
+                              MemberDecorate 1253(TDMatrix) 15 MatrixStride 16
+                              Decorate 1254 ArrayStride 976
+                              MemberDecorate 1255(TDMatricesBlock) 0 Offset 0
+                              Decorate 1255(TDMatricesBlock) Block
+                              Decorate 1257 DescriptorSet 0
+                              Decorate 1257 Binding 1
+                              MemberDecorate 1258(TDCameraInfo) 0 Offset 0
+                              MemberDecorate 1258(TDCameraInfo) 1 Offset 16
+                              MemberDecorate 1258(TDCameraInfo) 2 Offset 32
+                              MemberDecorate 1258(TDCameraInfo) 3 Offset 48
+                              Decorate 1259 ArrayStride 64
+                              MemberDecorate 1260(TDCameraInfoBlock) 0 Offset 0
+                              Decorate 1260(TDCameraInfoBlock) Block
+                              Decorate 1262 DescriptorSet 0
+                              Decorate 1262 Binding 0
+                              MemberDecorate 1263(TDGeneral) 0 Offset 0
+                              MemberDecorate 1263(TDGeneral) 1 Offset 16
+                              MemberDecorate 1263(TDGeneral) 2 Offset 32
+                              MemberDecorate 1263(TDGeneral) 3 Offset 48
+                              MemberDecorate 1263(TDGeneral) 4 Offset 64
+                              MemberDecorate 1263(TDGeneral) 5 Offset 80
+                              MemberDecorate 1264(TDGeneralBlock) 0 Offset 0
+                              Decorate 1264(TDGeneralBlock) Block
+                              Decorate 1266 DescriptorSet 0
+                              Decorate 1266 Binding 0
+                              Decorate 1270(sTDSineLookup) DescriptorSet 0
+                              Decorate 1270(sTDSineLookup) Binding 0
+                              Decorate 1271(sTDWhite2D) DescriptorSet 0
+                              Decorate 1271(sTDWhite2D) Binding 0
+                              Decorate 1275(sTDWhite3D) DescriptorSet 0
+                              Decorate 1275(sTDWhite3D) Binding 0
+                              Decorate 1276(sTDWhite2DArray) DescriptorSet 0
+                              Decorate 1276(sTDWhite2DArray) Binding 0
+                              Decorate 1280(sTDWhiteCube) DescriptorSet 0
+                              Decorate 1280(sTDWhiteCube) Binding 0
+                              MemberDecorate 1281(TDLight) 0 Offset 0
+                              MemberDecorate 1281(TDLight) 1 Offset 16
+                              MemberDecorate 1281(TDLight) 2 Offset 32
+                              MemberDecorate 1281(TDLight) 3 Offset 48
+                              MemberDecorate 1281(TDLight) 4 Offset 64
+                              MemberDecorate 1281(TDLight) 5 Offset 80
+                              MemberDecorate 1281(TDLight) 6 Offset 96
+                              MemberDecorate 1281(TDLight) 7 Offset 112
+                              MemberDecorate 1281(TDLight) 8 ColMajor
+                              MemberDecorate 1281(TDLight) 8 Offset 128
+                              MemberDecorate 1281(TDLight) 8 MatrixStride 16
+                              MemberDecorate 1281(TDLight) 9 ColMajor
+                              MemberDecorate 1281(TDLight) 9 Offset 192
+                              MemberDecorate 1281(TDLight) 9 MatrixStride 16
+                              MemberDecorate 1281(TDLight) 10 Offset 256
+                              MemberDecorate 1281(TDLight) 11 ColMajor
+                              MemberDecorate 1281(TDLight) 11 Offset 272
+                              MemberDecorate 1281(TDLight) 11 MatrixStride 16
+                              Decorate 1282 ArrayStride 336
+                              MemberDecorate 1283(TDLightBlock) 0 Offset 0
+                              Decorate 1283(TDLightBlock) Block
+                              Decorate 1285 DescriptorSet 0
+                              Decorate 1285 Binding 0
+                              MemberDecorate 1286(TDEnvLight) 0 Offset 0
+                              MemberDecorate 1286(TDEnvLight) 1 ColMajor
+                              MemberDecorate 1286(TDEnvLight) 1 Offset 16
+                              MemberDecorate 1286(TDEnvLight) 1 MatrixStride 16
+                              Decorate 1287 ArrayStride 64
+                              MemberDecorate 1288(TDEnvLightBlock) 0 Offset 0
+                              Decorate 1288(TDEnvLightBlock) Block
+                              Decorate 1290 DescriptorSet 0
+                              Decorate 1290 Binding 0
+                              Decorate 1292 ArrayStride 16
+                              MemberDecorate 1293(TDEnvLightBuffer) 0 Restrict
+                              MemberDecorate 1293(TDEnvLightBuffer) 0 NonWritable
+                              MemberDecorate 1293(TDEnvLightBuffer) 0 Offset 0
+                              Decorate 1293(TDEnvLightBuffer) BufferBlock
+                              Decorate 1296(uTDEnvLightBuffers) DescriptorSet 0
+                              Decorate 1296(uTDEnvLightBuffers) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              20:             TypeVector 6(float) 3
+              21:             TypePointer Function 20(fvec3)
+              22:             TypeBool
+              23:             TypeFunction 22(bool) 21(ptr) 21(ptr)
+              28:             TypeInt 32 1
+              29:             TypePointer Function 28(int)
+              30:             TypePointer Function 6(float)
+              31:             TypeFunction 6(float) 29(ptr) 30(ptr)
+              36:             TypeFunction 2 30(ptr)
+              40:             TypeFunction 6(float) 29(ptr) 21(ptr)
+              45:             TypeFunction 6(float) 29(ptr) 21(ptr) 29(ptr) 29(ptr)
+              60:             TypeInt 32 0
+              61:             TypePointer Function 60(int)
+              62:             TypeFunction 6(float) 61(ptr)
+              66:             TypeVector 6(float) 2
+              67:             TypeFunction 66(fvec2) 61(ptr) 61(ptr)
+              72:             TypePointer Function 66(fvec2)
+              73:             TypeFunction 20(fvec3) 72(ptr) 30(ptr) 21(ptr)
+              79:             TypeFunction 6(float) 21(ptr) 21(ptr) 30(ptr)
+              85:             TypeFunction 20(fvec3) 21(ptr) 30(ptr)
+              90:             TypeFunction 6(float) 30(ptr) 30(ptr) 30(ptr)
+ 96(TDPBRResult):             TypeStruct 20(fvec3) 20(fvec3) 6(float)
+              97:             TypeFunction 96(TDPBRResult) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr)
+             109:             TypeFunction 2 21(ptr) 21(ptr) 30(ptr) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr)
+             124:             TypeFunction 2 21(ptr) 21(ptr) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr)
+             138:             TypeFunction 96(TDPBRResult) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr) 30(ptr)
+             148:             TypeFunction 2 21(ptr) 21(ptr) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr) 30(ptr)
+160(TDPhongResult):             TypeStruct 20(fvec3) 20(fvec3) 20(fvec3) 6(float)
+             161:             TypeFunction 160(TDPhongResult) 29(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr) 30(ptr)
+             172:             TypeFunction 2 21(ptr) 21(ptr) 21(ptr) 30(ptr) 29(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr) 30(ptr)
+             187:             TypeFunction 2 21(ptr) 21(ptr) 21(ptr) 29(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr) 30(ptr)
+             201:             TypeFunction 2 21(ptr) 21(ptr) 29(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr) 21(ptr) 30(ptr)
+             213:             TypeFunction 2 21(ptr) 21(ptr) 21(ptr) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr) 30(ptr)
+             225:             TypeFunction 2 21(ptr) 21(ptr) 29(ptr) 21(ptr) 21(ptr) 21(ptr) 30(ptr)
+             235:             TypeFunction 2 21(ptr) 29(ptr) 21(ptr) 21(ptr)
+             242:             TypeFunction 2 21(ptr) 29(ptr) 21(ptr) 21(ptr) 30(ptr) 21(ptr)
+             251:             TypeFunction 7(fvec4) 29(ptr) 21(ptr) 8(ptr)
+             257:             TypeFunction 7(fvec4) 8(ptr) 21(ptr) 29(ptr)
+             263:             TypeFunction 7(fvec4) 8(ptr) 21(ptr)
+             268:             TypeFunction 20(fvec3) 29(ptr) 21(ptr)
+             273:             TypeFunction 22(bool) 29(ptr)
+             277:             TypePointer Function 22(bool)
+             278:             TypeFunction 20(fvec3) 29(ptr) 277(ptr)
+             283:             TypeFunction 20(fvec3) 29(ptr)
+             287:             TypeMatrix 20(fvec3) 3
+             288:             TypeFunction 287 29(ptr)
+             304:             TypeMatrix 7(fvec4) 4
+             305:             TypeFunction 304 29(ptr)
+             315:             TypeFunction 7(fvec4) 29(ptr) 8(ptr)
+             323:             TypeVector 60(int) 4
+             324:             TypePointer Function 323(ivec4)
+             325:             TypeFunction 323(ivec4) 324(ptr)
+             331:    6(float) Constant 0
+             332:    7(fvec4) ConstantComposite 331 331 331 331
+     334(Vertex):             TypeStruct 7(fvec4) 20(fvec3) 20(fvec3) 28(int) 28(int)
+             335:             TypePointer Input 334(Vertex)
+      336(iVert):    335(ptr) Variable Input
+             337:     28(int) Constant 2
+             338:             TypePointer Input 20(fvec3)
+             342:     60(int) Constant 2
+             347:    6(float) Constant 1157627904
+             353:     28(int) Constant 2048
+             360:             TypeImage 6(float) 2D array sampled format:Unknown
+             361:             TypeSampledImage 360
+             362:             TypePointer UniformConstant 361
+  363(sColorMap):    362(ptr) Variable UniformConstant
+374(gl_DefaultUniformBlock):             TypeStruct 28(int) 28(int) 6(float) 20(fvec3) 6(float) 20(fvec3) 7(fvec4) 7(fvec4)
+             375:             TypePointer Uniform 374(gl_DefaultUniformBlock)
+             376:    375(ptr) Variable Uniform
+             377:     28(int) Constant 3
+             378:             TypePointer Uniform 20(fvec3)
+             381:     28(int) Constant 0
+             382:             TypePointer Input 7(fvec4)
+             390:     60(int) Constant 0
+             393:     60(int) Constant 1
+             402:     60(int) Constant 3
+             403:             TypePointer Input 6(float)
+             427:             TypeArray 7(fvec4) 393
+             428:             TypePointer Output 427
+ 429(oFragColor):    428(ptr) Variable Output
+             433:             TypePointer Output 7(fvec4)
+             436:     28(int) Constant 1
+             453:             TypeImage 6(float) 2D sampled format:Unknown
+             454:             TypeSampledImage 453
+             455:             TypePointer UniformConstant 454
+456(sTDNoiseMap):    455(ptr) Variable UniformConstant
+458(gl_FragCoord):    382(ptr) Variable Input
+             461:    6(float) Constant 1132462080
+             466:    6(float) Constant 1056964608
+             484:             TypePointer Input 22(bool)
+485(gl_FrontFacing):    484(ptr) Variable Input
+             489:    6(float) Constant 1065353216
+             501:     60(int) Constant 16
+             507:     60(int) Constant 1431655765
+             511:     60(int) Constant 2863311530
+             516:     60(int) Constant 858993459
+             520:     60(int) Constant 3435973836
+             525:     60(int) Constant 252645135
+             527:     60(int) Constant 4
+             530:     60(int) Constant 4042322160
+             535:     60(int) Constant 16711935
+             537:     60(int) Constant 8
+             540:     60(int) Constant 4278255360
+             546:    6(float) Constant 796917760
+             564:    6(float) Constant 1086918619
+             605:    6(float) Constant 1065336439
+             607:   20(fvec3) ConstantComposite 331 331 489
+             608:   20(fvec3) ConstantComposite 489 331 331
+             609:             TypeVector 22(bool) 3
+             643:    6(float) Constant 897988541
+             657:    6(float) Constant 841731191
+             661:    6(float) Constant 1078530011
+             670:   20(fvec3) ConstantComposite 489 489 489
+             673:    6(float) Constant 1073741824
+             674:    6(float) Constant 3232874585
+             677:    6(float) Constant 1088386572
+             707:             TypePointer Function 96(TDPBRResult)
+             789:             TypePointer Function 160(TDPhongResult)
+             791:   20(fvec3) ConstantComposite 331 331 331
+             928:             TypeImage 6(float) Buffer sampled format:Unknown
+             929:             TypeSampledImage 928
+             930:             TypePointer UniformConstant 929
+931(sTDInstanceTexCoord):    930(ptr) Variable UniformConstant
+             950:             TypePointer Uniform 28(int)
+958(sTDInstanceT):    930(ptr) Variable UniformConstant
+            1028:             TypePointer Function 287
+            1030:   20(fvec3) ConstantComposite 331 489 331
+            1031:         287 ConstantComposite 608 1030 607
+            1068:    22(bool) ConstantTrue
+            1079:         304 ConstantComposite 332 332 332 332
+            1081:             TypePointer Function 304
+            1083:    7(fvec4) ConstantComposite 489 331 331 331
+            1084:    7(fvec4) ConstantComposite 331 489 331 331
+            1085:    7(fvec4) ConstantComposite 331 331 489 331
+            1086:    7(fvec4) ConstantComposite 331 331 331 489
+            1087:         304 ConstantComposite 1083 1084 1085 1086
+1219(sTDInstanceColor):    930(ptr) Variable UniformConstant
+  1253(TDMatrix):             TypeStruct 304 304 304 304 304 304 304 304 304 304 304 304 304 287 287 287
+            1254:             TypeArray 1253(TDMatrix) 393
+1255(TDMatricesBlock):             TypeStruct 1254
+            1256:             TypePointer Uniform 1255(TDMatricesBlock)
+            1257:   1256(ptr) Variable Uniform
+1258(TDCameraInfo):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) 28(int)
+            1259:             TypeArray 1258(TDCameraInfo) 393
+1260(TDCameraInfoBlock):             TypeStruct 1259
+            1261:             TypePointer Uniform 1260(TDCameraInfoBlock)
+            1262:   1261(ptr) Variable Uniform
+ 1263(TDGeneral):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4)
+1264(TDGeneralBlock):             TypeStruct 1263(TDGeneral)
+            1265:             TypePointer Uniform 1264(TDGeneralBlock)
+            1266:   1265(ptr) Variable Uniform
+            1267:             TypeImage 6(float) 1D sampled format:Unknown
+            1268:             TypeSampledImage 1267
+            1269:             TypePointer UniformConstant 1268
+1270(sTDSineLookup):   1269(ptr) Variable UniformConstant
+1271(sTDWhite2D):    455(ptr) Variable UniformConstant
+            1272:             TypeImage 6(float) 3D sampled format:Unknown
+            1273:             TypeSampledImage 1272
+            1274:             TypePointer UniformConstant 1273
+1275(sTDWhite3D):   1274(ptr) Variable UniformConstant
+1276(sTDWhite2DArray):    362(ptr) Variable UniformConstant
+            1277:             TypeImage 6(float) Cube sampled format:Unknown
+            1278:             TypeSampledImage 1277
+            1279:             TypePointer UniformConstant 1278
+1280(sTDWhiteCube):   1279(ptr) Variable UniformConstant
+   1281(TDLight):             TypeStruct 7(fvec4) 20(fvec3) 20(fvec3) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 304 304 7(fvec4) 304
+            1282:             TypeArray 1281(TDLight) 393
+1283(TDLightBlock):             TypeStruct 1282
+            1284:             TypePointer Uniform 1283(TDLightBlock)
+            1285:   1284(ptr) Variable Uniform
+1286(TDEnvLight):             TypeStruct 20(fvec3) 287
+            1287:             TypeArray 1286(TDEnvLight) 393
+1288(TDEnvLightBlock):             TypeStruct 1287
+            1289:             TypePointer Uniform 1288(TDEnvLightBlock)
+            1290:   1289(ptr) Variable Uniform
+            1291:     60(int) Constant 9
+            1292:             TypeArray 20(fvec3) 1291
+1293(TDEnvLightBuffer):             TypeStruct 1292
+            1294:             TypeArray 1293(TDEnvLightBuffer) 393
+            1295:             TypePointer Uniform 1294
+1296(uTDEnvLightBuffers):   1295(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+     330(outcol):      8(ptr) Variable Function
+  333(texCoord0):     21(ptr) Variable Function
+ 341(actualTexZ):     30(ptr) Variable Function
+349(instanceLoop):     30(ptr) Variable Function
+359(colorMapColor):      8(ptr) Variable Function
+        367(red):     30(ptr) Variable Function
+      401(alpha):     30(ptr) Variable Function
+      409(param):      8(ptr) Variable Function
+      422(param):     30(ptr) Variable Function
+      430(param):      8(ptr) Variable Function
+          435(i):     29(ptr) Variable Function
+             329:           2 FunctionCall 15(TDCheckDiscard()
+                              Store 330(outcol) 332
+             339:    338(ptr) AccessChain 336(iVert) 337
+             340:   20(fvec3) Load 339
+                              Store 333(texCoord0) 340
+             343:     30(ptr) AccessChain 333(texCoord0) 342
+             344:    6(float) Load 343
+             345:     28(int) ConvertFToS 344
+             346:    6(float) ConvertSToF 345
+             348:    6(float) FMod 346 347
+                              Store 341(actualTexZ) 348
+             350:     30(ptr) AccessChain 333(texCoord0) 342
+             351:    6(float) Load 350
+             352:     28(int) ConvertFToS 351
+             354:     28(int) SDiv 352 353
+             355:    6(float) ConvertSToF 354
+             356:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 355
+                              Store 349(instanceLoop) 356
+             357:    6(float) Load 341(actualTexZ)
+             358:     30(ptr) AccessChain 333(texCoord0) 342
+                              Store 358 357
+             364:         361 Load 363(sColorMap)
+             365:   20(fvec3) Load 333(texCoord0)
+             366:    7(fvec4) ImageSampleImplicitLod 364 365
+                              Store 359(colorMapColor) 366
+             368:    6(float) Load 349(instanceLoop)
+             369:     28(int) ConvertFToS 368
+             370:     30(ptr) AccessChain 359(colorMapColor) 369
+             371:    6(float) Load 370
+                              Store 367(red) 371
+             372:    6(float) Load 367(red)
+             373:    7(fvec4) CompositeConstruct 372 372 372 372
+                              Store 359(colorMapColor) 373
+             379:    378(ptr) AccessChain 376 377
+             380:   20(fvec3) Load 379
+             383:    382(ptr) AccessChain 336(iVert) 381
+             384:    7(fvec4) Load 383
+             385:   20(fvec3) VectorShuffle 384 384 0 1 2
+             386:   20(fvec3) FMul 380 385
+             387:    7(fvec4) Load 330(outcol)
+             388:   20(fvec3) VectorShuffle 387 387 0 1 2
+             389:   20(fvec3) FAdd 388 386
+             391:     30(ptr) AccessChain 330(outcol) 390
+             392:    6(float) CompositeExtract 389 0
+                              Store 391 392
+             394:     30(ptr) AccessChain 330(outcol) 393
+             395:    6(float) CompositeExtract 389 1
+                              Store 394 395
+             396:     30(ptr) AccessChain 330(outcol) 342
+             397:    6(float) CompositeExtract 389 2
+                              Store 396 397
+             398:    7(fvec4) Load 359(colorMapColor)
+             399:    7(fvec4) Load 330(outcol)
+             400:    7(fvec4) FMul 399 398
+                              Store 330(outcol) 400
+             404:    403(ptr) AccessChain 336(iVert) 381 402
+             405:    6(float) Load 404
+             406:     30(ptr) AccessChain 359(colorMapColor) 402
+             407:    6(float) Load 406
+             408:    6(float) FMul 405 407
+                              Store 401(alpha) 408
+             410:    7(fvec4) Load 330(outcol)
+                              Store 409(param) 410
+             411:    7(fvec4) FunctionCall 18(TDDither(vf4;) 409(param)
+                              Store 330(outcol) 411
+             412:    6(float) Load 401(alpha)
+             413:    7(fvec4) Load 330(outcol)
+             414:   20(fvec3) VectorShuffle 413 413 0 1 2
+             415:   20(fvec3) VectorTimesScalar 414 412
+             416:     30(ptr) AccessChain 330(outcol) 390
+             417:    6(float) CompositeExtract 415 0
+                              Store 416 417
+             418:     30(ptr) AccessChain 330(outcol) 393
+             419:    6(float) CompositeExtract 415 1
+                              Store 418 419
+             420:     30(ptr) AccessChain 330(outcol) 342
+             421:    6(float) CompositeExtract 415 2
+                              Store 420 421
+             423:    6(float) Load 401(alpha)
+                              Store 422(param) 423
+             424:           2 FunctionCall 38(TDAlphaTest(f1;) 422(param)
+             425:    6(float) Load 401(alpha)
+             426:     30(ptr) AccessChain 330(outcol) 402
+                              Store 426 425
+             431:    7(fvec4) Load 330(outcol)
+                              Store 430(param) 431
+             432:    7(fvec4) FunctionCall 321(TDOutputSwizzle(vf4;) 430(param)
+             434:    433(ptr) AccessChain 429(oFragColor) 381
+                              Store 434 432
+                              Store 435(i) 436
+                              Branch 437
+             437:             Label
+                              LoopMerge 439 440 None
+                              Branch 441
+             441:             Label
+             442:     28(int) Load 435(i)
+             443:    22(bool) SLessThan 442 436
+                              BranchConditional 443 438 439
+             438:               Label
+             444:     28(int)   Load 435(i)
+             445:    433(ptr)   AccessChain 429(oFragColor) 444
+                                Store 445 332
+                                Branch 440
+             440:               Label
+             446:     28(int)   Load 435(i)
+             447:     28(int)   IAdd 446 436
+                                Store 435(i) 447
+                                Branch 437
+             439:             Label
+                              Return
+                              FunctionEnd
+11(TDColor(vf4;):    7(fvec4) Function None 9
+       10(color):      8(ptr) FunctionParameter
+              12:             Label
+             448:    7(fvec4) Load 10(color)
+                              ReturnValue 448
+                              FunctionEnd
+13(TDCheckOrderIndTrans():           2 Function None 3
+              14:             Label
+                              Return
+                              FunctionEnd
+15(TDCheckDiscard():           2 Function None 3
+              16:             Label
+             451:           2 FunctionCall 13(TDCheckOrderIndTrans()
+                              Return
+                              FunctionEnd
+18(TDDither(vf4;):    7(fvec4) Function None 9
+       17(color):      8(ptr) FunctionParameter
+              19:             Label
+          452(d):     30(ptr) Variable Function
+             457:         454 Load 456(sTDNoiseMap)
+             459:    7(fvec4) Load 458(gl_FragCoord)
+             460:   66(fvec2) VectorShuffle 459 459 0 1
+             462:   66(fvec2) CompositeConstruct 461 461
+             463:   66(fvec2) FDiv 460 462
+             464:    7(fvec4) ImageSampleImplicitLod 457 463
+             465:    6(float) CompositeExtract 464 0
+                              Store 452(d) 465
+             467:    6(float) Load 452(d)
+             468:    6(float) FSub 467 466
+                              Store 452(d) 468
+             469:    6(float) Load 452(d)
+             470:    6(float) FDiv 469 461
+                              Store 452(d) 470
+             471:    7(fvec4) Load 17(color)
+             472:   20(fvec3) VectorShuffle 471 471 0 1 2
+             473:    6(float) Load 452(d)
+             474:   20(fvec3) CompositeConstruct 473 473 473
+             475:   20(fvec3) FAdd 472 474
+             476:     30(ptr) AccessChain 17(color) 402
+             477:    6(float) Load 476
+             478:    6(float) CompositeExtract 475 0
+             479:    6(float) CompositeExtract 475 1
+             480:    6(float) CompositeExtract 475 2
+             481:    7(fvec4) CompositeConstruct 478 479 480 477
+                              ReturnValue 481
+                              FunctionEnd
+26(TDFrontFacing(vf3;vf3;):    22(bool) Function None 23
+         24(pos):     21(ptr) FunctionParameter
+      25(normal):     21(ptr) FunctionParameter
+              27:             Label
+             486:    22(bool) Load 485(gl_FrontFacing)
+                              ReturnValue 486
+                              FunctionEnd
+34(TDAttenuateLight(i1;f1;):    6(float) Function None 31
+       32(index):     29(ptr) FunctionParameter
+   33(lightDist):     30(ptr) FunctionParameter
+              35:             Label
+                              ReturnValue 489
+                              FunctionEnd
+38(TDAlphaTest(f1;):           2 Function None 36
+       37(alpha):     30(ptr) FunctionParameter
+              39:             Label
+                              Return
+                              FunctionEnd
+43(TDHardShadow(i1;vf3;):    6(float) Function None 40
+  41(lightIndex):     29(ptr) FunctionParameter
+42(worldSpacePos):     21(ptr) FunctionParameter
+              44:             Label
+                              ReturnValue 331
+                              FunctionEnd
+50(TDSoftShadow(i1;vf3;i1;i1;):    6(float) Function None 45
+  46(lightIndex):     29(ptr) FunctionParameter
+47(worldSpacePos):     21(ptr) FunctionParameter
+     48(samples):     29(ptr) FunctionParameter
+       49(steps):     29(ptr) FunctionParameter
+              51:             Label
+                              ReturnValue 331
+                              FunctionEnd
+54(TDSoftShadow(i1;vf3;):    6(float) Function None 40
+  52(lightIndex):     29(ptr) FunctionParameter
+53(worldSpacePos):     21(ptr) FunctionParameter
+              55:             Label
+                              ReturnValue 331
+                              FunctionEnd
+58(TDShadow(i1;vf3;):    6(float) Function None 40
+  56(lightIndex):     29(ptr) FunctionParameter
+57(worldSpacePos):     21(ptr) FunctionParameter
+              59:             Label
+                              ReturnValue 331
+                              FunctionEnd
+64(iTDRadicalInverse_VdC(u1;):    6(float) Function None 62
+        63(bits):     61(ptr) FunctionParameter
+              65:             Label
+             500:     60(int) Load 63(bits)
+             502:     60(int) ShiftLeftLogical 500 501
+             503:     60(int) Load 63(bits)
+             504:     60(int) ShiftRightLogical 503 501
+             505:     60(int) BitwiseOr 502 504
+                              Store 63(bits) 505
+             506:     60(int) Load 63(bits)
+             508:     60(int) BitwiseAnd 506 507
+             509:     60(int) ShiftLeftLogical 508 393
+             510:     60(int) Load 63(bits)
+             512:     60(int) BitwiseAnd 510 511
+             513:     60(int) ShiftRightLogical 512 393
+             514:     60(int) BitwiseOr 509 513
+                              Store 63(bits) 514
+             515:     60(int) Load 63(bits)
+             517:     60(int) BitwiseAnd 515 516
+             518:     60(int) ShiftLeftLogical 517 342
+             519:     60(int) Load 63(bits)
+             521:     60(int) BitwiseAnd 519 520
+             522:     60(int) ShiftRightLogical 521 342
+             523:     60(int) BitwiseOr 518 522
+                              Store 63(bits) 523
+             524:     60(int) Load 63(bits)
+             526:     60(int) BitwiseAnd 524 525
+             528:     60(int) ShiftLeftLogical 526 527
+             529:     60(int) Load 63(bits)
+             531:     60(int) BitwiseAnd 529 530
+             532:     60(int) ShiftRightLogical 531 527
+             533:     60(int) BitwiseOr 528 532
+                              Store 63(bits) 533
+             534:     60(int) Load 63(bits)
+             536:     60(int) BitwiseAnd 534 535
+             538:     60(int) ShiftLeftLogical 536 537
+             539:     60(int) Load 63(bits)
+             541:     60(int) BitwiseAnd 539 540
+             542:     60(int) ShiftRightLogical 541 537
+             543:     60(int) BitwiseOr 538 542
+                              Store 63(bits) 543
+             544:     60(int) Load 63(bits)
+             545:    6(float) ConvertUToF 544
+             547:    6(float) FMul 545 546
+                              ReturnValue 547
+                              FunctionEnd
+70(iTDHammersley(u1;u1;):   66(fvec2) Function None 67
+           68(i):     61(ptr) FunctionParameter
+           69(N):     61(ptr) FunctionParameter
+              71:             Label
+      555(param):     61(ptr) Variable Function
+             550:     60(int) Load 68(i)
+             551:    6(float) ConvertUToF 550
+             552:     60(int) Load 69(N)
+             553:    6(float) ConvertUToF 552
+             554:    6(float) FDiv 551 553
+             556:     60(int) Load 68(i)
+                              Store 555(param) 556
+             557:    6(float) FunctionCall 64(iTDRadicalInverse_VdC(u1;) 555(param)
+             558:   66(fvec2) CompositeConstruct 554 557
+                              ReturnValue 558
+                              FunctionEnd
+77(iTDImportanceSampleGGX(vf2;f1;vf3;):   20(fvec3) Function None 73
+          74(Xi):     72(ptr) FunctionParameter
+  75(roughness2):     30(ptr) FunctionParameter
+           76(N):     21(ptr) FunctionParameter
+              78:             Label
+          561(a):     30(ptr) Variable Function
+        563(phi):     30(ptr) Variable Function
+   568(cosTheta):     30(ptr) Variable Function
+   582(sinTheta):     30(ptr) Variable Function
+          588(H):     21(ptr) Variable Function
+   601(upVector):     21(ptr) Variable Function
+   612(tangentX):     21(ptr) Variable Function
+   617(tangentY):     21(ptr) Variable Function
+621(worldResult):     21(ptr) Variable Function
+             562:    6(float) Load 75(roughness2)
+                              Store 561(a) 562
+             565:     30(ptr) AccessChain 74(Xi) 390
+             566:    6(float) Load 565
+             567:    6(float) FMul 564 566
+                              Store 563(phi) 567
+             569:     30(ptr) AccessChain 74(Xi) 393
+             570:    6(float) Load 569
+             571:    6(float) FSub 489 570
+             572:    6(float) Load 561(a)
+             573:    6(float) Load 561(a)
+             574:    6(float) FMul 572 573
+             575:    6(float) FSub 574 489
+             576:     30(ptr) AccessChain 74(Xi) 393
+             577:    6(float) Load 576
+             578:    6(float) FMul 575 577
+             579:    6(float) FAdd 489 578
+             580:    6(float) FDiv 571 579
+             581:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 580
+                              Store 568(cosTheta) 581
+             583:    6(float) Load 568(cosTheta)
+             584:    6(float) Load 568(cosTheta)
+             585:    6(float) FMul 583 584
+             586:    6(float) FSub 489 585
+             587:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 586
+                              Store 582(sinTheta) 587
+             589:    6(float) Load 582(sinTheta)
+             590:    6(float) Load 563(phi)
+             591:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 590
+             592:    6(float) FMul 589 591
+             593:     30(ptr) AccessChain 588(H) 390
+                              Store 593 592
+             594:    6(float) Load 582(sinTheta)
+             595:    6(float) Load 563(phi)
+             596:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 595
+             597:    6(float) FMul 594 596
+             598:     30(ptr) AccessChain 588(H) 393
+                              Store 598 597
+             599:    6(float) Load 568(cosTheta)
+             600:     30(ptr) AccessChain 588(H) 342
+                              Store 600 599
+             602:     30(ptr) AccessChain 76(N) 342
+             603:    6(float) Load 602
+             604:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 603
+             606:    22(bool) FOrdLessThan 604 605
+             610:  609(bvec3) CompositeConstruct 606 606 606
+             611:   20(fvec3) Select 610 607 608
+                              Store 601(upVector) 611
+             613:   20(fvec3) Load 601(upVector)
+             614:   20(fvec3) Load 76(N)
+             615:   20(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 613 614
+             616:   20(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 615
+                              Store 612(tangentX) 616
+             618:   20(fvec3) Load 76(N)
+             619:   20(fvec3) Load 612(tangentX)
+             620:   20(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 618 619
+                              Store 617(tangentY) 620
+             622:   20(fvec3) Load 612(tangentX)
+             623:     30(ptr) AccessChain 588(H) 390
+             624:    6(float) Load 623
+             625:   20(fvec3) VectorTimesScalar 622 624
+             626:   20(fvec3) Load 617(tangentY)
+             627:     30(ptr) AccessChain 588(H) 393
+             628:    6(float) Load 627
+             629:   20(fvec3) VectorTimesScalar 626 628
+             630:   20(fvec3) FAdd 625 629
+             631:   20(fvec3) Load 76(N)
+             632:     30(ptr) AccessChain 588(H) 342
+             633:    6(float) Load 632
+             634:   20(fvec3) VectorTimesScalar 631 633
+             635:   20(fvec3) FAdd 630 634
+                              Store 621(worldResult) 635
+             636:   20(fvec3) Load 621(worldResult)
+                              ReturnValue 636
+                              FunctionEnd
+83(iTDDistributionGGX(vf3;vf3;f1;):    6(float) Function None 79
+      80(normal):     21(ptr) FunctionParameter
+ 81(half_vector):     21(ptr) FunctionParameter
+  82(roughness2):     30(ptr) FunctionParameter
+              84:             Label
+      639(NdotH):     30(ptr) Variable Function
+     645(alpha2):     30(ptr) Variable Function
+      649(denom):     30(ptr) Variable Function
+             640:   20(fvec3) Load 80(normal)
+             641:   20(fvec3) Load 81(half_vector)
+             642:    6(float) Dot 640 641
+             644:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 642 643 489
+                              Store 639(NdotH) 644
+             646:    6(float) Load 82(roughness2)
+             647:    6(float) Load 82(roughness2)
+             648:    6(float) FMul 646 647
+                              Store 645(alpha2) 648
+             650:    6(float) Load 639(NdotH)
+             651:    6(float) Load 639(NdotH)
+             652:    6(float) FMul 650 651
+             653:    6(float) Load 645(alpha2)
+             654:    6(float) FSub 653 489
+             655:    6(float) FMul 652 654
+             656:    6(float) FAdd 655 489
+                              Store 649(denom) 656
+             658:    6(float) Load 649(denom)
+             659:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 657 658
+                              Store 649(denom) 659
+             660:    6(float) Load 645(alpha2)
+             662:    6(float) Load 649(denom)
+             663:    6(float) FMul 661 662
+             664:    6(float) Load 649(denom)
+             665:    6(float) FMul 663 664
+             666:    6(float) FDiv 660 665
+                              ReturnValue 666
+                              FunctionEnd
+88(iTDCalcF(vf3;f1;):   20(fvec3) Function None 85
+          86(F0):     21(ptr) FunctionParameter
+       87(VdotH):     30(ptr) FunctionParameter
+              89:             Label
+             669:   20(fvec3) Load 86(F0)
+             671:   20(fvec3) Load 86(F0)
+             672:   20(fvec3) FSub 670 671
+             675:    6(float) Load 87(VdotH)
+             676:    6(float) FMul 674 675
+             678:    6(float) FSub 676 677
+             679:    6(float) Load 87(VdotH)
+             680:    6(float) FMul 678 679
+             681:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 673 680
+             682:   20(fvec3) VectorTimesScalar 672 681
+             683:   20(fvec3) FAdd 669 682
+                              ReturnValue 683
+                              FunctionEnd
+94(iTDCalcG(f1;f1;f1;):    6(float) Function None 90
+       91(NdotL):     30(ptr) FunctionParameter
+       92(NdotV):     30(ptr) FunctionParameter
+           93(k):     30(ptr) FunctionParameter
+              95:             Label
+         686(Gl):     30(ptr) Variable Function
+         694(Gv):     30(ptr) Variable Function
+             687:    6(float) Load 91(NdotL)
+             688:    6(float) Load 93(k)
+             689:    6(float) FSub 489 688
+             690:    6(float) FMul 687 689
+             691:    6(float) Load 93(k)
+             692:    6(float) FAdd 690 691
+             693:    6(float) FDiv 489 692
+                              Store 686(Gl) 693
+             695:    6(float) Load 92(NdotV)
+             696:    6(float) Load 93(k)
+             697:    6(float) FSub 489 696
+             698:    6(float) FMul 695 697
+             699:    6(float) Load 93(k)
+             700:    6(float) FAdd 698 699
+             701:    6(float) FDiv 489 700
+                              Store 694(Gv) 701
+             702:    6(float) Load 686(Gl)
+             703:    6(float) Load 694(Gv)
+             704:    6(float) FMul 702 703
+                              ReturnValue 704
+                              FunctionEnd
+107(TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;):96(TDPBRResult) Function None 97
+       98(index):     29(ptr) FunctionParameter
+99(diffuseColor):     21(ptr) FunctionParameter
+100(specularColor):     21(ptr) FunctionParameter
+101(worldSpacePos):     21(ptr) FunctionParameter
+     102(normal):     21(ptr) FunctionParameter
+103(shadowStrength):     30(ptr) FunctionParameter
+104(shadowColor):     21(ptr) FunctionParameter
+  105(camVector):     21(ptr) FunctionParameter
+  106(roughness):     30(ptr) FunctionParameter
+             108:             Label
+        708(res):    707(ptr) Variable Function
+             709:96(TDPBRResult) Load 708(res)
+                              ReturnValue 709
+                              FunctionEnd
+122(TDLightingPBR(vf3;vf3;f1;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;):           2 Function None 109
+110(diffuseContrib):     21(ptr) FunctionParameter
+111(specularContrib):     21(ptr) FunctionParameter
+112(shadowStrengthOut):     30(ptr) FunctionParameter
+      113(index):     29(ptr) FunctionParameter
+114(diffuseColor):     21(ptr) FunctionParameter
+115(specularColor):     21(ptr) FunctionParameter
+116(worldSpacePos):     21(ptr) FunctionParameter
+     117(normal):     21(ptr) FunctionParameter
+118(shadowStrength):     30(ptr) FunctionParameter
+119(shadowColor):     21(ptr) FunctionParameter
+  120(camVector):     21(ptr) FunctionParameter
+  121(roughness):     30(ptr) FunctionParameter
+             123:             Label
+        712(res):    707(ptr) Variable Function
+      713(param):     29(ptr) Variable Function
+      715(param):     21(ptr) Variable Function
+      717(param):     21(ptr) Variable Function
+      719(param):     21(ptr) Variable Function
+      721(param):     21(ptr) Variable Function
+      723(param):     30(ptr) Variable Function
+      725(param):     21(ptr) Variable Function
+      727(param):     21(ptr) Variable Function
+      729(param):     30(ptr) Variable Function
+             714:     28(int) Load 113(index)
+                              Store 713(param) 714
+             716:   20(fvec3) Load 114(diffuseColor)
+                              Store 715(param) 716
+             718:   20(fvec3) Load 115(specularColor)
+                              Store 717(param) 718
+             720:   20(fvec3) Load 116(worldSpacePos)
+                              Store 719(param) 720
+             722:   20(fvec3) Load 117(normal)
+                              Store 721(param) 722
+             724:    6(float) Load 118(shadowStrength)
+                              Store 723(param) 724
+             726:   20(fvec3) Load 119(shadowColor)
+                              Store 725(param) 726
+             728:   20(fvec3) Load 120(camVector)
+                              Store 727(param) 728
+             730:    6(float) Load 121(roughness)
+                              Store 729(param) 730
+             731:96(TDPBRResult) FunctionCall 107(TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;) 713(param) 715(param) 717(param) 719(param) 721(param) 723(param) 725(param) 727(param) 729(param)
+                              Store 712(res) 731
+             732:     21(ptr) AccessChain 712(res) 381
+             733:   20(fvec3) Load 732
+                              Store 110(diffuseContrib) 733
+             734:     21(ptr) AccessChain 712(res) 436
+             735:   20(fvec3) Load 734
+                              Store 111(specularContrib) 735
+             736:     30(ptr) AccessChain 712(res) 337
+             737:    6(float) Load 736
+                              Store 112(shadowStrengthOut) 737
+                              Return
+                              FunctionEnd
+136(TDLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;):           2 Function None 124
+125(diffuseContrib):     21(ptr) FunctionParameter
+126(specularContrib):     21(ptr) FunctionParameter
+      127(index):     29(ptr) FunctionParameter
+128(diffuseColor):     21(ptr) FunctionParameter
+129(specularColor):     21(ptr) FunctionParameter
+130(worldSpacePos):     21(ptr) FunctionParameter
+     131(normal):     21(ptr) FunctionParameter
+132(shadowStrength):     30(ptr) FunctionParameter
+133(shadowColor):     21(ptr) FunctionParameter
+  134(camVector):     21(ptr) FunctionParameter
+  135(roughness):     30(ptr) FunctionParameter
+             137:             Label
+        738(res):    707(ptr) Variable Function
+      739(param):     29(ptr) Variable Function
+      741(param):     21(ptr) Variable Function
+      743(param):     21(ptr) Variable Function
+      745(param):     21(ptr) Variable Function
+      747(param):     21(ptr) Variable Function
+      749(param):     30(ptr) Variable Function
+      751(param):     21(ptr) Variable Function
+      753(param):     21(ptr) Variable Function
+      755(param):     30(ptr) Variable Function
+             740:     28(int) Load 127(index)
+                              Store 739(param) 740
+             742:   20(fvec3) Load 128(diffuseColor)
+                              Store 741(param) 742
+             744:   20(fvec3) Load 129(specularColor)
+                              Store 743(param) 744
+             746:   20(fvec3) Load 130(worldSpacePos)
+                              Store 745(param) 746
+             748:   20(fvec3) Load 131(normal)
+                              Store 747(param) 748
+             750:    6(float) Load 132(shadowStrength)
+                              Store 749(param) 750
+             752:   20(fvec3) Load 133(shadowColor)
+                              Store 751(param) 752
+             754:   20(fvec3) Load 134(camVector)
+                              Store 753(param) 754
+             756:    6(float) Load 135(roughness)
+                              Store 755(param) 756
+             757:96(TDPBRResult) FunctionCall 107(TDLightingPBR(i1;vf3;vf3;vf3;vf3;f1;vf3;vf3;f1;) 739(param) 741(param) 743(param) 745(param) 747(param) 749(param) 751(param) 753(param) 755(param)
+                              Store 738(res) 757
+             758:     21(ptr) AccessChain 738(res) 381
+             759:   20(fvec3) Load 758
+                              Store 125(diffuseContrib) 759
+             760:     21(ptr) AccessChain 738(res) 436
+             761:   20(fvec3) Load 760
+                              Store 126(specularContrib) 761
+                              Return
+                              FunctionEnd
+146(TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1;):96(TDPBRResult) Function None 138
+      139(index):     29(ptr) FunctionParameter
+140(diffuseColor):     21(ptr) FunctionParameter
+141(specularColor):     21(ptr) FunctionParameter
+     142(normal):     21(ptr) FunctionParameter
+  143(camVector):     21(ptr) FunctionParameter
+  144(roughness):     30(ptr) FunctionParameter
+145(ambientOcclusion):     30(ptr) FunctionParameter
+             147:             Label
+        762(res):    707(ptr) Variable Function
+             763:96(TDPBRResult) Load 762(res)
+                              ReturnValue 763
+                              FunctionEnd
+158(TDEnvLightingPBR(vf3;vf3;i1;vf3;vf3;vf3;vf3;f1;f1;):           2 Function None 148
+149(diffuseContrib):     21(ptr) FunctionParameter
+150(specularContrib):     21(ptr) FunctionParameter
+      151(index):     29(ptr) FunctionParameter
+152(diffuseColor):     21(ptr) FunctionParameter
+153(specularColor):     21(ptr) FunctionParameter
+     154(normal):     21(ptr) FunctionParameter
+  155(camVector):     21(ptr) FunctionParameter
+  156(roughness):     30(ptr) FunctionParameter
+157(ambientOcclusion):     30(ptr) FunctionParameter
+             159:             Label
+        766(res):    707(ptr) Variable Function
+      767(param):     29(ptr) Variable Function
+      769(param):     21(ptr) Variable Function
+      771(param):     21(ptr) Variable Function
+      773(param):     21(ptr) Variable Function
+      775(param):     21(ptr) Variable Function
+      777(param):     30(ptr) Variable Function
+      779(param):     30(ptr) Variable Function
+             768:     28(int) Load 151(index)
+                              Store 767(param) 768
+             770:   20(fvec3) Load 152(diffuseColor)
+                              Store 769(param) 770
+             772:   20(fvec3) Load 153(specularColor)
+                              Store 771(param) 772
+             774:   20(fvec3) Load 154(normal)
+                              Store 773(param) 774
+             776:   20(fvec3) Load 155(camVector)
+                              Store 775(param) 776
+             778:    6(float) Load 156(roughness)
+                              Store 777(param) 778
+             780:    6(float) Load 157(ambientOcclusion)
+                              Store 779(param) 780
+             781:96(TDPBRResult) FunctionCall 146(TDEnvLightingPBR(i1;vf3;vf3;vf3;vf3;f1;f1;) 767(param) 769(param) 771(param) 773(param) 775(param) 777(param) 779(param)
+                              Store 766(res) 781
+             782:     21(ptr) AccessChain 766(res) 381
+             783:   20(fvec3) Load 782
+                              Store 149(diffuseContrib) 783
+             784:     21(ptr) AccessChain 766(res) 436
+             785:   20(fvec3) Load 784
+                              Store 150(specularContrib) 785
+                              Return
+                              FunctionEnd
+170(TDLighting(i1;vf3;vf3;f1;vf3;vf3;f1;f1;):160(TDPhongResult) Function None 161
+      162(index):     29(ptr) FunctionParameter
+163(worldSpacePos):     21(ptr) FunctionParameter
+     164(normal):     21(ptr) FunctionParameter
+165(shadowStrength):     30(ptr) FunctionParameter
+166(shadowColor):     21(ptr) FunctionParameter
+  167(camVector):     21(ptr) FunctionParameter
+  168(shininess):     30(ptr) FunctionParameter
+ 169(shininess2):     30(ptr) FunctionParameter
+             171:             Label
+        790(res):    789(ptr) Variable Function
+             786:     28(int) Load 162(index)
+                              SelectionMerge 788 None
+                              Switch 786 787
+             787:               Label
+             792:     21(ptr)   AccessChain 790(res) 381
+                                Store 792 791
+             793:     21(ptr)   AccessChain 790(res) 436
+                                Store 793 791
+             794:     21(ptr)   AccessChain 790(res) 337
+                                Store 794 791
+             795:     30(ptr)   AccessChain 790(res) 377
+                                Store 795 331
+                                Branch 788
+             788:             Label
+             798:160(TDPhongResult) Load 790(res)
+                              ReturnValue 798
+                              FunctionEnd
+185(TDLighting(vf3;vf3;vf3;f1;i1;vf3;vf3;f1;vf3;vf3;f1;f1;):           2 Function None 172
+173(diffuseContrib):     21(ptr) FunctionParameter
+174(specularContrib):     21(ptr) FunctionParameter
+175(specularContrib2):     21(ptr) FunctionParameter
+176(shadowStrengthOut):     30(ptr) FunctionParameter
+      177(index):     29(ptr) FunctionParameter
+178(worldSpacePos):     21(ptr) FunctionParameter
+     179(normal):     21(ptr) FunctionParameter
+180(shadowStrength):     30(ptr) FunctionParameter
+181(shadowColor):     21(ptr) FunctionParameter
+  182(camVector):     21(ptr) FunctionParameter
+  183(shininess):     30(ptr) FunctionParameter
+ 184(shininess2):     30(ptr) FunctionParameter
+             186:             Label
+        804(res):    789(ptr) Variable Function
+             801:     28(int) Load 177(index)
+                              SelectionMerge 803 None
+                              Switch 801 802
+             802:               Label
+             805:     21(ptr)   AccessChain 804(res) 381
+                                Store 805 791
+             806:     21(ptr)   AccessChain 804(res) 436
+                                Store 806 791
+             807:     21(ptr)   AccessChain 804(res) 337
+                                Store 807 791
+             808:     30(ptr)   AccessChain 804(res) 377
+                                Store 808 331
+                                Branch 803
+             803:             Label
+             811:     21(ptr) AccessChain 804(res) 381
+             812:   20(fvec3) Load 811
+                              Store 173(diffuseContrib) 812
+             813:     21(ptr) AccessChain 804(res) 436
+             814:   20(fvec3) Load 813
+                              Store 174(specularContrib) 814
+             815:     21(ptr) AccessChain 804(res) 337
+             816:   20(fvec3) Load 815
+                              Store 175(specularContrib2) 816
+             817:     30(ptr) AccessChain 804(res) 377
+             818:    6(float) Load 817
+                              Store 176(shadowStrengthOut) 818
+                              Return
+                              FunctionEnd
+199(TDLighting(vf3;vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1;f1;):           2 Function None 187
+188(diffuseContrib):     21(ptr) FunctionParameter
+189(specularContrib):     21(ptr) FunctionParameter
+190(specularContrib2):     21(ptr) FunctionParameter
+      191(index):     29(ptr) FunctionParameter
+192(worldSpacePos):     21(ptr) FunctionParameter
+     193(normal):     21(ptr) FunctionParameter
+194(shadowStrength):     30(ptr) FunctionParameter
+195(shadowColor):     21(ptr) FunctionParameter
+  196(camVector):     21(ptr) FunctionParameter
+  197(shininess):     30(ptr) FunctionParameter
+ 198(shininess2):     30(ptr) FunctionParameter
+             200:             Label
+        822(res):    789(ptr) Variable Function
+             819:     28(int) Load 191(index)
+                              SelectionMerge 821 None
+                              Switch 819 820
+             820:               Label
+             823:     21(ptr)   AccessChain 822(res) 381
+                                Store 823 791
+             824:     21(ptr)   AccessChain 822(res) 436
+                                Store 824 791
+             825:     21(ptr)   AccessChain 822(res) 337
+                                Store 825 791
+             826:     30(ptr)   AccessChain 822(res) 377
+                                Store 826 331
+                                Branch 821
+             821:             Label
+             829:     21(ptr) AccessChain 822(res) 381
+             830:   20(fvec3) Load 829
+                              Store 188(diffuseContrib) 830
+             831:     21(ptr) AccessChain 822(res) 436
+             832:   20(fvec3) Load 831
+                              Store 189(specularContrib) 832
+             833:     21(ptr) AccessChain 822(res) 337
+             834:   20(fvec3) Load 833
+                              Store 190(specularContrib2) 834
+                              Return
+                              FunctionEnd
+211(TDLighting(vf3;vf3;i1;vf3;vf3;f1;vf3;vf3;f1;):           2 Function None 201
+202(diffuseContrib):     21(ptr) FunctionParameter
+203(specularContrib):     21(ptr) FunctionParameter
+      204(index):     29(ptr) FunctionParameter
+205(worldSpacePos):     21(ptr) FunctionParameter
+     206(normal):     21(ptr) FunctionParameter
+207(shadowStrength):     30(ptr) FunctionParameter
+208(shadowColor):     21(ptr) FunctionParameter
+  209(camVector):     21(ptr) FunctionParameter
+  210(shininess):     30(ptr) FunctionParameter
+             212:             Label
+        838(res):    789(ptr) Variable Function
+             835:     28(int) Load 204(index)
+                              SelectionMerge 837 None
+                              Switch 835 836
+             836:               Label
+             839:     21(ptr)   AccessChain 838(res) 381
+                                Store 839 791
+             840:     21(ptr)   AccessChain 838(res) 436
+                                Store 840 791
+             841:     21(ptr)   AccessChain 838(res) 337
+                                Store 841 791
+             842:     30(ptr)   AccessChain 838(res) 377
+                                Store 842 331
+                                Branch 837
+             837:             Label
+             845:     21(ptr) AccessChain 838(res) 381
+             846:   20(fvec3) Load 845
+                              Store 202(diffuseContrib) 846
+             847:     21(ptr) AccessChain 838(res) 436
+             848:   20(fvec3) Load 847
+                              Store 203(specularContrib) 848
+                              Return
+                              FunctionEnd
+223(TDLighting(vf3;vf3;vf3;i1;vf3;vf3;vf3;f1;f1;):           2 Function None 213
+214(diffuseContrib):     21(ptr) FunctionParameter
+215(specularContrib):     21(ptr) FunctionParameter
+216(specularContrib2):     21(ptr) FunctionParameter
+      217(index):     29(ptr) FunctionParameter
+218(worldSpacePos):     21(ptr) FunctionParameter
+     219(normal):     21(ptr) FunctionParameter
+  220(camVector):     21(ptr) FunctionParameter
+  221(shininess):     30(ptr) FunctionParameter
+ 222(shininess2):     30(ptr) FunctionParameter
+             224:             Label
+        852(res):    789(ptr) Variable Function
+             849:     28(int) Load 217(index)
+                              SelectionMerge 851 None
+                              Switch 849 850
+             850:               Label
+             853:     21(ptr)   AccessChain 852(res) 381
+                                Store 853 791
+             854:     21(ptr)   AccessChain 852(res) 436
+                                Store 854 791
+             855:     21(ptr)   AccessChain 852(res) 337
+                                Store 855 791
+             856:     30(ptr)   AccessChain 852(res) 377
+                                Store 856 331
+                                Branch 851
+             851:             Label
+             859:     21(ptr) AccessChain 852(res) 381
+             860:   20(fvec3) Load 859
+                              Store 214(diffuseContrib) 860
+             861:     21(ptr) AccessChain 852(res) 436
+             862:   20(fvec3) Load 861
+                              Store 215(specularContrib) 862
+             863:     21(ptr) AccessChain 852(res) 337
+             864:   20(fvec3) Load 863
+                              Store 216(specularContrib2) 864
+                              Return
+                              FunctionEnd
+233(TDLighting(vf3;vf3;i1;vf3;vf3;vf3;f1;):           2 Function None 225
+226(diffuseContrib):     21(ptr) FunctionParameter
+227(specularContrib):     21(ptr) FunctionParameter
+      228(index):     29(ptr) FunctionParameter
+229(worldSpacePos):     21(ptr) FunctionParameter
+     230(normal):     21(ptr) FunctionParameter
+  231(camVector):     21(ptr) FunctionParameter
+  232(shininess):     30(ptr) FunctionParameter
+             234:             Label
+        868(res):    789(ptr) Variable Function
+             865:     28(int) Load 228(index)
+                              SelectionMerge 867 None
+                              Switch 865 866
+             866:               Label
+             869:     21(ptr)   AccessChain 868(res) 381
+                                Store 869 791
+             870:     21(ptr)   AccessChain 868(res) 436
+                                Store 870 791
+             871:     21(ptr)   AccessChain 868(res) 337
+                                Store 871 791
+             872:     30(ptr)   AccessChain 868(res) 377
+                                Store 872 331
+                                Branch 867
+             867:             Label
+             875:     21(ptr) AccessChain 868(res) 381
+             876:   20(fvec3) Load 875
+                              Store 226(diffuseContrib) 876
+             877:     21(ptr) AccessChain 868(res) 436
+             878:   20(fvec3) Load 877
+                              Store 227(specularContrib) 878
+                              Return
+                              FunctionEnd
+240(TDLighting(vf3;i1;vf3;vf3;):           2 Function None 235
+236(diffuseContrib):     21(ptr) FunctionParameter
+      237(index):     29(ptr) FunctionParameter
+238(worldSpacePos):     21(ptr) FunctionParameter
+     239(normal):     21(ptr) FunctionParameter
+             241:             Label
+        882(res):    789(ptr) Variable Function
+             879:     28(int) Load 237(index)
+                              SelectionMerge 881 None
+                              Switch 879 880
+             880:               Label
+             883:     21(ptr)   AccessChain 882(res) 381
+                                Store 883 791
+             884:     21(ptr)   AccessChain 882(res) 436
+                                Store 884 791
+             885:     21(ptr)   AccessChain 882(res) 337
+                                Store 885 791
+             886:     30(ptr)   AccessChain 882(res) 377
+                                Store 886 331
+                                Branch 881
+             881:             Label
+             889:     21(ptr) AccessChain 882(res) 381
+             890:   20(fvec3) Load 889
+                              Store 236(diffuseContrib) 890
+                              Return
+                              FunctionEnd
+249(TDLighting(vf3;i1;vf3;vf3;f1;vf3;):           2 Function None 242
+243(diffuseContrib):     21(ptr) FunctionParameter
+      244(index):     29(ptr) FunctionParameter
+245(worldSpacePos):     21(ptr) FunctionParameter
+     246(normal):     21(ptr) FunctionParameter
+247(shadowStrength):     30(ptr) FunctionParameter
+248(shadowColor):     21(ptr) FunctionParameter
+             250:             Label
+        894(res):    789(ptr) Variable Function
+             891:     28(int) Load 244(index)
+                              SelectionMerge 893 None
+                              Switch 891 892
+             892:               Label
+             895:     21(ptr)   AccessChain 894(res) 381
+                                Store 895 791
+             896:     21(ptr)   AccessChain 894(res) 436
+                                Store 896 791
+             897:     21(ptr)   AccessChain 894(res) 337
+                                Store 897 791
+             898:     30(ptr)   AccessChain 894(res) 377
+                                Store 898 331
+                                Branch 893
+             893:             Label
+             901:     21(ptr) AccessChain 894(res) 381
+             902:   20(fvec3) Load 901
+                              Store 243(diffuseContrib) 902
+                              Return
+                              FunctionEnd
+255(TDProjMap(i1;vf3;vf4;):    7(fvec4) Function None 251
+      252(index):     29(ptr) FunctionParameter
+253(worldSpacePos):     21(ptr) FunctionParameter
+254(defaultColor):      8(ptr) FunctionParameter
+             256:             Label
+             903:     28(int) Load 252(index)
+                              SelectionMerge 905 None
+                              Switch 903 904
+             904:               Label
+             906:    7(fvec4)   Load 254(defaultColor)
+                                ReturnValue 906
+             905:             Label
+                              Unreachable
+                              FunctionEnd
+261(TDFog(vf4;vf3;i1;):    7(fvec4) Function None 257
+      258(color):      8(ptr) FunctionParameter
+259(lightingSpacePosition):     21(ptr) FunctionParameter
+260(cameraIndex):     29(ptr) FunctionParameter
+             262:             Label
+             910:     28(int) Load 260(cameraIndex)
+                              SelectionMerge 912 None
+                              Switch 910 911 
+                                     case 0: 911
+             911:               Label
+             913:    7(fvec4)   Load 258(color)
+                                ReturnValue 913
+             912:             Label
+                              Unreachable
+                              FunctionEnd
+266(TDFog(vf4;vf3;):    7(fvec4) Function None 263
+      264(color):      8(ptr) FunctionParameter
+265(lightingSpacePosition):     21(ptr) FunctionParameter
+             267:             Label
+      917(param):      8(ptr) Variable Function
+      919(param):     21(ptr) Variable Function
+      921(param):     29(ptr) Variable Function
+             918:    7(fvec4) Load 264(color)
+                              Store 917(param) 918
+             920:   20(fvec3) Load 265(lightingSpacePosition)
+                              Store 919(param) 920
+                              Store 921(param) 381
+             922:    7(fvec4) FunctionCall 261(TDFog(vf4;vf3;i1;) 917(param) 919(param) 921(param)
+                              ReturnValue 922
+                              FunctionEnd
+271(TDInstanceTexCoord(i1;vf3;):   20(fvec3) Function None 268
+      269(index):     29(ptr) FunctionParameter
+          270(t):     21(ptr) FunctionParameter
+             272:             Label
+      925(coord):     29(ptr) Variable Function
+       927(samp):      8(ptr) Variable Function
+          936(v):     21(ptr) Variable Function
+             926:     28(int) Load 269(index)
+                              Store 925(coord) 926
+             932:         929 Load 931(sTDInstanceTexCoord)
+             933:     28(int) Load 925(coord)
+             934:         928 Image 932
+             935:    7(fvec4) ImageFetch 934 933
+                              Store 927(samp) 935
+             937:     30(ptr) AccessChain 270(t) 390
+             938:    6(float) Load 937
+             939:     30(ptr) AccessChain 936(v) 390
+                              Store 939 938
+             940:     30(ptr) AccessChain 270(t) 393
+             941:    6(float) Load 940
+             942:     30(ptr) AccessChain 936(v) 393
+                              Store 942 941
+             943:     30(ptr) AccessChain 927(samp) 390
+             944:    6(float) Load 943
+             945:     30(ptr) AccessChain 936(v) 342
+                              Store 945 944
+             946:   20(fvec3) Load 936(v)
+                              Store 270(t) 946
+             947:   20(fvec3) Load 270(t)
+                              ReturnValue 947
+                              FunctionEnd
+275(TDInstanceActive(i1;):    22(bool) Function None 273
+      274(index):     29(ptr) FunctionParameter
+             276:             Label
+      955(coord):     29(ptr) Variable Function
+       957(samp):      8(ptr) Variable Function
+          963(v):     30(ptr) Variable Function
+             951:    950(ptr) AccessChain 376 381
+             952:     28(int) Load 951
+             953:     28(int) Load 274(index)
+             954:     28(int) ISub 953 952
+                              Store 274(index) 954
+             956:     28(int) Load 274(index)
+                              Store 955(coord) 956
+             959:         929 Load 958(sTDInstanceT)
+             960:     28(int) Load 955(coord)
+             961:         928 Image 959
+             962:    7(fvec4) ImageFetch 961 960
+                              Store 957(samp) 962
+             964:     30(ptr) AccessChain 957(samp) 390
+             965:    6(float) Load 964
+                              Store 963(v) 965
+             966:    6(float) Load 963(v)
+             967:    22(bool) FUnordNotEqual 966 331
+                              ReturnValue 967
+                              FunctionEnd
+281(iTDInstanceTranslate(i1;b1;):   20(fvec3) Function None 278
+      279(index):     29(ptr) FunctionParameter
+280(instanceActive):    277(ptr) FunctionParameter
+             282:             Label
+  970(origIndex):     29(ptr) Variable Function
+      976(coord):     29(ptr) Variable Function
+       978(samp):      8(ptr) Variable Function
+          983(v):     21(ptr) Variable Function
+             971:     28(int) Load 279(index)
+                              Store 970(origIndex) 971
+             972:    950(ptr) AccessChain 376 381
+             973:     28(int) Load 972
+             974:     28(int) Load 279(index)
+             975:     28(int) ISub 974 973
+                              Store 279(index) 975
+             977:     28(int) Load 279(index)
+                              Store 976(coord) 977
+             979:         929 Load 958(sTDInstanceT)
+             980:     28(int) Load 976(coord)
+             981:         928 Image 979
+             982:    7(fvec4) ImageFetch 981 980
+                              Store 978(samp) 982
+             984:     30(ptr) AccessChain 978(samp) 393
+             985:    6(float) Load 984
+             986:     30(ptr) AccessChain 983(v) 390
+                              Store 986 985
+             987:     30(ptr) AccessChain 978(samp) 342
+             988:    6(float) Load 987
+             989:     30(ptr) AccessChain 983(v) 393
+                              Store 989 988
+             990:     30(ptr) AccessChain 978(samp) 402
+             991:    6(float) Load 990
+             992:     30(ptr) AccessChain 983(v) 342
+                              Store 992 991
+             993:     30(ptr) AccessChain 978(samp) 390
+             994:    6(float) Load 993
+             995:    22(bool) FUnordNotEqual 994 331
+                              Store 280(instanceActive) 995
+             996:   20(fvec3) Load 983(v)
+                              ReturnValue 996
+                              FunctionEnd
+285(TDInstanceTranslate(i1;):   20(fvec3) Function None 283
+      284(index):     29(ptr) FunctionParameter
+             286:             Label
+     1003(coord):     29(ptr) Variable Function
+      1005(samp):      8(ptr) Variable Function
+         1010(v):     21(ptr) Variable Function
+             999:    950(ptr) AccessChain 376 381
+            1000:     28(int) Load 999
+            1001:     28(int) Load 284(index)
+            1002:     28(int) ISub 1001 1000
+                              Store 284(index) 1002
+            1004:     28(int) Load 284(index)
+                              Store 1003(coord) 1004
+            1006:         929 Load 958(sTDInstanceT)
+            1007:     28(int) Load 1003(coord)
+            1008:         928 Image 1006
+            1009:    7(fvec4) ImageFetch 1008 1007
+                              Store 1005(samp) 1009
+            1011:     30(ptr) AccessChain 1005(samp) 393
+            1012:    6(float) Load 1011
+            1013:     30(ptr) AccessChain 1010(v) 390
+                              Store 1013 1012
+            1014:     30(ptr) AccessChain 1005(samp) 342
+            1015:    6(float) Load 1014
+            1016:     30(ptr) AccessChain 1010(v) 393
+                              Store 1016 1015
+            1017:     30(ptr) AccessChain 1005(samp) 402
+            1018:    6(float) Load 1017
+            1019:     30(ptr) AccessChain 1010(v) 342
+                              Store 1019 1018
+            1020:   20(fvec3) Load 1010(v)
+                              ReturnValue 1020
+                              FunctionEnd
+290(TDInstanceRotateMat(i1;):         287 Function None 288
+      289(index):     29(ptr) FunctionParameter
+             291:             Label
+         1027(v):     21(ptr) Variable Function
+         1029(m):   1028(ptr) Variable Function
+            1023:    950(ptr) AccessChain 376 381
+            1024:     28(int) Load 1023
+            1025:     28(int) Load 289(index)
+            1026:     28(int) ISub 1025 1024
+                              Store 289(index) 1026
+                              Store 1027(v) 791
+                              Store 1029(m) 1031
+            1032:         287 Load 1029(m)
+                              ReturnValue 1032
+                              FunctionEnd
+293(TDInstanceScale(i1;):   20(fvec3) Function None 283
+      292(index):     29(ptr) FunctionParameter
+             294:             Label
+         1039(v):     21(ptr) Variable Function
+            1035:    950(ptr) AccessChain 376 381
+            1036:     28(int) Load 1035
+            1037:     28(int) Load 292(index)
+            1038:     28(int) ISub 1037 1036
+                              Store 292(index) 1038
+                              Store 1039(v) 670
+            1040:   20(fvec3) Load 1039(v)
+                              ReturnValue 1040
+                              FunctionEnd
+296(TDInstancePivot(i1;):   20(fvec3) Function None 283
+      295(index):     29(ptr) FunctionParameter
+             297:             Label
+         1047(v):     21(ptr) Variable Function
+            1043:    950(ptr) AccessChain 376 381
+            1044:     28(int) Load 1043
+            1045:     28(int) Load 295(index)
+            1046:     28(int) ISub 1045 1044
+                              Store 295(index) 1046
+                              Store 1047(v) 791
+            1048:   20(fvec3) Load 1047(v)
+                              ReturnValue 1048
+                              FunctionEnd
+299(TDInstanceRotTo(i1;):   20(fvec3) Function None 283
+      298(index):     29(ptr) FunctionParameter
+             300:             Label
+         1055(v):     21(ptr) Variable Function
+            1051:    950(ptr) AccessChain 376 381
+            1052:     28(int) Load 1051
+            1053:     28(int) Load 298(index)
+            1054:     28(int) ISub 1053 1052
+                              Store 298(index) 1054
+                              Store 1055(v) 607
+            1056:   20(fvec3) Load 1055(v)
+                              ReturnValue 1056
+                              FunctionEnd
+302(TDInstanceRotUp(i1;):   20(fvec3) Function None 283
+      301(index):     29(ptr) FunctionParameter
+             303:             Label
+         1063(v):     21(ptr) Variable Function
+            1059:    950(ptr) AccessChain 376 381
+            1060:     28(int) Load 1059
+            1061:     28(int) Load 301(index)
+            1062:     28(int) ISub 1061 1060
+                              Store 301(index) 1062
+                              Store 1063(v) 1030
+            1064:   20(fvec3) Load 1063(v)
+                              ReturnValue 1064
+                              FunctionEnd
+307(TDInstanceMat(i1;):         304 Function None 305
+         306(id):     29(ptr) FunctionParameter
+             308:             Label
+1067(instanceActive):    277(ptr) Variable Function
+         1069(t):     21(ptr) Variable Function
+     1070(param):     29(ptr) Variable Function
+     1072(param):    277(ptr) Variable Function
+         1082(m):   1081(ptr) Variable Function
+        1088(tt):     21(ptr) Variable Function
+                              Store 1067(instanceActive) 1068
+            1071:     28(int) Load 306(id)
+                              Store 1070(param) 1071
+            1073:   20(fvec3) FunctionCall 281(iTDInstanceTranslate(i1;b1;) 1070(param) 1072(param)
+            1074:    22(bool) Load 1072(param)
+                              Store 1067(instanceActive) 1074
+                              Store 1069(t) 1073
+            1075:    22(bool) Load 1067(instanceActive)
+            1076:    22(bool) LogicalNot 1075
+                              SelectionMerge 1078 None
+                              BranchConditional 1076 1077 1078
+            1077:               Label
+                                ReturnValue 1079
+            1078:             Label
+                              Store 1082(m) 1087
+            1089:   20(fvec3) Load 1069(t)
+                              Store 1088(tt) 1089
+            1090:     30(ptr) AccessChain 1082(m) 381 390
+            1091:    6(float) Load 1090
+            1092:     30(ptr) AccessChain 1088(tt) 390
+            1093:    6(float) Load 1092
+            1094:    6(float) FMul 1091 1093
+            1095:     30(ptr) AccessChain 1082(m) 377 390
+            1096:    6(float) Load 1095
+            1097:    6(float) FAdd 1096 1094
+            1098:     30(ptr) AccessChain 1082(m) 377 390
+                              Store 1098 1097
+            1099:     30(ptr) AccessChain 1082(m) 381 393
+            1100:    6(float) Load 1099
+            1101:     30(ptr) AccessChain 1088(tt) 390
+            1102:    6(float) Load 1101
+            1103:    6(float) FMul 1100 1102
+            1104:     30(ptr) AccessChain 1082(m) 377 393
+            1105:    6(float) Load 1104
+            1106:    6(float) FAdd 1105 1103
+            1107:     30(ptr) AccessChain 1082(m) 377 393
+                              Store 1107 1106
+            1108:     30(ptr) AccessChain 1082(m) 381 342
+            1109:    6(float) Load 1108
+            1110:     30(ptr) AccessChain 1088(tt) 390
+            1111:    6(float) Load 1110
+            1112:    6(float) FMul 1109 1111
+            1113:     30(ptr) AccessChain 1082(m) 377 342
+            1114:    6(float) Load 1113
+            1115:    6(float) FAdd 1114 1112
+            1116:     30(ptr) AccessChain 1082(m) 377 342
+                              Store 1116 1115
+            1117:     30(ptr) AccessChain 1082(m) 381 402
+            1118:    6(float) Load 1117
+            1119:     30(ptr) AccessChain 1088(tt) 390
+            1120:    6(float) Load 1119
+            1121:    6(float) FMul 1118 1120
+            1122:     30(ptr) AccessChain 1082(m) 377 402
+            1123:    6(float) Load 1122
+            1124:    6(float) FAdd 1123 1121
+            1125:     30(ptr) AccessChain 1082(m) 377 402
+                              Store 1125 1124
+            1126:     30(ptr) AccessChain 1082(m) 436 390
+            1127:    6(float) Load 1126
+            1128:     30(ptr) AccessChain 1088(tt) 393
+            1129:    6(float) Load 1128
+            1130:    6(float) FMul 1127 1129
+            1131:     30(ptr) AccessChain 1082(m) 377 390
+            1132:    6(float) Load 1131
+            1133:    6(float) FAdd 1132 1130
+            1134:     30(ptr) AccessChain 1082(m) 377 390
+                              Store 1134 1133
+            1135:     30(ptr) AccessChain 1082(m) 436 393
+            1136:    6(float) Load 1135
+            1137:     30(ptr) AccessChain 1088(tt) 393
+            1138:    6(float) Load 1137
+            1139:    6(float) FMul 1136 1138
+            1140:     30(ptr) AccessChain 1082(m) 377 393
+            1141:    6(float) Load 1140
+            1142:    6(float) FAdd 1141 1139
+            1143:     30(ptr) AccessChain 1082(m) 377 393
+                              Store 1143 1142
+            1144:     30(ptr) AccessChain 1082(m) 436 342
+            1145:    6(float) Load 1144
+            1146:     30(ptr) AccessChain 1088(tt) 393
+            1147:    6(float) Load 1146
+            1148:    6(float) FMul 1145 1147
+            1149:     30(ptr) AccessChain 1082(m) 377 342
+            1150:    6(float) Load 1149
+            1151:    6(float) FAdd 1150 1148
+            1152:     30(ptr) AccessChain 1082(m) 377 342
+                              Store 1152 1151
+            1153:     30(ptr) AccessChain 1082(m) 436 402
+            1154:    6(float) Load 1153
+            1155:     30(ptr) AccessChain 1088(tt) 393
+            1156:    6(float) Load 1155
+            1157:    6(float) FMul 1154 1156
+            1158:     30(ptr) AccessChain 1082(m) 377 402
+            1159:    6(float) Load 1158
+            1160:    6(float) FAdd 1159 1157
+            1161:     30(ptr) AccessChain 1082(m) 377 402
+                              Store 1161 1160
+            1162:     30(ptr) AccessChain 1082(m) 337 390
+            1163:    6(float) Load 1162
+            1164:     30(ptr) AccessChain 1088(tt) 342
+            1165:    6(float) Load 1164
+            1166:    6(float) FMul 1163 1165
+            1167:     30(ptr) AccessChain 1082(m) 377 390
+            1168:    6(float) Load 1167
+            1169:    6(float) FAdd 1168 1166
+            1170:     30(ptr) AccessChain 1082(m) 377 390
+                              Store 1170 1169
+            1171:     30(ptr) AccessChain 1082(m) 337 393
+            1172:    6(float) Load 1171
+            1173:     30(ptr) AccessChain 1088(tt) 342
+            1174:    6(float) Load 1173
+            1175:    6(float) FMul 1172 1174
+            1176:     30(ptr) AccessChain 1082(m) 377 393
+            1177:    6(float) Load 1176
+            1178:    6(float) FAdd 1177 1175
+            1179:     30(ptr) AccessChain 1082(m) 377 393
+                              Store 1179 1178
+            1180:     30(ptr) AccessChain 1082(m) 337 342
+            1181:    6(float) Load 1180
+            1182:     30(ptr) AccessChain 1088(tt) 342
+            1183:    6(float) Load 1182
+            1184:    6(float) FMul 1181 1183
+            1185:     30(ptr) AccessChain 1082(m) 377 342
+            1186:    6(float) Load 1185
+            1187:    6(float) FAdd 1186 1184
+            1188:     30(ptr) AccessChain 1082(m) 377 342
+                              Store 1188 1187
+            1189:     30(ptr) AccessChain 1082(m) 337 402
+            1190:    6(float) Load 1189
+            1191:     30(ptr) AccessChain 1088(tt) 342
+            1192:    6(float) Load 1191
+            1193:    6(float) FMul 1190 1192
+            1194:     30(ptr) AccessChain 1082(m) 377 402
+            1195:    6(float) Load 1194
+            1196:    6(float) FAdd 1195 1193
+            1197:     30(ptr) AccessChain 1082(m) 377 402
+                              Store 1197 1196
+            1198:         304 Load 1082(m)
+                              ReturnValue 1198
+                              FunctionEnd
+310(TDInstanceMat3(i1;):         287 Function None 288
+         309(id):     29(ptr) FunctionParameter
+             311:             Label
+         1201(m):   1028(ptr) Variable Function
+                              Store 1201(m) 1031
+            1202:         287 Load 1201(m)
+                              ReturnValue 1202
+                              FunctionEnd
+313(TDInstanceMat3ForNorm(i1;):         287 Function None 288
+         312(id):     29(ptr) FunctionParameter
+             314:             Label
+         1205(m):   1028(ptr) Variable Function
+     1206(param):     29(ptr) Variable Function
+            1207:     28(int) Load 312(id)
+                              Store 1206(param) 1207
+            1208:         287 FunctionCall 310(TDInstanceMat3(i1;) 1206(param)
+                              Store 1205(m) 1208
+            1209:         287 Load 1205(m)
+                              ReturnValue 1209
+                              FunctionEnd
+318(TDInstanceColor(i1;vf4;):    7(fvec4) Function None 315
+      316(index):     29(ptr) FunctionParameter
+   317(curColor):      8(ptr) FunctionParameter
+             319:             Label
+     1216(coord):     29(ptr) Variable Function
+      1218(samp):      8(ptr) Variable Function
+         1224(v):      8(ptr) Variable Function
+            1212:    950(ptr) AccessChain 376 381
+            1213:     28(int) Load 1212
+            1214:     28(int) Load 316(index)
+            1215:     28(int) ISub 1214 1213
+                              Store 316(index) 1215
+            1217:     28(int) Load 316(index)
+                              Store 1216(coord) 1217
+            1220:         929 Load 1219(sTDInstanceColor)
+            1221:     28(int) Load 1216(coord)
+            1222:         928 Image 1220
+            1223:    7(fvec4) ImageFetch 1222 1221
+                              Store 1218(samp) 1223
+            1225:     30(ptr) AccessChain 1218(samp) 390
+            1226:    6(float) Load 1225
+            1227:     30(ptr) AccessChain 1224(v) 390
+                              Store 1227 1226
+            1228:     30(ptr) AccessChain 1218(samp) 393
+            1229:    6(float) Load 1228
+            1230:     30(ptr) AccessChain 1224(v) 393
+                              Store 1230 1229
+            1231:     30(ptr) AccessChain 1218(samp) 342
+            1232:    6(float) Load 1231
+            1233:     30(ptr) AccessChain 1224(v) 342
+                              Store 1233 1232
+            1234:     30(ptr) AccessChain 1224(v) 402
+                              Store 1234 489
+            1235:     30(ptr) AccessChain 1224(v) 390
+            1236:    6(float) Load 1235
+            1237:     30(ptr) AccessChain 317(curColor) 390
+                              Store 1237 1236
+            1238:     30(ptr) AccessChain 1224(v) 393
+            1239:    6(float) Load 1238
+            1240:     30(ptr) AccessChain 317(curColor) 393
+                              Store 1240 1239
+            1241:     30(ptr) AccessChain 1224(v) 342
+            1242:    6(float) Load 1241
+            1243:     30(ptr) AccessChain 317(curColor) 342
+                              Store 1243 1242
+            1244:    7(fvec4) Load 317(curColor)
+                              ReturnValue 1244
+                              FunctionEnd
+321(TDOutputSwizzle(vf4;):    7(fvec4) Function None 9
+          320(c):      8(ptr) FunctionParameter
+             322:             Label
+            1247:    7(fvec4) Load 320(c)
+                              ReturnValue 1247
+                              FunctionEnd
+327(TDOutputSwizzle(vu4;):  323(ivec4) Function None 325
+          326(c):    324(ptr) FunctionParameter
+             328:             Label
+            1250:  323(ivec4) Load 326(c)
+                              ReturnValue 1250
+                              FunctionEnd
diff --git a/Test/baseResults/vulkan.frag.out b/Test/baseResults/vulkan.frag.out
index 28134ae..78aea82 100644
--- a/Test/baseResults/vulkan.frag.out
+++ b/Test/baseResults/vulkan.frag.out
@@ -25,37 +25,38 @@
 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:46: 'binding' : cannot be used with push_constant 
-ERROR: 0:54: 'binding' : sampler/texture/image requires layout(binding=X) 
-ERROR: 0:55: 'binding' : sampler/texture/image requires layout(binding=X) 
-ERROR: 0:55: 'input_attachment_index' : can only be used with a subpass 
-ERROR: 0:56: 'binding' : sampler/texture/image requires layout(binding=X) 
-ERROR: 0:56: 'input_attachment_index' : can only be used with a subpass 
+ERROR: 0:49: 'push_constant' : Push constants blocks can't be an array 
 ERROR: 0:57: 'binding' : sampler/texture/image requires layout(binding=X) 
-ERROR: 0:57: 'subpass' : requires an input_attachment_index layout qualifier 
 ERROR: 0:58: 'binding' : sampler/texture/image requires layout(binding=X) 
-ERROR: 0:63: 'subpassLoadMS' : no matching overloaded function found 
-ERROR: 0:64: 'subpassLoad' : no matching overloaded function found 
+ERROR: 0:58: 'input_attachment_index' : can only be used with a subpass 
+ERROR: 0:59: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:59: 'input_attachment_index' : can only be used with a subpass 
+ERROR: 0:60: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:60: 'subpass' : requires an input_attachment_index layout qualifier 
+ERROR: 0:61: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:66: 'subpassLoadMS' : no matching overloaded function found 
-ERROR: 0:69: 'subroutine' : not allowed when generating SPIR-V 
-ERROR: 0:69: 'subroutine' : feature not yet implemented 
-ERROR: 0:70: 'subroutine' : not allowed when generating SPIR-V 
-ERROR: 0:70: 'subroutine' : feature not yet implemented 
-ERROR: 0:72: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
-ERROR: 0:76: 'texture' : no matching overloaded function found 
-ERROR: 0:77: 'imageStore' : no matching overloaded function found 
-WARNING: 0:85: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+ERROR: 0:67: 'subpassLoad' : no matching overloaded function found 
+ERROR: 0:69: 'subpassLoadMS' : no matching overloaded function found 
+ERROR: 0:72: 'subroutine' : not allowed when generating SPIR-V 
+ERROR: 0:72: 'subroutine' : feature not yet implemented 
+ERROR: 0:73: 'subroutine' : not allowed when generating SPIR-V 
+ERROR: 0:73: 'subroutine' : feature not yet implemented 
+ERROR: 0:75: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
+ERROR: 0:79: 'texture' : no matching overloaded function found 
+ERROR: 0:80: 'imageStore' : no matching overloaded function found 
+WARNING: 0:88: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
          "precision mediump int; precision highp float;" 
-ERROR: 0:94: 'call argument' : sampler constructor must appear at point of use 
-ERROR: 0:95: 'call argument' : sampler constructor must appear at point of use 
-ERROR: 0:96: ',' : sampler constructor must appear at point of use 
-ERROR: 0:97: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' temp sampler2D' and a right operand of type ' temp sampler2D' (or there is no acceptable conversion)
 ERROR: 0:97: 'call argument' : sampler constructor must appear at point of use 
-ERROR: 0:99: 'gl_NumSamples' : undeclared identifier 
-ERROR: 0:104: 'noise1' : no matching overloaded function found 
-ERROR: 0:105: 'noise2' : no matching overloaded function found 
-ERROR: 0:106: 'noise3' : no matching overloaded function found 
-ERROR: 0:107: 'noise4' : no matching overloaded function found 
-ERROR: 54 compilation errors.  No code generated.
+ERROR: 0:98: 'call argument' : sampler constructor must appear at point of use 
+ERROR: 0:99: ',' : sampler constructor must appear at point of use 
+ERROR: 0:100: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' temp sampler2D' and a right operand of type ' temp sampler2D' (or there is no acceptable conversion)
+ERROR: 0:100: 'call argument' : sampler constructor must appear at point of use 
+ERROR: 0:102: 'gl_NumSamples' : undeclared identifier 
+ERROR: 0:107: 'noise1' : no matching overloaded function found 
+ERROR: 0:108: 'noise2' : no matching overloaded function found 
+ERROR: 0:109: 'noise3' : no matching overloaded function found 
+ERROR: 0:110: 'noise4' : no matching overloaded function found 
+ERROR: 55 compilation errors.  No code generated.
 
 
 ERROR: Linking fragment stage: Only one push_constant block is allowed per stage
diff --git a/Test/baseResults/xfbUnsizedArray.error.tese.out b/Test/baseResults/xfbUnsizedArray.error.tese.out
new file mode 100644
index 0000000..df3495f
--- /dev/null
+++ b/Test/baseResults/xfbUnsizedArray.error.tese.out
@@ -0,0 +1,35 @@
+xfbUnsizedArray.error.tese
+ERROR: 0:4: 'xfb_offset' : unsized array in buffer 0
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 430
+Requested GL_ARB_enhanced_layouts
+in xfb mode
+input primitive = isolines
+vertex spacing = none
+triangle order = none
+using point mode
+ERROR: node is still EOpNull!
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:?   Linker Objects
+0:?     'unsized' (layout( xfb_buffer=0 xfb_offset=0) out unsized 1-element array of 4-component vector of float)
+
+
+Linked tessellation evaluation stage:
+
+
+Shader version: 430
+Requested GL_ARB_enhanced_layouts
+in xfb mode
+input primitive = isolines
+vertex spacing = equal_spacing
+triangle order = ccw
+using point mode
+ERROR: node is still EOpNull!
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:?   Linker Objects
+0:?     'unsized' (layout( xfb_buffer=0 xfb_offset=0) out 1-element array of 4-component vector of float)
+
diff --git a/Test/constantUnaryConversion.comp b/Test/constantUnaryConversion.comp
index 3c479ae..f0710cd 100644
--- a/Test/constantUnaryConversion.comp
+++ b/Test/constantUnaryConversion.comp
@@ -13,11 +13,18 @@
 const uint64_t uint64_t_init = uint64_t(4);

 const float16_t float16_t_init = float16_t(42.0);

 const float32_t float32_t_init = float32_t(13.0);

-const float64_t float64_t_init = float64_t(-4.0);

+const float64_t float64_t_init = float64_t(4.0);

+

+const float16_t neg_float16_t_init = float16_t(-42.0);

+const float32_t neg_float32_t_init = float32_t(-13.0);

+const float64_t neg_float64_t_init = float64_t(-4.0);

 

 #define TYPE_TO_TYPE(x, y) \

     const x y##_to_##x = x(y##_init)

 

+#define TYPE_TO_TYPE_PREFIX(prefix, x, y) \

+    const x prefix##_##y##_to_##x = x(prefix##_##y##_init)

+

 #define TYPE_TO(x)              \

     TYPE_TO_TYPE(x, bool);      \

     TYPE_TO_TYPE(x, int8_t);    \

@@ -45,4 +52,18 @@
 TYPE_TO(float32_t);

 TYPE_TO(float64_t);

 

+#define NEG_FLOAT_TO(x) \

+    TYPE_TO_TYPE_PREFIX(neg, x, float16_t); \

+    TYPE_TO_TYPE_PREFIX(neg, x, float32_t); \

+    TYPE_TO_TYPE_PREFIX(neg, x, float64_t)

+

+NEG_FLOAT_TO(bool);

+NEG_FLOAT_TO(int8_t);

+NEG_FLOAT_TO(int16_t);

+NEG_FLOAT_TO(int32_t);

+NEG_FLOAT_TO(int64_t);

+NEG_FLOAT_TO(float16_t);

+NEG_FLOAT_TO(float32_t);

+NEG_FLOAT_TO(float64_t);

+

 void main() {}

diff --git a/Test/coord_conventions.frag b/Test/coord_conventions.frag
new file mode 100644
index 0000000..4ae6060
--- /dev/null
+++ b/Test/coord_conventions.frag
@@ -0,0 +1,36 @@
+#version 140
+
+#extension GL_ARB_fragment_coord_conventions: require
+#extension GL_ARB_explicit_attrib_location : enable
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+
+in vec4 i;
+
+layout (origin_upper_left,pixel_center_integer) in vec4 gl_FragCoord;
+layout (location = 0) out vec4 myColor;
+
+const float eps=0.001;
+
+void main() 
+{
+    myColor = vec4(0.2);
+    if (gl_FragCoord.y >= 10) {
+        myColor.b = 0.8;
+    }
+    if (gl_FragCoord.y == trunc(gl_FragCoord.y)) {
+        myColor.g = 0.8;
+    }
+    if (gl_FragCoord.x == trunc(gl_FragCoord.x)) {
+        myColor.r = 0.8;
+    }
+
+    vec4 diff = gl_FragCoord - i;
+    if (abs(diff.z)>eps) 
+        myColor.b = 0.5;
+    if (abs(diff.w)>eps) 
+        myColor.a = 0.5;
+
+}
\ No newline at end of file
diff --git a/Test/enhanced.0.frag b/Test/enhanced.0.frag
new file mode 100644
index 0000000..7a42c05
--- /dev/null
+++ b/Test/enhanced.0.frag
@@ -0,0 +1,9 @@
+#version 450
+
+in vec3 v;
+
+void main()
+{
+    vec4 color = vec4(v);
+}
+
diff --git a/Test/enhanced.1.frag b/Test/enhanced.1.frag
new file mode 100644
index 0000000..9aab34d
--- /dev/null
+++ b/Test/enhanced.1.frag
@@ -0,0 +1,11 @@
+#version 450
+
+in Vertex {
+    vec4 v;
+} vVert;
+
+void main()
+{
+    vec4 color = vec4(vVert.v2.rgb, 1.0);
+}
+
diff --git a/Test/enhanced.2.frag b/Test/enhanced.2.frag
new file mode 100644
index 0000000..c3c194c
--- /dev/null
+++ b/Test/enhanced.2.frag
@@ -0,0 +1,7 @@
+#version 450
+
+void main()
+{
+    vec3 color = vec3(0.0,0.0,0.0,1.0);
+}
+
diff --git a/Test/enhanced.3.frag b/Test/enhanced.3.frag
new file mode 100644
index 0000000..1de9f4b
--- /dev/null
+++ b/Test/enhanced.3.frag
@@ -0,0 +1,16 @@
+#version 450 core
+
+layout (location = 0) out vec4 FragColor;
+
+layout (location = 0) in VS_OUT
+{
+    vec2 foobar;
+} fs_in;
+
+layout (binding = 1) uniform sampler2D t0;
+
+void main()
+{             
+    FragColor = texture(t0, fs_in.foobar);   
+}
+
diff --git a/Test/enhanced.3.vert b/Test/enhanced.3.vert
new file mode 100644
index 0000000..043ee24
--- /dev/null
+++ b/Test/enhanced.3.vert
@@ -0,0 +1,22 @@
+#version 450 core
+
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTexCoords;
+
+layout (binding = 0) uniform anonblock {
+    mat4 model;
+    mat4 view;
+    mat4 projection;
+} ;
+
+layout (location = 0) out VS_OUT
+{
+    vec2 TexCoords;
+} vs_out;
+
+void main()
+{
+    gl_Position = projection * view * model * vec4(aPos, 1.0);    
+    vs_out.TexCoords = aTexCoords;
+}
+
diff --git a/Test/enhanced.4.frag b/Test/enhanced.4.frag
new file mode 100644
index 0000000..9c16606
--- /dev/null
+++ b/Test/enhanced.4.frag
@@ -0,0 +1,16 @@
+#version 450 core
+
+layout (location = 0) out vec4 FragColor;
+
+layout (location = 1) in VS_OUT
+{
+    vec2 TexCoords;
+} fs_in;
+
+layout (binding = 1) uniform sampler2D t0;
+
+void main()
+{             
+    FragColor = texture(t0, fs_in.TexCoords);   
+}
+
diff --git a/Test/enhanced.4.vert b/Test/enhanced.4.vert
new file mode 100644
index 0000000..043ee24
--- /dev/null
+++ b/Test/enhanced.4.vert
@@ -0,0 +1,22 @@
+#version 450 core
+
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTexCoords;
+
+layout (binding = 0) uniform anonblock {
+    mat4 model;
+    mat4 view;
+    mat4 projection;
+} ;
+
+layout (location = 0) out VS_OUT
+{
+    vec2 TexCoords;
+} vs_out;
+
+void main()
+{
+    gl_Position = projection * view * model * vec4(aPos, 1.0);    
+    vs_out.TexCoords = aTexCoords;
+}
+
diff --git a/Test/enhanced.5.frag b/Test/enhanced.5.frag
new file mode 100644
index 0000000..b2a51e2
--- /dev/null
+++ b/Test/enhanced.5.frag
@@ -0,0 +1,16 @@
+#version 450 core
+
+layout (location = 0) out vec4 FragColor;
+
+layout (location = 0) in VS_OUT
+{
+    vec3 TexCoords;
+} fs_in;
+
+layout (binding = 1) uniform sampler2D t0;
+
+void main()
+{             
+    FragColor = texture(t0, fs_in.TexCoords.xy);   
+}
+
diff --git a/Test/enhanced.5.vert b/Test/enhanced.5.vert
new file mode 100644
index 0000000..043ee24
--- /dev/null
+++ b/Test/enhanced.5.vert
@@ -0,0 +1,22 @@
+#version 450 core
+
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTexCoords;
+
+layout (binding = 0) uniform anonblock {
+    mat4 model;
+    mat4 view;
+    mat4 projection;
+} ;
+
+layout (location = 0) out VS_OUT
+{
+    vec2 TexCoords;
+} vs_out;
+
+void main()
+{
+    gl_Position = projection * view * model * vec4(aPos, 1.0);    
+    vs_out.TexCoords = aTexCoords;
+}
+
diff --git a/Test/enhanced.6.frag b/Test/enhanced.6.frag
new file mode 100644
index 0000000..e1cf685
--- /dev/null
+++ b/Test/enhanced.6.frag
@@ -0,0 +1,16 @@
+#version 450 core
+
+layout (location = 0) out vec4 FragColor;
+
+layout (location = 0) in VS_OUT
+{
+    vec2 TexCoords;
+} fs_in[1];
+
+layout (binding = 1) uniform sampler2D t0;
+
+void main()
+{             
+    FragColor = texture(t0, fs_in[0].TexCoords);   
+}
+
diff --git a/Test/enhanced.6.vert b/Test/enhanced.6.vert
new file mode 100644
index 0000000..876a903
--- /dev/null
+++ b/Test/enhanced.6.vert
@@ -0,0 +1,22 @@
+#version 450 core
+
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTexCoords;
+
+layout (binding = 0) uniform anonblock {
+    mat4 model;
+    mat4 view;
+    mat4 projection;
+} ;
+
+layout (location = 0) out VS_OUT
+{
+    vec2 TexCoords;
+} vs_out[2];
+
+void main()
+{
+    gl_Position = projection * view * model * vec4(aPos, 1.0);    
+    vs_out[0].TexCoords = aTexCoords;
+}
+
diff --git a/Test/enhanced.7.frag b/Test/enhanced.7.frag
new file mode 100644
index 0000000..f6e5279
--- /dev/null
+++ b/Test/enhanced.7.frag
@@ -0,0 +1,20 @@
+#version 450 core
+
+layout (location = 0) out vec4 FragColor;
+
+layout (location = 0) in Vertex
+{
+        vec4 color;
+        vec3 worldSpacePos;
+        vec3 worldSpaceNorm;
+        vec2 texCoord1;
+        flat int cameraIndex;
+} fs_in;
+
+layout (binding = 1) uniform sampler2D t0;
+
+void main()
+{             
+    FragColor = texture(t0, fs_in.texCoord1);   
+}
+
diff --git a/Test/enhanced.7.vert b/Test/enhanced.7.vert
new file mode 100644
index 0000000..4e70a61
--- /dev/null
+++ b/Test/enhanced.7.vert
@@ -0,0 +1,27 @@
+#version 450 core
+
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTexCoords;
+
+layout (binding = 0) uniform anonblock {
+    mat4 model;
+    mat4 view;
+    mat4 projection;
+} ;
+
+layout (location = 0) out Vertex
+{
+        vec4 color;
+        vec3 worldSpacePos;
+        vec3 worldSpaceNorm;
+        vec2 texCoord1;
+        flat int cameraIndex;
+        float ii;
+} vs_out;
+
+void main()
+{
+    gl_Position = projection * view * model * vec4(aPos, 1.0);    
+    vs_out.texCoord1 = aTexCoords;
+}
+
diff --git a/Test/floatBitsToInt.vert b/Test/floatBitsToInt.vert
new file mode 100644
index 0000000..a6bb18a
--- /dev/null
+++ b/Test/floatBitsToInt.vert
@@ -0,0 +1,18 @@
+#version 150
+#extension GL_ARB_gpu_shader5 : require
+uniform int expected_value;
+uniform float value;
+out     vec4 result;
+void main()
+{
+    result = vec4(1.0, 1.0, 1.0, 1.0);
+    int ret_val = floatBitsToInt(value);
+    if (expected_value != ret_val){  result = vec4(0.0, 0.0, 0.0, 0.0); }
+
+    switch (gl_VertexID)  {
+      case 0: gl_Position = vec4(-1.0, 1.0, 0.0, 1.0); break;
+      case 1: gl_Position = vec4( 1.0, 1.0, 0.0, 1.0); break;
+      case 2: gl_Position = vec4(-1.0,-1.0, 0.0, 1.0); break;
+      case 3: gl_Position = vec4( 1.0,-1.0, 0.0, 1.0); break;
+    }
+}
\ No newline at end of file
diff --git a/Test/gl_FragCoord.frag b/Test/gl_FragCoord.frag
new file mode 100644
index 0000000..7bb1792
--- /dev/null
+++ b/Test/gl_FragCoord.frag
@@ -0,0 +1,31 @@
+#version 150 core
+#extension GL_ARB_explicit_attrib_location : enable
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+
+layout (origin_upper_left,pixel_center_integer) in vec4 gl_FragCoord;
+float myGlobalVar = gl_FragCoord.x;
+layout (origin_upper_left,pixel_center_integer) in vec4 gl_FragCoord;
+
+in vec4 i;
+layout (location = 0) out vec4 myColor;
+const float eps=0.001;
+
+void main() {
+    myColor = vec4(0.2);
+    if (gl_FragCoord.y >= 10) {
+        myColor.b = 0.8;
+    }
+    if (gl_FragCoord.y == trunc(gl_FragCoord.y)) {
+        myColor.g = 0.8;
+    }
+    if (gl_FragCoord.x == trunc(gl_FragCoord.x)) {
+        myColor.r = 0.8;
+    }
+
+    vec4 diff = gl_FragCoord - i;
+    if (abs(diff.z)>eps) myColor.b = 0.5;
+    if (abs(diff.w)>eps) myColor.a = 0.5;
+}
diff --git a/Test/glsl.versionOverride.comp b/Test/glsl.versionOverride.comp
new file mode 100644
index 0000000..f72663e
--- /dev/null
+++ b/Test/glsl.versionOverride.comp
@@ -0,0 +1,11 @@
+/*

+

+glslangValidator.exe --glsl-version 460 -V -S comp -o glsl.versionOverride.comp.out glsl.versionOverride.comp

+

+*/

+

+#version 110

+

+void main() 

+{

+}  

diff --git a/Test/glsl.versionOverride.frag b/Test/glsl.versionOverride.frag
new file mode 100644
index 0000000..1267994
--- /dev/null
+++ b/Test/glsl.versionOverride.frag
@@ -0,0 +1,11 @@
+/*

+

+glslangValidator.exe --glsl-version 420 -V -S frag -o glsl.versionOverride.frag.out glsl.versionOverride.frag

+

+*/

+

+#version 110

+

+void main()

+{

+}

diff --git a/Test/glsl.versionOverride.geom b/Test/glsl.versionOverride.geom
new file mode 100644
index 0000000..bcfc2f2
--- /dev/null
+++ b/Test/glsl.versionOverride.geom
@@ -0,0 +1,16 @@
+/*

+

+glslangValidator.exe --glsl-version 430 -V -S geom -o glsl.versionOverride.geom.out glsl.versionOverride.geom

+

+*/

+

+#version 110

+

+layout (points) in;

+layout (line_strip, max_vertices = 2) out;

+

+void main() {    

+    EmitVertex();

+    EmitVertex();   

+    EndPrimitive();

+}  

diff --git a/Test/glsl.versionOverride.tesc b/Test/glsl.versionOverride.tesc
new file mode 100644
index 0000000..3b7b1e3
--- /dev/null
+++ b/Test/glsl.versionOverride.tesc
@@ -0,0 +1,13 @@
+/*

+

+glslangValidator.exe --glsl-version 440 -V -S tesc -o glsl.versionOverride.tesc.out glsl.versionOverride.tesc

+

+*/

+

+#version 110

+

+layout(vertices = 3) out;

+

+void main() 

+{

+}  

diff --git a/Test/glsl.versionOverride.tese b/Test/glsl.versionOverride.tese
new file mode 100644
index 0000000..e92d5a9
--- /dev/null
+++ b/Test/glsl.versionOverride.tese
@@ -0,0 +1,13 @@
+/*

+

+glslangValidator.exe --glsl-version 450 -V -S tese -o glsl.versionOverride.tese.out glsl.versionOverride.tese

+

+*/

+

+#version 110

+

+layout(triangles) in;

+

+void main() 

+{

+}  

diff --git a/Test/glsl.versionOverride.vert b/Test/glsl.versionOverride.vert
new file mode 100644
index 0000000..2d5effc
--- /dev/null
+++ b/Test/glsl.versionOverride.vert
@@ -0,0 +1,11 @@
+/*

+

+glslangValidator.exe --glsl-version 410 -V -S vert -o glsl.versionOverride.vert.out glsl.versionOverride.vert

+

+*/

+

+#version 110

+

+void main()

+{

+}

diff --git a/Test/hlsl.namespace.frag b/Test/hlsl.namespace.frag
index 76c3062..d2b0445 100644
--- a/Test/hlsl.namespace.frag
+++ b/Test/hlsl.namespace.frag
@@ -12,7 +12,7 @@
         float4 getVec() { return v2; }

         

         class C1 {

-            float4 getVec() { return v2; }

+            static float4 getVec() { return v2; }

         };

     }

 }

diff --git a/Test/hlsl.spv.1.6.discard.frag b/Test/hlsl.spv.1.6.discard.frag
new file mode 100644
index 0000000..7d9271c
--- /dev/null
+++ b/Test/hlsl.spv.1.6.discard.frag
@@ -0,0 +1,14 @@
+void foo(float f)
+{
+	if (f < 1.0)
+		discard;
+}
+
+void PixelShaderFunction(float4 input) : COLOR0
+{
+    foo(input.z);
+	if (input.x)
+		discard;
+	float f = input.x;
+	discard;
+}
diff --git a/Test/hlsl.structbuffer.rwbyte2.comp b/Test/hlsl.structbuffer.rwbyte2.comp
new file mode 100644
index 0000000..42d61c0
--- /dev/null
+++ b/Test/hlsl.structbuffer.rwbyte2.comp
@@ -0,0 +1,10 @@
+RWStructuredBuffer<uint> g_sbuf;
+RWByteAddressBuffer g_bbuf;
+
+
+void main()
+{   
+    uint f = g_bbuf.Load(16);
+    g_sbuf[0] = f;
+}
+
diff --git a/Test/hlsl.w-recip.frag b/Test/hlsl.w-recip.frag
new file mode 100644
index 0000000..4812d26
--- /dev/null
+++ b/Test/hlsl.w-recip.frag
@@ -0,0 +1,12 @@
+float4 AmbientColor = float4(1, 0.5, 0, 1);
+float4 AmbientColor2 = float4(0.5, 1, 0, 0);
+
+float4 main(float4 vpos : SV_POSITION) : SV_TARGET
+{
+    float4 vpos_t = float4(vpos.xyz, 1 / vpos.w);
+    if (vpos_t.x < 400)
+        return AmbientColor;
+    else
+        return AmbientColor2;
+}
+
diff --git a/Test/hlsl.w-recip2.frag b/Test/hlsl.w-recip2.frag
new file mode 100644
index 0000000..8ef49c9
--- /dev/null
+++ b/Test/hlsl.w-recip2.frag
@@ -0,0 +1,19 @@
+struct VSOutput
+{
+    float4 PositionPS 	        : SV_Position;
+    float3 PosInLightViewSpace 	: LIGHT_SPACE_POS;
+    float3 NormalWS 	        : NORMALWS;
+    float2 TexCoord 	        : TEXCOORD;
+};
+
+float4 AmbientColor = float4(1, 0.5, 0, 1);
+float4 AmbientColor2 = float4(0.5, 1, 0, 0);
+
+float4 main(VSOutput VSOut) : SV_TARGET
+{
+    if (VSOut.PositionPS.x < 400)
+        return AmbientColor;
+    else
+        return AmbientColor2;
+}
+
diff --git a/Test/iomap.blockOutVariableIn.2.vert b/Test/iomap.blockOutVariableIn.2.vert
new file mode 100644
index 0000000..67f45c9
--- /dev/null
+++ b/Test/iomap.blockOutVariableIn.2.vert
@@ -0,0 +1,14 @@
+#version 440

+

+layout(location = 0) out Block

+{

+    vec4 a1;

+    vec2 a2;

+};

+

+void main()

+{

+    a1 = vec4(1.0);

+    a2 = vec2(0.5);

+    gl_Position = vec4(1.0);

+}

diff --git a/Test/iomap.blockOutVariableIn.frag b/Test/iomap.blockOutVariableIn.frag
new file mode 100644
index 0000000..f2cb26e
--- /dev/null
+++ b/Test/iomap.blockOutVariableIn.frag
@@ -0,0 +1,11 @@
+#version 440

+

+layout(location = 0) in vec4 a1;

+layout(location = 1) in vec2 a2;

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    color = vec4(a1.xy, a2);

+}

diff --git a/Test/iomap.blockOutVariableIn.geom b/Test/iomap.blockOutVariableIn.geom
new file mode 100644
index 0000000..feefdd1
--- /dev/null
+++ b/Test/iomap.blockOutVariableIn.geom
@@ -0,0 +1,28 @@
+#version 440

+

+layout(triangles) in;

+layout(triangle_strip, max_vertices=3) out;

+

+layout(location = 0) in vec4 in_a1[3];

+layout(location = 1) in vec2 in_a2[3];

+

+layout(location = 0) out vec4 a1;

+layout(location = 1) out vec2 a2;

+

+void main()

+{

+    a1 = in_a1[0];

+    a2 = in_a2[0];

+    gl_Position = vec4(1.0);

+    EmitVertex();

+

+    a1 = in_a1[1];

+    a2 = in_a2[1];

+    gl_Position = vec4(1.0);

+    EmitVertex();

+

+    a1 = in_a1[2];

+    a2 = in_a2[2];

+    gl_Position = vec4(1.0);

+    EmitVertex();

+}

diff --git a/Test/iomap.blockOutVariableIn.vert b/Test/iomap.blockOutVariableIn.vert
new file mode 100644
index 0000000..67f45c9
--- /dev/null
+++ b/Test/iomap.blockOutVariableIn.vert
@@ -0,0 +1,14 @@
+#version 440

+

+layout(location = 0) out Block

+{

+    vec4 a1;

+    vec2 a2;

+};

+

+void main()

+{

+    a1 = vec4(1.0);

+    a2 = vec2(0.5);

+    gl_Position = vec4(1.0);

+}

diff --git a/Test/iomap.variableOutBlockIn.2.vert b/Test/iomap.variableOutBlockIn.2.vert
new file mode 100644
index 0000000..f9b80b4
--- /dev/null
+++ b/Test/iomap.variableOutBlockIn.2.vert
@@ -0,0 +1,11 @@
+#version 440

+

+layout(location = 0) out vec4 a1;

+layout(location = 1) out vec2 a2;

+

+void main()

+{

+    a1 = vec4(1.0);

+    a2 = vec2(0.5);

+    gl_Position = vec4(1.0);

+}

diff --git a/Test/iomap.variableOutBlockIn.frag b/Test/iomap.variableOutBlockIn.frag
new file mode 100644
index 0000000..967d769
--- /dev/null
+++ b/Test/iomap.variableOutBlockIn.frag
@@ -0,0 +1,13 @@
+#version 440

+

+layout(location = 0) in Inputs {

+    vec4 a1;

+    vec2 a2;

+};

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    color = vec4(a1.xy, a2);

+}

diff --git a/Test/iomap.variableOutBlockIn.geom b/Test/iomap.variableOutBlockIn.geom
new file mode 100644
index 0000000..637ddab
--- /dev/null
+++ b/Test/iomap.variableOutBlockIn.geom
@@ -0,0 +1,19 @@
+#version 440

+

+layout(triangles) in;

+layout(triangle_strip, max_vertices=3) out;

+

+layout(location = 0) in Inputs {

+    vec4 a1;

+    vec2 a2;

+} gin[3];

+

+layout(location = 0) out vec4 a1;

+layout(location = 1) out vec2 a2;

+

+void main()

+{

+    a1 = vec4(1.0);

+    a2 = vec2(0.5);

+    gl_Position = vec4(1.0);

+}

diff --git a/Test/iomap.variableOutBlockIn.vert b/Test/iomap.variableOutBlockIn.vert
new file mode 100644
index 0000000..f9b80b4
--- /dev/null
+++ b/Test/iomap.variableOutBlockIn.vert
@@ -0,0 +1,11 @@
+#version 440

+

+layout(location = 0) out vec4 a1;

+layout(location = 1) out vec2 a2;

+

+void main()

+{

+    a1 = vec4(1.0);

+    a2 = vec2(0.5);

+    gl_Position = vec4(1.0);

+}

diff --git a/Test/noMatchingFunction.frag b/Test/noMatchingFunction.frag
new file mode 100644
index 0000000..d095645
--- /dev/null
+++ b/Test/noMatchingFunction.frag
@@ -0,0 +1,19 @@
+#version 330
+
+struct S
+{
+	float a;
+};
+
+float func(S s)
+{
+	return s.a;
+}
+
+layout(location = 0) out vec4 o_color;
+
+void main()
+{
+	float c = func(1.0f); // ERROR: no matching function
+	o_color = vec4(c);
+}
diff --git a/Test/runtests b/Test/runtests
index a7bdda7..2ee0db0 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -255,6 +255,15 @@
 diff -b $BASEDIR/hlsl.y-negate-3.vert.out $TARGETDIR/hlsl.y-negate-3.vert.out || HASERROR=1
 
 #
+# Testing position W reciprocal
+#
+echo "Testing position W reciprocal"
+run -H -e main -V -D -Od -H -i --hlsl-dx-position-w hlsl.w-recip.frag > $TARGETDIR/hlsl.w-recip.frag.out
+diff -b $BASEDIR/hlsl.w-recip.frag.out $TARGETDIR/hlsl.w-recip.frag.out || HASERROR=1
+run -H -e main -V -D -Od -H -i --hlsl-dx-position-w hlsl.w-recip2.frag > $TARGETDIR/hlsl.w-recip2.frag.out
+diff -b $BASEDIR/hlsl.w-recip2.frag.out $TARGETDIR/hlsl.w-recip2.frag.out || HASERROR=1
+
+#
 # Testing hlsl_functionality1
 #
 echo "Testing hlsl_functionality1"
@@ -289,6 +298,46 @@
 run --auto-sampled-textures -H -Od -S frag glsl.autosampledtextures.frag > $TARGETDIR/glsl.autosampledtextures.frag.out
 diff -b $BASEDIR/glsl.autosampledtextures.frag.out $TARGETDIR/glsl.autosampledtextures.frag.out || HASERROR=1
 
+# Test --glsl-version
+#
+echo "Testing --glsl-version"
+run --glsl-version 410 -V -S vert glsl.versionOverride.vert > $TARGETDIR/glsl.versionOverride.vert.out
+diff -b $BASEDIR/glsl.versionOverride.vert.out $TARGETDIR/glsl.versionOverride.vert.out || HASERROR=1
+run --glsl-version 420 -V -S frag glsl.versionOverride.frag > $TARGETDIR/glsl.versionOverride.frag.out
+diff -b $BASEDIR/glsl.versionOverride.frag.out $TARGETDIR/glsl.versionOverride.frag.out || HASERROR=1
+run --glsl-version 430 -V -S geom glsl.versionOverride.geom > $TARGETDIR/glsl.versionOverride.geom.out
+diff -b $BASEDIR/glsl.versionOverride.geom.out $TARGETDIR/glsl.versionOverride.geom.out || HASERROR=1
+run --glsl-version 440 -V -S tesc glsl.versionOverride.tesc > $TARGETDIR/glsl.versionOverride.tesc.out
+diff -b $BASEDIR/glsl.versionOverride.tesc.out $TARGETDIR/glsl.versionOverride.tesc.out || HASERROR=1
+run --glsl-version 450 -V -S tese glsl.versionOverride.tese > $TARGETDIR/glsl.versionOverride.tese.out
+diff -b $BASEDIR/glsl.versionOverride.tese.out $TARGETDIR/glsl.versionOverride.tese.out || HASERROR=1
+run --glsl-version 460 -V -S comp glsl.versionOverride.comp > $TARGETDIR/glsl.versionOverride.comp.out
+diff -b $BASEDIR/glsl.versionOverride.comp.out $TARGETDIR/glsl.versionOverride.comp.out || HASERROR=1
+
+#
+# Test --enhanced-msgs
+#
+
+echo "Testing enhanced-msgs"
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.0.frag > $TARGETDIR/enhanced.0.frag.out
+diff -b $BASEDIR/enhanced.0.frag.out $TARGETDIR/enhanced.0.frag.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.1.frag > $TARGETDIR/enhanced.1.frag.out
+diff -b $BASEDIR/enhanced.1.frag.out $TARGETDIR/enhanced.1.frag.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.2.frag > $TARGETDIR/enhanced.2.frag.out
+diff -b $BASEDIR/enhanced.2.frag.out $TARGETDIR/enhanced.2.frag.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.3.vert enhanced.3.frag > $TARGETDIR/enhanced.3.link.out
+diff -b $BASEDIR/enhanced.3.link.out $TARGETDIR/enhanced.3.link.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.4.vert enhanced.4.frag > $TARGETDIR/enhanced.4.link.out
+diff -b $BASEDIR/enhanced.4.link.out $TARGETDIR/enhanced.4.link.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.5.vert enhanced.5.frag > $TARGETDIR/enhanced.5.link.out
+diff -b $BASEDIR/enhanced.5.link.out $TARGETDIR/enhanced.5.link.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.6.vert enhanced.6.frag > $TARGETDIR/enhanced.6.link.out
+diff -b $BASEDIR/enhanced.6.link.out $TARGETDIR/enhanced.6.link.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml enhanced.7.vert enhanced.7.frag > $TARGETDIR/enhanced.7.link.out
+diff -b $BASEDIR/enhanced.7.link.out $TARGETDIR/enhanced.7.link.out || HASERROR=1
+run --enhanced-msgs -V --target-env vulkan1.2 --amb --aml spv.textureError.frag > $TARGETDIR/spv.textureError.frag.out
+diff -b $BASEDIR/spv.textureError.frag.out $TARGETDIR/spv.textureError.frag.out || HASERROR=1
+
 #
 # Final checking
 #
diff --git a/Test/spv.1.6.conditionalDiscard.frag b/Test/spv.1.6.conditionalDiscard.frag
new file mode 100644
index 0000000..ea80337
--- /dev/null
+++ b/Test/spv.1.6.conditionalDiscard.frag
@@ -0,0 +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;

+}

diff --git a/Test/spv.1.6.helperInvocation.frag b/Test/spv.1.6.helperInvocation.frag
new file mode 100644
index 0000000..4d306db
--- /dev/null
+++ b/Test/spv.1.6.helperInvocation.frag
@@ -0,0 +1,10 @@
+#version 310 es

+precision highp float;
+

+out vec4 outp;

+void main()

+{

+    if (gl_HelperInvocation)

+        ++outp;

+}

+
diff --git a/Test/spv.1.6.specConstant.comp b/Test/spv.1.6.specConstant.comp
new file mode 100644
index 0000000..6b47515
--- /dev/null
+++ b/Test/spv.1.6.specConstant.comp
@@ -0,0 +1,18 @@
+#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 foo(uvec3 wgs)
+{
+    bi.a = wgs.x * gl_WorkGroupSize.y * wgs.z;
+}
+
+void main()
+{
+    foo(gl_WorkGroupSize);
+}
diff --git a/Test/spv.float16NoRelaxed.vert b/Test/spv.float16NoRelaxed.vert
new file mode 100644
index 0000000..d594a1d
--- /dev/null
+++ b/Test/spv.float16NoRelaxed.vert
@@ -0,0 +1,16 @@
+#version 450
+#extension GL_KHR_shader_subgroup_vote: enable
+#extension GL_EXT_shader_subgroup_extended_types_float16 : enable
+layout(set = 0, binding = 0, std430) buffer Buffer1
+{
+  uint result[];
+};
+
+void main (void)
+{
+  uint tempRes;
+  float16_t valueNoEqual = float16_t(gl_SubgroupInvocationID);
+  tempRes = subgroupAllEqual(valueNoEqual) ? 0x0 : 0x10;
+  result[gl_VertexIndex] = tempRes;
+}
+
diff --git a/Test/spv.intrinsicsSpecConst.vert b/Test/spv.intrinsicsSpecConst.vert
deleted file mode 100644
index 19cc5ef..0000000
--- a/Test/spv.intrinsicsSpecConst.vert
+++ /dev/null
@@ -1,14 +0,0 @@
-#version 450 core

-

-#extension GL_EXT_spirv_intrinsics: enable

-

-layout(constant_id = 5) const uint targetWidth = 32;

-spirv_execution_mode_id(4460/*=DenormFlushToZero*/, targetWidth);

-

-layout(constant_id = 6) const uint builtIn = 1;

-spirv_decorate_id(11/*=BuiltIn*/, builtIn) out float pointSize;

-

-void main()

-{

-    pointSize = 4.0;

-}

diff --git a/Test/spv.intrinsicsSpirvInstruction.vert b/Test/spv.intrinsicsSpirvInstruction.vert
index a4efb7d..2cc1842 100644
--- a/Test/spv.intrinsicsSpirvInstruction.vert
+++ b/Test/spv.intrinsicsSpirvInstruction.vert
@@ -4,10 +4,10 @@
 #extension GL_ARB_gpu_shader_int64: enable

 

 spirv_instruction (extensions = ["SPV_KHR_shader_clock"], capabilities = [5055], id = 5056)

-uvec2 clockRealtime2x32EXT(void);

+uvec2 clockRealtime2x32EXT(int);

 

 spirv_instruction (extensions = ["SPV_KHR_shader_clock"], capabilities = [5055], id = 5056)

-int64_t clockRealtimeEXT(void);

+uint64_t clockRealtimeEXT(int);

 

 spirv_instruction (extensions = ["SPV_AMD_shader_trinary_minmax"], set = "SPV_AMD_shader_trinary_minmax", id = 1)

 vec2 min3(vec2 x, vec2 y, vec2 z);

@@ -15,12 +15,12 @@
 layout(location = 0) in vec3 vec3In;

 

 layout(location = 0) out uvec2 uvec2Out;

-layout(location = 1) out int64_t i64Out;

+layout(location = 1) out uint64_t u64Out;

 layout(location = 2) out vec2 vec2Out;

 

 void main()

 {

-    uvec2Out = clockRealtime2x32EXT();

-    i64Out = clockRealtimeEXT();

+    uvec2Out = clockRealtime2x32EXT(1);

+    u64Out = clockRealtimeEXT(1);

     vec2Out = min3(vec3In.xy, vec3In.yz, vec3In.zx); 

-}

+}
\ No newline at end of file
diff --git a/Test/spv.intrinsicsSpirvTypeLocalVar.vert b/Test/spv.intrinsicsSpirvTypeLocalVar.vert
new file mode 100644
index 0000000..203d900
--- /dev/null
+++ b/Test/spv.intrinsicsSpirvTypeLocalVar.vert
@@ -0,0 +1,14 @@
+#version 460 core

+

+#extension GL_EXT_spirv_intrinsics: enable

+

+layout(constant_id = 9) const int size = 9;

+

+#define EmptyStruct spirv_type(id = 30)

+void func(EmptyStruct emptyStruct) {}

+

+void main()

+{

+    EmptyStruct dummy[size];

+    func(dummy[1]);

+}

diff --git a/Test/spv.textureError.frag b/Test/spv.textureError.frag
new file mode 100644
index 0000000..a40ea36
--- /dev/null
+++ b/Test/spv.textureError.frag
@@ -0,0 +1,10 @@
+#version 140
+
+uniform sampler2D s2D;
+centroid vec2 centTexCoord;
+
+void main()
+{
+    gl_FragColor = texture2D(s2D, centTexCoord);
+}
+
diff --git a/Test/textureQueryLOD.frag b/Test/textureQueryLOD.frag
new file mode 100644
index 0000000..0d0ae3c
--- /dev/null
+++ b/Test/textureQueryLOD.frag
@@ -0,0 +1,39 @@
+#version 150
+
+#ifdef GL_ARB_texture_query_lod
+#extension GL_ARB_texture_query_lod : enable
+#endif
+#ifdef GL_ARB_gpu_shader5
+#extension GL_ARB_gpu_shader5 : enable
+#endif
+
+#ifdef GL_ES
+precision highp float;
+#endif
+
+in vec2 vUV; // vert->frag
+out vec4 color; // frag->fb
+#define UV vUV
+
+#define bias 1.5
+#define TEX 128.0
+#define offset ivec2(1,1)
+uniform highp sampler2DShadow sampler;
+uniform int funct;
+
+void main (void)
+{
+    switch (funct)
+    {
+    case 0:
+        ivec2 iv2 = textureSize(sampler, 0);
+#ifdef GL_ARB_texture_query_lod
+        vec2 fv2 = textureQueryLOD(sampler, vec2(0.0, 0.0));
+#endif
+		color = vec4(iv2,fv2);
+        break;
+    default:
+        color = vec4(1.0, 1.0, 1.0, 1.0);
+        break;
+    }
+}
diff --git a/Test/vk.relaxed.stagelink.0.0.frag b/Test/vk.relaxed.stagelink.0.0.frag
new file mode 100755
index 0000000..1f9f102
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.0.0.frag
@@ -0,0 +1,139 @@
+#version 460

+uniform int uTDInstanceIDOffset;

+uniform int uTDNumInstances;

+uniform float uTDAlphaTestVal;

+#define TD_NUM_COLOR_BUFFERS 1

+#define TD_NUM_LIGHTS 0

+#define TD_NUM_SHADOWED_LIGHTS 0

+#define TD_NUM_ENV_LIGHTS 0

+#define TD_LIGHTS_ARRAY_SIZE 1

+#define TD_ENV_LIGHTS_ARRAY_SIZE 1

+#define TD_NUM_CAMERAS 1

+struct TDPhongResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	vec3 specular2;

+	float shadowStrength;

+};

+struct TDPBRResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	float shadowStrength;

+};

+struct TDMatrix

+{

+	mat4 world;

+	mat4 worldInverse;

+	mat4 worldCam;

+	mat4 worldCamInverse;

+	mat4 cam;

+	mat4 camInverse;

+	mat4 camProj;

+	mat4 camProjInverse;

+	mat4 proj;

+	mat4 projInverse;

+	mat4 worldCamProj;

+	mat4 worldCamProjInverse;

+	mat4 quadReproject;

+	mat3 worldForNormals;

+	mat3 camForNormals;

+	mat3 worldCamForNormals;

+};

+layout(std140) uniform TDMatricesBlock {

+	TDMatrix uTDMats[TD_NUM_CAMERAS];

+};

+struct TDCameraInfo

+{

+	vec4 nearFar;

+	vec4 fog;

+	vec4 fogColor;

+	int renderTOPCameraIndex;

+};

+layout(std140) uniform TDCameraInfoBlock {

+	TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];

+};

+struct TDGeneral

+{

+	vec4 ambientColor;

+	vec4 nearFar;

+	vec4 viewport;

+	vec4 viewportRes;

+	vec4 fog;

+	vec4 fogColor;

+};

+layout(std140) uniform TDGeneralBlock {

+	TDGeneral uTDGeneral;

+};

+

+void TDAlphaTest(float alpha);

+vec4 TDDither(vec4 color);

+vec4 TDOutputSwizzle(vec4 v);

+uvec4 TDOutputSwizzle(uvec4 v);

+void TDCheckOrderIndTrans();

+void TDCheckDiscard();

+uniform vec3 uConstant;

+uniform float uShadowStrength;

+uniform vec3 uShadowColor;

+uniform vec4 uDiffuseColor;

+uniform vec4 uAmbientColor;

+

+uniform sampler2DArray sColorMap;

+

+in Vertex

+{

+	vec4 color;

+	vec3 worldSpacePos;

+	vec3 texCoord0;

+	flat int cameraIndex;

+	flat int instance;

+} iVert;

+

+// Output variable for the color

+layout(location = 0) out vec4 oFragColor[TD_NUM_COLOR_BUFFERS];

+void main()

+{

+	// This allows things such as order independent transparency

+	// and Dual-Paraboloid rendering to work properly

+	TDCheckDiscard();

+

+	vec4 outcol = vec4(0.0, 0.0, 0.0, 0.0);

+

+	vec3 texCoord0 = iVert.texCoord0.stp;

+	float actualTexZ = mod(int(texCoord0.z),2048);

+	float instanceLoop = floor(int(texCoord0.z)/2048);

+	texCoord0.z = actualTexZ;

+	vec4 colorMapColor = texture(sColorMap, texCoord0.stp);

+

+	float red = colorMapColor[int(instanceLoop)];

+	colorMapColor = vec4(red);

+	// Constant Light Contribution

+	outcol.rgb += uConstant * iVert.color.rgb;

+

+	outcol *= colorMapColor;

+

+	// Alpha Calculation

+	float alpha = iVert.color.a * colorMapColor.a ;

+

+	// Dithering, does nothing if dithering is disabled

+	outcol = TDDither(outcol);

+

+	outcol.rgb *= alpha;

+

+	// Modern GL removed the implicit alpha test, so we need to apply

+	// it manually here. This function does nothing if alpha test is disabled.

+	TDAlphaTest(alpha);

+

+	outcol.a = alpha;

+	oFragColor[0] = TDOutputSwizzle(outcol);

+

+

+	// TD_NUM_COLOR_BUFFERS will be set to the number of color buffers

+	// active in the render. By default we want to output zero to every

+	// buffer except the first one.

+	for (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++)

+	{

+		oFragColor[i] = vec4(0.0);

+	}

+}

diff --git a/Test/vk.relaxed.stagelink.0.0.vert b/Test/vk.relaxed.stagelink.0.0.vert
new file mode 100755
index 0000000..7f31c37
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.0.0.vert
@@ -0,0 +1,126 @@
+#version 460

+uniform int uTDInstanceIDOffset;

+uniform int uTDNumInstances;

+uniform float uTDAlphaTestVal;

+#define TD_NUM_COLOR_BUFFERS 1

+#define TD_NUM_LIGHTS 0

+#define TD_NUM_SHADOWED_LIGHTS 0

+#define TD_NUM_ENV_LIGHTS 0

+#define TD_LIGHTS_ARRAY_SIZE 1

+#define TD_ENV_LIGHTS_ARRAY_SIZE 1

+#define TD_NUM_CAMERAS 1

+struct TDPhongResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	vec3 specular2;

+	float shadowStrength;

+};

+struct TDPBRResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	float shadowStrength;

+};

+struct TDMatrix

+{

+	mat4 world;

+	mat4 worldInverse;

+	mat4 worldCam;

+	mat4 worldCamInverse;

+	mat4 cam;

+	mat4 camInverse;

+	mat4 camProj;

+	mat4 camProjInverse;

+	mat4 proj;

+	mat4 projInverse;

+	mat4 worldCamProj;

+	mat4 worldCamProjInverse;

+	mat4 quadReproject;

+	mat3 worldForNormals;

+	mat3 camForNormals;

+	mat3 worldCamForNormals;

+};

+layout(std140) uniform TDMatricesBlock {

+	TDMatrix uTDMats[TD_NUM_CAMERAS];

+};

+struct TDCameraInfo

+{

+	vec4 nearFar;

+	vec4 fog;

+	vec4 fogColor;

+	int renderTOPCameraIndex;

+};

+layout(std140) uniform TDCameraInfoBlock {

+	TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];

+};

+struct TDGeneral

+{

+	vec4 ambientColor;

+	vec4 nearFar;

+	vec4 viewport;

+	vec4 viewportRes;

+	vec4 fog;

+	vec4 fogColor;

+};

+layout(std140) uniform TDGeneralBlock {

+	TDGeneral uTDGeneral;

+};

+layout(location = 0) in vec3 P;

+layout(location = 1) in vec3 N;

+layout(location = 2) in vec4 Cd;

+layout(location = 3) in vec3 uv[8];

+vec4 TDWorldToProj(vec4 v);

+vec4 TDWorldToProj(vec3 v);

+vec4 TDWorldToProj(vec4 v, vec3 uv);

+vec4 TDWorldToProj(vec3 v, vec3 uv);

+int TDInstanceID();

+int TDCameraIndex();

+vec3 TDUVUnwrapCoord();

+/*********TOUCHDEFORMPREFIX**********/

+#define TD_NUM_BONES 0

+

+vec3 TDInstanceTexCoord(int instanceID, vec3 t);

+vec4 TDInstanceColor(int instanceID, vec4 curColor);

+

+vec4 TDDeform(vec4 pos);

+vec4 TDDeform(vec3 pos);

+vec3 TDInstanceTexCoord(vec3 t);

+vec4 TDInstanceColor(vec4 curColor);

+#line 1

+

+out Vertex

+{

+	vec4 color;

+	vec3 worldSpacePos;

+	vec3 texCoord0;

+	flat int cameraIndex;

+	flat int instance;

+} oVert;

+

+void main()

+{

+

+	{ // Avoid duplicate variable defs

+		vec3 texcoord = TDInstanceTexCoord(uv[0]);

+		oVert.texCoord0.stp = texcoord.stp;

+	}

+	// First deform the vertex and normal

+	// TDDeform always returns values in world space

+	oVert.instance = TDInstanceID();

+	vec4 worldSpacePos = TDDeform(P);

+	vec3 uvUnwrapCoord = TDInstanceTexCoord(TDUVUnwrapCoord());

+	gl_Position = TDWorldToProj(worldSpacePos, uvUnwrapCoord);

+

+

+	// This is here to ensure we only execute lighting etc. code

+	// when we need it. If picking is active we don't need lighting, so

+	// this entire block of code will be ommited from the compile.

+	// The TD_PICKING_ACTIVE define will be set automatically when

+	// picking is active.

+

+	int cameraIndex = TDCameraIndex();

+	oVert.cameraIndex = cameraIndex;

+	oVert.worldSpacePos.xyz = worldSpacePos.xyz;

+	oVert.color = TDInstanceColor(Cd);

+}

diff --git a/Test/vk.relaxed.stagelink.0.1.frag b/Test/vk.relaxed.stagelink.0.1.frag
new file mode 100755
index 0000000..2a82b65
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.0.1.frag
@@ -0,0 +1,504 @@
+#version 460

+uniform sampler2D sTDNoiseMap;

+uniform sampler1D sTDSineLookup;

+uniform sampler2D sTDWhite2D;

+uniform sampler3D sTDWhite3D;

+uniform sampler2DArray sTDWhite2DArray;

+uniform samplerCube sTDWhiteCube;

+uniform int uTDInstanceIDOffset;

+uniform int uTDNumInstances;

+uniform float uTDAlphaTestVal;

+#define TD_NUM_COLOR_BUFFERS 1

+#define TD_NUM_LIGHTS 0

+#define TD_NUM_SHADOWED_LIGHTS 0

+#define TD_NUM_ENV_LIGHTS 0

+#define TD_LIGHTS_ARRAY_SIZE 1

+#define TD_ENV_LIGHTS_ARRAY_SIZE 1

+#define TD_NUM_CAMERAS 1

+struct TDLight

+{

+	vec4 position;

+	vec3 direction;

+	vec3 diffuse;

+	vec4 nearFar;

+	vec4 lightSize;

+	vec4 misc;

+	vec4 coneLookupScaleBias;

+	vec4 attenScaleBiasRoll;

+	mat4 shadowMapMatrix;

+	mat4 shadowMapCamMatrix;

+	vec4 shadowMapRes;

+	mat4 projMapMatrix;

+};

+struct TDEnvLight

+{

+	vec3 color;

+	mat3 rotate;

+};

+layout(std140) uniform TDLightBlock

+{

+	TDLight	uTDLights[TD_LIGHTS_ARRAY_SIZE];

+};

+layout(std140) uniform TDEnvLightBlock

+{

+	TDEnvLight	uTDEnvLights[TD_ENV_LIGHTS_ARRAY_SIZE];

+};

+layout(std430) readonly restrict buffer TDEnvLightBuffer

+{

+	vec3 shCoeffs[9];

+} uTDEnvLightBuffers[TD_ENV_LIGHTS_ARRAY_SIZE];

+struct TDPhongResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	vec3 specular2;

+	float shadowStrength;

+};

+struct TDPBRResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	float shadowStrength;

+};

+struct TDMatrix

+{

+	mat4 world;

+	mat4 worldInverse;

+	mat4 worldCam;

+	mat4 worldCamInverse;

+	mat4 cam;

+	mat4 camInverse;

+	mat4 camProj;

+	mat4 camProjInverse;

+	mat4 proj;

+	mat4 projInverse;

+	mat4 worldCamProj;

+	mat4 worldCamProjInverse;

+	mat4 quadReproject;

+	mat3 worldForNormals;

+	mat3 camForNormals;

+	mat3 worldCamForNormals;

+};

+layout(std140) uniform TDMatricesBlock {

+	TDMatrix uTDMats[TD_NUM_CAMERAS];

+};

+struct TDCameraInfo

+{

+	vec4 nearFar;

+	vec4 fog;

+	vec4 fogColor;

+	int renderTOPCameraIndex;

+};

+layout(std140) uniform TDCameraInfoBlock {

+	TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];

+};

+struct TDGeneral

+{

+	vec4 ambientColor;

+	vec4 nearFar;

+	vec4 viewport;

+	vec4 viewportRes;

+	vec4 fog;

+	vec4 fogColor;

+};

+layout(std140) uniform TDGeneralBlock {

+	TDGeneral uTDGeneral;

+};

+

+layout(binding = 15) uniform samplerBuffer sTDInstanceT;

+layout(binding = 16) uniform samplerBuffer sTDInstanceTexCoord;

+layout(binding = 17) uniform samplerBuffer sTDInstanceColor;

+vec4 TDDither(vec4 color);

+vec3 TDHSVToRGB(vec3 c);

+vec3 TDRGBToHSV(vec3 c);

+#define PI 3.14159265

+

+vec4 TDColor(vec4 color) { return color; }

+void TDCheckOrderIndTrans() {

+}

+void TDCheckDiscard() {

+	TDCheckOrderIndTrans();

+}

+vec4 TDDither(vec4 color)

+{

+   float d = texture(sTDNoiseMap, 

+                gl_FragCoord.xy / 256.0).r;

+   d -= 0.5;

+   d /= 256.0;

+   return vec4(color.rgb + d, color.a);

+}

+bool TDFrontFacing(vec3 pos, vec3 normal)

+{

+	return gl_FrontFacing;

+}

+float TDAttenuateLight(int index, float lightDist)

+{

+	return 1.0;

+}

+void TDAlphaTest(float alpha) {

+}

+float TDHardShadow(int lightIndex, vec3 worldSpacePos)

+{ return 0.0; }

+float TDSoftShadow(int lightIndex, vec3 worldSpacePos, int samples, int steps)

+{ return 0.0; }

+float TDSoftShadow(int lightIndex, vec3 worldSpacePos)

+{ return 0.0; }

+float TDShadow(int lightIndex, vec3 worldSpacePos)

+{ return 0.0; }

+vec3 TDEquirectangularToCubeMap(vec2 mapCoord);

+vec2 TDCubeMapToEquirectangular(vec3 envMapCoord);

+vec2 TDCubeMapToEquirectangular(vec3 envMapCoord, out float mipMapBias);

+vec2 TDTexGenSphere(vec3 envMapCoord);

+float iTDRadicalInverse_VdC(uint bits) 

+{

+	bits = (bits << 16u) | (bits >> 16u);

+    bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);

+    bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);

+    bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);

+    bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);

+    return float(bits) * 2.3283064365386963e-10; // / 0x100000000

+}

+vec2 iTDHammersley(uint i, uint N) 

+{

+    return vec2(float(i) / float(N), iTDRadicalInverse_VdC(i));

+}

+vec3 iTDImportanceSampleGGX(vec2 Xi, float roughness2, vec3 N)

+{	

+	float a = roughness2;

+	float phi = 2 * 3.14159265 * Xi.x;

+	float cosTheta = sqrt( (1 - Xi.y) / (1 + (a*a - 1) * Xi.y) );

+	float sinTheta = sqrt( 1 - cosTheta * cosTheta );

+	

+	vec3 H;

+	H.x = sinTheta * cos(phi);

+	H.y = sinTheta * sin(phi);

+	H.z = cosTheta;

+	

+	vec3 upVector = abs(N.z) < 0.999 ? vec3(0, 0, 1) : vec3(1, 0, 0);

+	vec3 tangentX = normalize(cross(upVector, N));

+	vec3 tangentY = cross(N, tangentX);

+	

+	// Tangent to world space

+	vec3 worldResult = tangentX * H.x + tangentY * H.y + N * H.z;

+	return worldResult;

+}

+float iTDDistributionGGX(vec3 normal, vec3 half_vector, float roughness2)

+{

+	const float Epsilon = 0.000001;

+

+    float NdotH = clamp(dot(normal, half_vector), Epsilon, 1.0);

+    

+    float alpha2 = roughness2 * roughness2;

+    

+    float denom = NdotH * NdotH * (alpha2 - 1.0) + 1.0;

+	denom = max(1e-8, denom);

+    return alpha2 / (PI * denom * denom);

+}

+vec3 iTDCalcF(vec3 F0, float VdotH) {

+    return F0 + (vec3(1.0) - F0) * pow(2.0, (-5.55473*VdotH - 6.98316) * VdotH);

+}

+

+float iTDCalcG(float NdotL, float NdotV, float k) {

+    float Gl = 1.0 / (NdotL * (1.0 - k) + k);

+    float Gv = 1.0 / (NdotV * (1.0 - k) + k);

+    return Gl * Gv;

+}

+// 0 - All options

+TDPBRResult TDLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)

+{

+	TDPBRResult res;

+	return res;

+}

+// 0 - All options

+void TDLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,inout float shadowStrengthOut,int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)

+{

+	TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness);	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+	shadowStrengthOut = res.shadowStrength;

+}

+// 0 - All options

+void TDLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)

+{

+	TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness);	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+}

+// 0 - All options

+TDPBRResult TDEnvLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)

+{

+	TDPBRResult res;

+	return res;

+}

+// 0 - All options

+void TDEnvLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)

+{

+	TDPBRResult res = TDEnvLightingPBR(index, diffuseColor, specularColor,										normal, camVector, roughness, ambientOcclusion);

+	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+}

+// 0 - All options

+TDPhongResult TDLighting(int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+		return res;

+}

+// 0 - Legacy

+void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,inout float shadowStrengthOut,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+	specularContrib2 = res.specular2;

+	shadowStrengthOut = res.shadowStrength;

+}

+// 0 - Legacy

+void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+	specularContrib2 = res.specular2;

+}

+// 1 - Without specular2

+void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+}

+// 2 - Without shadows

+void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess,float shininess2)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+	specularContrib2 = res.specular2;

+}

+// 3 - diffuse and specular only

+void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+	specularContrib = res.specular;

+}

+// 4 - Diffuse only

+void TDLighting(inout vec3 diffuseContrib,int index, vec3 worldSpacePos, vec3 normal)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+}

+// 5 - diffuse only with shadows

+void TDLighting(inout vec3 diffuseContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor)

+{

+	TDPhongResult res;

+	switch (index)

+	{

+		default:

+			res.diffuse = vec3(0.0);

+			res.specular = vec3(0.0);

+			res.specular2 = vec3(0.0);

+			res.shadowStrength = 0.0;

+			break;

+	}

+	diffuseContrib = res.diffuse;

+}

+vec4 TDProjMap(int index, vec3 worldSpacePos, vec4 defaultColor) {

+	switch (index)

+	{

+		default: return defaultColor;

+	}

+}

+vec4 TDFog(vec4 color, vec3 lightingSpacePosition, int cameraIndex) {

+	switch (cameraIndex) {

+			default:

+		case 0:

+		{

+	return color;

+		}

+	}

+}

+vec4 TDFog(vec4 color, vec3 lightingSpacePosition)

+{

+	return TDFog(color, lightingSpacePosition, 0);

+}

+vec3 TDInstanceTexCoord(int index, vec3 t) {

+	vec3 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceTexCoord, coord);

+	v[0] = t.s;

+	v[1] = t.t;

+	v[2] = samp[0];

+    t.stp = v.stp;

+	return t;

+}

+bool TDInstanceActive(int index) {

+	index -= uTDInstanceIDOffset;

+	float v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceT, coord);

+	v = samp[0];

+	return v != 0.0;

+}

+vec3 iTDInstanceTranslate(int index, out bool instanceActive) {

+	int origIndex = index;

+	index -= uTDInstanceIDOffset;

+	vec3 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceT, coord);

+	v[0] = samp[1];

+	v[1] = samp[2];

+	v[2] = samp[3];

+	instanceActive = samp[0] != 0.0;

+	return v;

+}

+vec3 TDInstanceTranslate(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceT, coord);

+	v[0] = samp[1];

+	v[1] = samp[2];

+	v[2] = samp[3];

+	return v;

+}

+mat3 TDInstanceRotateMat(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 0.0, 0.0);

+	mat3 m = mat3(1.0);

+{

+	mat3 r;

+}

+	return m;

+}

+vec3 TDInstanceScale(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(1.0, 1.0, 1.0);

+	return v;

+}

+vec3 TDInstancePivot(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 0.0, 0.0);

+	return v;

+}

+vec3 TDInstanceRotTo(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 0.0, 1.0);

+	return v;

+}

+vec3 TDInstanceRotUp(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 1.0, 0.0);

+	return v;

+}

+mat4 TDInstanceMat(int id) {

+	bool instanceActive = true;

+	vec3 t = iTDInstanceTranslate(id, instanceActive);

+	if (!instanceActive)

+	{

+		return mat4(0.0);

+	}

+	mat4 m = mat4(1.0);

+	{

+		vec3 tt = t;

+		m[3][0] += m[0][0]*tt.x;

+		m[3][1] += m[0][1]*tt.x;

+		m[3][2] += m[0][2]*tt.x;

+		m[3][3] += m[0][3]*tt.x;

+		m[3][0] += m[1][0]*tt.y;

+		m[3][1] += m[1][1]*tt.y;

+		m[3][2] += m[1][2]*tt.y;

+		m[3][3] += m[1][3]*tt.y;

+		m[3][0] += m[2][0]*tt.z;

+		m[3][1] += m[2][1]*tt.z;

+		m[3][2] += m[2][2]*tt.z;

+		m[3][3] += m[2][3]*tt.z;

+	}

+	return m;

+}

+mat3 TDInstanceMat3(int id) {

+	mat3 m = mat3(1.0);

+	return m;

+}

+mat3 TDInstanceMat3ForNorm(int id) {

+	mat3 m = TDInstanceMat3(id);

+	return m;

+}

+vec4 TDInstanceColor(int index, vec4 curColor) {

+	index -= uTDInstanceIDOffset;

+	vec4 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceColor, coord);

+	v[0] = samp[0];

+	v[1] = samp[1];

+	v[2] = samp[2];

+	v[3] = 1.0;

+	curColor[0] = v[0];

+;

+	curColor[1] = v[1];

+;

+	curColor[2] = v[2];

+;

+	return curColor;

+}

diff --git a/Test/vk.relaxed.stagelink.0.1.vert b/Test/vk.relaxed.stagelink.0.1.vert
new file mode 100755
index 0000000..3c5de98
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.0.1.vert
@@ -0,0 +1,242 @@
+#version 460

+layout(location = 0) in vec3 P;

+layout(location = 1) in vec3 N;

+layout(location = 2) in vec4 Cd;

+layout(location = 3) in vec3 uv[8];

+uniform int uTDInstanceIDOffset;

+uniform int uTDNumInstances;

+uniform float uTDAlphaTestVal;

+#define TD_NUM_COLOR_BUFFERS 1

+#define TD_NUM_LIGHTS 0

+#define TD_NUM_SHADOWED_LIGHTS 0

+#define TD_NUM_ENV_LIGHTS 0

+#define TD_LIGHTS_ARRAY_SIZE 1

+#define TD_ENV_LIGHTS_ARRAY_SIZE 1

+#define TD_NUM_CAMERAS 1

+struct TDLight

+{

+	vec4 position;

+	vec3 direction;

+	vec3 diffuse;

+	vec4 nearFar;

+	vec4 lightSize;

+	vec4 misc;

+	vec4 coneLookupScaleBias;

+	vec4 attenScaleBiasRoll;

+	mat4 shadowMapMatrix;

+	mat4 shadowMapCamMatrix;

+	vec4 shadowMapRes;

+	mat4 projMapMatrix;

+};

+struct TDEnvLight

+{

+	vec3 color;

+	mat3 rotate;

+};

+layout(std140) uniform TDLightBlock

+{

+	TDLight	uTDLights[TD_LIGHTS_ARRAY_SIZE];

+};

+layout(std140) uniform TDEnvLightBlock

+{

+	TDEnvLight	uTDEnvLights[TD_ENV_LIGHTS_ARRAY_SIZE];

+};

+layout(std430) readonly restrict buffer TDEnvLightBuffer

+{

+	vec3 shCoeffs[9];

+} uTDEnvLightBuffers[TD_ENV_LIGHTS_ARRAY_SIZE];

+struct TDPhongResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	vec3 specular2;

+	float shadowStrength;

+};

+struct TDPBRResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	float shadowStrength;

+};

+struct TDMatrix

+{

+	mat4 world;

+	mat4 worldInverse;

+	mat4 worldCam;

+	mat4 worldCamInverse;

+	mat4 cam;

+	mat4 camInverse;

+	mat4 camProj;

+	mat4 camProjInverse;

+	mat4 proj;

+	mat4 projInverse;

+	mat4 worldCamProj;

+	mat4 worldCamProjInverse;

+	mat4 quadReproject;

+	mat3 worldForNormals;

+	mat3 camForNormals;

+	mat3 worldCamForNormals;

+};

+layout(std140) uniform TDMatricesBlock {

+	TDMatrix uTDMats[TD_NUM_CAMERAS];

+};

+struct TDCameraInfo

+{

+	vec4 nearFar;

+	vec4 fog;

+	vec4 fogColor;

+	int renderTOPCameraIndex;

+};

+layout(std140) uniform TDCameraInfoBlock {

+	TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];

+};

+struct TDGeneral

+{

+	vec4 ambientColor;

+	vec4 nearFar;

+	vec4 viewport;

+	vec4 viewportRes;

+	vec4 fog;

+	vec4 fogColor;

+};

+layout(std140) uniform TDGeneralBlock {

+	TDGeneral uTDGeneral;

+};

+layout (rgba8) uniform image2D mTD2DImageOutputs[1];

+layout (rgba8) uniform image2DArray mTD2DArrayImageOutputs[1];

+layout (rgba8) uniform image3D mTD3DImageOutputs[1];

+layout (rgba8) uniform imageCube mTDCubeImageOutputs[1];

+

+mat4 TDInstanceMat(int instanceID);

+mat3 TDInstanceMat3(int instanceID);

+vec3 TDInstanceTranslate(int instanceID);

+bool TDInstanceActive(int instanceID);

+mat3 TDInstanceRotateMat(int instanceID);

+vec3 TDInstanceScale(int instanceID);

+vec3 TDInstanceTexCoord(int instanceID, vec3 t);

+vec4 TDInstanceColor(int instanceID, vec4 curColor);

+vec4 TDInstanceCustomAttrib0(int instanceID);

+vec4 TDInstanceCustomAttrib1(int instanceID);

+vec4 TDInstanceCustomAttrib2(int instanceID);

+vec4 TDInstanceCustomAttrib3(int instanceID);

+vec4 TDInstanceCustomAttrib4(int instanceID);

+vec4 TDInstanceCustomAttrib5(int instanceID);

+vec4 TDInstanceCustomAttrib6(int instanceID);

+vec4 TDInstanceCustomAttrib7(int instanceID);

+vec4 TDInstanceCustomAttrib8(int instanceID);

+vec4 TDInstanceCustomAttrib9(int instanceID);

+vec4 TDInstanceCustomAttrib10(int instanceID);

+vec4 TDInstanceCustomAttrib11(int instanceID);

+uint TDInstanceTextureIndex(int instanceIndex);

+vec4 TDInstanceTexture(uint texIndex, vec3 uv);

+vec4 TDInstanceTexture(uint texIndex, vec2 uv);

+

+vec4 TDDeform(vec4 pos);

+vec4 TDDeform(vec3 pos);

+vec4 TDDeform(int instanceID, vec3 pos);

+vec3 TDDeformVec(vec3 v); 

+vec3 TDDeformVec(int instanceID, vec3 v); 

+vec3 TDDeformNorm(vec3 v); 

+vec3 TDDeformNorm(int instanceID, vec3 v); 

+vec4 TDSkinnedDeform(vec4 pos);

+vec3 TDSkinnedDeformVec(vec3 vec);

+vec3 TDSkinnedDeformNorm(vec3 vec);

+vec4 TDInstanceDeform(vec4 pos);

+vec3 TDInstanceDeformVec(vec3 vec);

+vec3 TDInstanceDeformNorm(vec3 vec);

+vec4 TDInstanceDeform(int instanceID, vec4 pos);

+vec3 TDInstanceDeformVec(int instanceID, vec3 vec);

+vec3 TDInstanceDeformNorm(int instanceID, vec3 vec);

+vec3 TDFastDeformTangent(vec3 oldNorm, vec4 oldTangent, vec3 deformedNorm);

+mat4 TDBoneMat(int boneIndex);

+mat4 TDInstanceMat();

+mat3 TDInstanceMat3();

+vec3 TDInstanceTranslate();

+bool TDInstanceActive();

+mat3 TDInstanceRotateMat();

+vec3 TDInstanceScale();

+vec3 TDInstanceTexCoord(vec3 t);

+vec4 TDInstanceColor(vec4 curColor);

+vec4 TDPointColor();

+#ifdef TD_PICKING_ACTIVE

+out TDPickVertex {

+	vec3 sopSpacePosition;

+	vec3 camSpacePosition;

+	vec3 worldSpacePosition;

+	vec3 sopSpaceNormal;

+	vec3 camSpaceNormal;

+	vec3 worldSpaceNormal;

+	vec3 uv[1];

+	flat int pickId;

+	flat int instanceId;

+	vec4 color;

+} oTDPickVert;

+#define vTDPickVert oTDPickVert

+#endif

+vec4 iTDCamToProj(vec4 v, vec3 uv, int cameraIndex, bool applyPickMod)

+{

+	if (!TDInstanceActive())

+		return vec4(2, 2, 2, 0);

+	v = uTDMats[0].proj * v;

+	return v;

+}

+vec4 iTDWorldToProj(vec4 v, vec3 uv, int cameraIndex, bool applyPickMod) {

+	if (!TDInstanceActive())

+		return vec4(2, 2, 2, 0);

+	v = uTDMats[0].camProj * v;

+	return v;

+}

+vec4 TDDeform(vec4 pos);

+vec4 TDDeform(vec3 pos);

+vec4 TDInstanceColor(vec4 curColor);

+vec3 TDInstanceTexCoord(vec3 t);

+int TDInstanceID() {

+	return gl_InstanceID + uTDInstanceIDOffset;

+}

+int TDCameraIndex() {

+	return 0;

+}

+vec3 TDUVUnwrapCoord() {

+	return uv[0];

+}

+#ifdef TD_PICKING_ACTIVE

+uniform int uTDPickId;

+#endif

+int TDPickID() {

+#ifdef TD_PICKING_ACTIVE

+	return uTDPickId;

+#else

+	return 0;

+#endif

+}

+float iTDConvertPickId(int id) {

+	id |= 1073741824;

+	return intBitsToFloat(id);

+}

+

+	void TDWritePickingValues() {

+#ifdef TD_PICKING_ACTIVE

+   vec4 worldPos = TDDeform(P);

+   vec4 camPos = uTDMats[TDCameraIndex()].cam * worldPos;

+	oTDPickVert.pickId = TDPickID();

+#endif

+}

+vec4 TDWorldToProj(vec4 v, vec3 uv)

+{

+	return iTDWorldToProj(v, uv, TDCameraIndex(), true);

+}

+vec4 TDWorldToProj(vec3 v, vec3 uv)

+{

+	return TDWorldToProj(vec4(v, 1.0), uv);

+}

+vec4 TDWorldToProj(vec4 v)

+{

+	return TDWorldToProj(v, vec3(0.0));

+}

+vec4 TDWorldToProj(vec3 v)

+{

+	return TDWorldToProj(vec4(v, 1.0));

+}

+vec4 TDPointColor() {

+	return Cd;

+}

diff --git a/Test/vk.relaxed.stagelink.0.2.frag b/Test/vk.relaxed.stagelink.0.2.frag
new file mode 100755
index 0000000..27bd540
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.0.2.frag
@@ -0,0 +1,9 @@
+#version 460

+vec4 TDOutputSwizzle(vec4 c)

+{

+	return c.rgba;

+}

+uvec4 TDOutputSwizzle(uvec4 c)

+{

+	return c.rgba;

+}

diff --git a/Test/vk.relaxed.stagelink.0.2.vert b/Test/vk.relaxed.stagelink.0.2.vert
new file mode 100755
index 0000000..69c0b21
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.0.2.vert
@@ -0,0 +1,320 @@
+#version 460

+uniform int uTDInstanceIDOffset;

+uniform int uTDNumInstances;

+uniform float uTDAlphaTestVal;

+#define TD_NUM_COLOR_BUFFERS 1

+#define TD_NUM_LIGHTS 0

+#define TD_NUM_SHADOWED_LIGHTS 0

+#define TD_NUM_ENV_LIGHTS 0

+#define TD_LIGHTS_ARRAY_SIZE 1

+#define TD_ENV_LIGHTS_ARRAY_SIZE 1

+#define TD_NUM_CAMERAS 1

+struct TDLight

+{

+	vec4 position;

+	vec3 direction;

+	vec3 diffuse;

+	vec4 nearFar;

+	vec4 lightSize;

+	vec4 misc;

+	vec4 coneLookupScaleBias;

+	vec4 attenScaleBiasRoll;

+	mat4 shadowMapMatrix;

+	mat4 shadowMapCamMatrix;

+	vec4 shadowMapRes;

+	mat4 projMapMatrix;

+};

+struct TDEnvLight

+{

+	vec3 color;

+	mat3 rotate;

+};

+layout(std140) uniform TDLightBlock

+{

+	TDLight	uTDLights[TD_LIGHTS_ARRAY_SIZE];

+};

+layout(std140) uniform TDEnvLightBlock

+{

+	TDEnvLight	uTDEnvLights[TD_ENV_LIGHTS_ARRAY_SIZE];

+};

+layout(std430) readonly restrict buffer TDEnvLightBuffer

+{

+	vec3 shCoeffs[9];

+} uTDEnvLightBuffers[TD_ENV_LIGHTS_ARRAY_SIZE];

+struct TDPhongResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	vec3 specular2;

+	float shadowStrength;

+};

+struct TDPBRResult

+{

+	vec3 diffuse;

+	vec3 specular;

+	float shadowStrength;

+};

+struct TDMatrix

+{

+	mat4 world;

+	mat4 worldInverse;

+	mat4 worldCam;

+	mat4 worldCamInverse;

+	mat4 cam;

+	mat4 camInverse;

+	mat4 camProj;

+	mat4 camProjInverse;

+	mat4 proj;

+	mat4 projInverse;

+	mat4 worldCamProj;

+	mat4 worldCamProjInverse;

+	mat4 quadReproject;

+	mat3 worldForNormals;

+	mat3 camForNormals;

+	mat3 worldCamForNormals;

+};

+layout(std140) uniform TDMatricesBlock {

+	TDMatrix uTDMats[TD_NUM_CAMERAS];

+};

+struct TDCameraInfo

+{

+	vec4 nearFar;

+	vec4 fog;

+	vec4 fogColor;

+	int renderTOPCameraIndex;

+};

+layout(std140) uniform TDCameraInfoBlock {

+	TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];

+};

+struct TDGeneral

+{

+	vec4 ambientColor;

+	vec4 nearFar;

+	vec4 viewport;

+	vec4 viewportRes;

+	vec4 fog;

+	vec4 fogColor;

+};

+layout(std140) uniform TDGeneralBlock {

+	TDGeneral uTDGeneral;

+};

+

+layout(binding = 15) uniform samplerBuffer sTDInstanceT;

+layout(binding = 16) uniform samplerBuffer sTDInstanceTexCoord;

+layout(binding = 17) uniform samplerBuffer sTDInstanceColor;

+#define TD_NUM_BONES 0

+vec4 TDWorldToProj(vec4 v);

+vec4 TDWorldToProj(vec3 v);

+vec4 TDWorldToProj(vec4 v, vec3 uv);

+vec4 TDWorldToProj(vec3 v, vec3 uv);

+int TDPickID();

+int TDInstanceID();

+int TDCameraIndex();

+vec3 TDUVUnwrapCoord();

+vec3 TDInstanceTexCoord(int index, vec3 t) {

+	vec3 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceTexCoord, coord);

+	v[0] = t.s;

+	v[1] = t.t;

+	v[2] = samp[0];

+    t.stp = v.stp;

+	return t;

+}

+bool TDInstanceActive(int index) {

+	index -= uTDInstanceIDOffset;

+	float v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceT, coord);

+	v = samp[0];

+	return v != 0.0;

+}

+vec3 iTDInstanceTranslate(int index, out bool instanceActive) {

+	int origIndex = index;

+	index -= uTDInstanceIDOffset;

+	vec3 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceT, coord);

+	v[0] = samp[1];

+	v[1] = samp[2];

+	v[2] = samp[3];

+	instanceActive = samp[0] != 0.0;

+	return v;

+}

+vec3 TDInstanceTranslate(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceT, coord);

+	v[0] = samp[1];

+	v[1] = samp[2];

+	v[2] = samp[3];

+	return v;

+}

+mat3 TDInstanceRotateMat(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 0.0, 0.0);

+	mat3 m = mat3(1.0);

+{

+	mat3 r;

+}

+	return m;

+}

+vec3 TDInstanceScale(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(1.0, 1.0, 1.0);

+	return v;

+}

+vec3 TDInstancePivot(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 0.0, 0.0);

+	return v;

+}

+vec3 TDInstanceRotTo(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 0.0, 1.0);

+	return v;

+}

+vec3 TDInstanceRotUp(int index) {

+	index -= uTDInstanceIDOffset;

+	vec3 v = vec3(0.0, 1.0, 0.0);

+	return v;

+}

+mat4 TDInstanceMat(int id) {

+	bool instanceActive = true;

+	vec3 t = iTDInstanceTranslate(id, instanceActive);

+	if (!instanceActive)

+	{

+		return mat4(0.0);

+	}

+	mat4 m = mat4(1.0);

+	{

+		vec3 tt = t;

+		m[3][0] += m[0][0]*tt.x;

+		m[3][1] += m[0][1]*tt.x;

+		m[3][2] += m[0][2]*tt.x;

+		m[3][3] += m[0][3]*tt.x;

+		m[3][0] += m[1][0]*tt.y;

+		m[3][1] += m[1][1]*tt.y;

+		m[3][2] += m[1][2]*tt.y;

+		m[3][3] += m[1][3]*tt.y;

+		m[3][0] += m[2][0]*tt.z;

+		m[3][1] += m[2][1]*tt.z;

+		m[3][2] += m[2][2]*tt.z;

+		m[3][3] += m[2][3]*tt.z;

+	}

+	return m;

+}

+mat3 TDInstanceMat3(int id) {

+	mat3 m = mat3(1.0);

+	return m;

+}

+mat3 TDInstanceMat3ForNorm(int id) {

+	mat3 m = TDInstanceMat3(id);

+	return m;

+}

+vec4 TDInstanceColor(int index, vec4 curColor) {

+	index -= uTDInstanceIDOffset;

+	vec4 v;

+	int coord = index;

+	vec4 samp = texelFetch(sTDInstanceColor, coord);

+	v[0] = samp[0];

+	v[1] = samp[1];

+	v[2] = samp[2];

+	v[3] = 1.0;

+	curColor[0] = v[0];

+;

+	curColor[1] = v[1];

+;

+	curColor[2] = v[2];

+;

+	return curColor;

+}

+vec4 TDInstanceDeform(int id, vec4 pos) {

+	pos = TDInstanceMat(id) * pos;

+	return uTDMats[TDCameraIndex()].world * pos;

+}

+

+vec3 TDInstanceDeformVec(int id, vec3 vec)

+{

+	mat3 m = TDInstanceMat3(id);

+	return mat3(uTDMats[TDCameraIndex()].world) * (m * vec);

+}

+vec3 TDInstanceDeformNorm(int id, vec3 vec)

+{

+	mat3 m = TDInstanceMat3ForNorm(id);

+	return mat3(uTDMats[TDCameraIndex()].worldForNormals) * (m * vec);

+}

+vec4 TDInstanceDeform(vec4 pos) {

+	return TDInstanceDeform(TDInstanceID(), pos);

+}

+vec3 TDInstanceDeformVec(vec3 vec) {

+	return TDInstanceDeformVec(TDInstanceID(), vec);

+}

+vec3 TDInstanceDeformNorm(vec3 vec) {

+	return TDInstanceDeformNorm(TDInstanceID(), vec);

+}

+bool TDInstanceActive() { return TDInstanceActive(TDInstanceID()); }

+vec3 TDInstanceTranslate() { return TDInstanceTranslate(TDInstanceID()); }

+mat3 TDInstanceRotateMat() { return TDInstanceRotateMat(TDInstanceID()); }

+vec3 TDInstanceScale() { return TDInstanceScale(TDInstanceID()); }

+mat4 TDInstanceMat() { return TDInstanceMat(TDInstanceID());

+ }

+mat3 TDInstanceMat3() { return TDInstanceMat3(TDInstanceID());

+}

+vec3 TDInstanceTexCoord(vec3 t) {

+	return TDInstanceTexCoord(TDInstanceID(), t);

+}

+vec4 TDInstanceColor(vec4 curColor) {

+	return TDInstanceColor(TDInstanceID(), curColor);

+}

+vec4 TDSkinnedDeform(vec4 pos) { return pos; }

+

+vec3 TDSkinnedDeformVec(vec3 vec) { return vec; }

+

+vec3 TDFastDeformTangent(vec3 oldNorm, vec4 oldTangent, vec3 deformedNorm)

+{   return oldTangent.xyz;   }

+mat4 TDBoneMat(int index) {

+   return mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);

+}

+vec4 TDDeform(vec4 pos) {

+    pos = TDSkinnedDeform(pos);

+    pos = TDInstanceDeform(pos);

+    return pos;

+}

+

+vec4 TDDeform(int instanceID, vec3 p) {

+	vec4 pos = vec4(p, 1.0);

+    pos = TDSkinnedDeform(pos);

+    pos = TDInstanceDeform(instanceID, pos);

+    return pos;

+}

+

+vec4 TDDeform(vec3 pos) {

+	return TDDeform(TDInstanceID(), pos);

+}

+

+vec3 TDDeformVec(int instanceID, vec3 vec) {

+    vec = TDSkinnedDeformVec(vec);

+    vec = TDInstanceDeformVec(instanceID, vec);

+    return vec;

+}

+

+vec3 TDDeformVec(vec3 vec) {

+	return TDDeformVec(TDInstanceID(), vec);

+}

+

+vec3 TDDeformNorm(int instanceID, vec3 vec) {

+    vec = TDSkinnedDeformVec(vec);

+    vec = TDInstanceDeformNorm(instanceID, vec);

+    return vec;

+}

+

+vec3 TDDeformNorm(vec3 vec) {

+	return TDDeformNorm(TDInstanceID(), vec);

+}

+

+vec3 TDSkinnedDeformNorm(vec3 vec) {

+    vec = TDSkinnedDeformVec(vec);

+	return vec;

+}

diff --git a/Test/vulkan.frag b/Test/vulkan.frag
index 25bfefe..6cf7ccf 100644
--- a/Test/vulkan.frag
+++ b/Test/vulkan.frag
@@ -46,6 +46,9 @@
 layout(binding=2, push_constant) uniform pcbnd1 {  // ERROR, can't have binding

     int a;

 } pcbnd1inst;

+layout(push_constant) uniform pcbnd2 {  // ERROR, can't be array

+    float a;

+} pcbnd2inst[2];

 layout(std430, push_constant) uniform pcb1 { int a; } pcb1inst;

 layout(push_constant) uniform pcb2 {

     int a;

diff --git a/Test/xfbUnsizedArray.error.tese b/Test/xfbUnsizedArray.error.tese
new file mode 100644
index 0000000..a59069b
--- /dev/null
+++ b/Test/xfbUnsizedArray.error.tese
@@ -0,0 +1,8 @@
+#version 430 core
+#extension GL_ARB_enhanced_layouts : require
+layout(isolines, point_mode) in;
+layout (xfb_offset = 0) out vec4 unsized[]; // error: unsized array
+
+void main()
+{
+}
diff --git a/build_info.py b/build_info.py
index 7c1998f..06d613b 100755
--- a/build_info.py
+++ b/build_info.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2020 Google Inc.
 #
diff --git a/gen_extension_headers.py b/gen_extension_headers.py
old mode 100644
new mode 100755
index a787f9a..2838c96
--- a/gen_extension_headers.py
+++ b/gen_extension_headers.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2020 Google Inc.
 #
@@ -95,4 +95,4 @@
     generate_main(glsl_files, output_file)

 

 if __name__ == '__main__':

-    main()
\ No newline at end of file
+    main()
diff --git a/glslang/CInterface/glslang_c_interface.cpp b/glslang/CInterface/glslang_c_interface.cpp
index 4fdeff7..53892bc 100644
--- a/glslang/CInterface/glslang_c_interface.cpp
+++ b/glslang/CInterface/glslang_c_interface.cpp
@@ -244,6 +244,8 @@
         return glslang::EShTargetSpv_1_4;
     case GLSLANG_TARGET_SPV_1_5:
         return glslang::EShTargetSpv_1_5;
+    case GLSLANG_TARGET_SPV_1_6:
+        return glslang::EShTargetSpv_1_6;
     default:
         break;
     }
@@ -271,6 +273,8 @@
         return glslang::EShTargetVulkan_1_1;
     case GLSLANG_TARGET_VULKAN_1_2:
         return glslang::EShTargetVulkan_1_2;
+    case GLSLANG_TARGET_VULKAN_1_3:
+        return glslang::EShTargetVulkan_1_3;
     case GLSLANG_TARGET_OPENGL_450:
         return glslang::EShTargetOpenGL_450;
     default:
@@ -346,6 +350,38 @@
     return shader;
 }
 
+GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base)
+{
+    const glslang::TResourceType res_type = glslang::TResourceType(res);
+    shader->shader->setShiftBinding(res_type, base);
+}
+
+GLSLANG_EXPORT void glslang_shader_shift_binding_for_set(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base, unsigned int set)
+{
+    const glslang::TResourceType res_type = glslang::TResourceType(res);
+    shader->shader->setShiftBindingForSet(res_type, base, set);
+}
+
+GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options)
+{
+    if (options & GLSLANG_SHADER_AUTO_MAP_BINDINGS) {
+        shader->shader->setAutoMapBindings(true);
+    }
+
+    if (options & GLSLANG_SHADER_AUTO_MAP_LOCATIONS) {
+        shader->shader->setAutoMapLocations(true);
+    }
+
+    if (options & GLSLANG_SHADER_VULKAN_RULES_RELAXED) {
+        shader->shader->setEnvInputVulkanRulesRelaxed();
+    }
+}
+
+GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version)
+{
+    shader->shader->setOverrideVersion(version);
+}
+
 GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader)
 {
     return shader->preprocessedGLSL.c_str();
@@ -419,6 +455,11 @@
     return (int)program->program->link((EShMessages)messages);
 }
 
+GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program)
+{
+    return (int)program->program->mapIO();
+}
+
 GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program)
 {
     return program->program->getInfoLog();
diff --git a/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl b/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl
index f74df6f..7cf545d 100644
--- a/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl
+++ b/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl
@@ -36,19 +36,3 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#extension GL_EXT_spirv_intrinsics : enable
-#extension GL_ARB_gpu_shader_int64 : enable
-
-uvec2 clockRealtime2x32EXT(void) {
-    spirv_instruction (extensions = ["SPV_KHR_shader_clock"], capabilities = [5055], id = 5056)
-    uvec2 clockRealtime2x32EXT_internal(uint scope);
-    
-    return clockRealtime2x32EXT_internal(1 /*Device scope*/);
-}
-
-uint64_t clockRealtimeEXT(void) {
-    spirv_instruction (extensions = ["SPV_KHR_shader_clock"], capabilities = [5055], id = 5056)
-    uint64_t clockRealtimeEXT_internal(uint scope);
-    
-    return clockRealtimeEXT_internal(1 /*Device scope*/);
-}
\ No newline at end of file
diff --git a/glslang/HLSL/hlslParseHelper.cpp b/glslang/HLSL/hlslParseHelper.cpp
index 39b3eca..2d0a8e9 100644
--- a/glslang/HLSL/hlslParseHelper.cpp
+++ b/glslang/HLSL/hlslParseHelper.cpp
@@ -2167,8 +2167,21 @@
         TIntermSymbol* arg = intermediate.addSymbol(*argVars.back());
         handleFunctionArgument(&callee, callingArgs, arg);
         if (param.type->getQualifier().isParamInput()) {
-            intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg,
-                                                               intermediate.addSymbol(**inputIt)));
+            TIntermTyped* input = intermediate.addSymbol(**inputIt);
+            if (input->getType().getQualifier().builtIn == EbvFragCoord && intermediate.getDxPositionW()) {
+                // Replace FragCoord W with reciprocal
+                auto pos_xyz = handleDotDereference(loc, input, "xyz");
+                auto pos_w   = handleDotDereference(loc, input, "w");
+                auto one     = intermediate.addConstantUnion(1.0, EbtFloat, loc);
+                auto recip_w = intermediate.addBinaryMath(EOpDiv, one, pos_w, loc);
+                TIntermAggregate* dst = new TIntermAggregate(EOpConstructVec4);
+                dst->getSequence().push_back(pos_xyz);
+                dst->getSequence().push_back(recip_w);
+                dst->setType(TType(EbtFloat, EvqTemporary, 4));
+                dst->setLoc(loc);
+                input = dst;
+            }
+            intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg, input));
             inputIt++;
         }
         if (param.type->getQualifier().storage == EvqUniform) {
@@ -2452,6 +2465,62 @@
         arguments = newArg;
 }
 
+// FragCoord may require special loading: we can optionally reciprocate W.
+TIntermTyped* HlslParseContext::assignFromFragCoord(const TSourceLoc& loc, TOperator op,
+                                                    TIntermTyped* left, TIntermTyped* right)
+{
+    // If we are not asked for reciprocal W, use a plain old assign.
+    if (!intermediate.getDxPositionW())
+        return intermediate.addAssign(op, left, right, loc);
+
+    // If we get here, we should reciprocate W.
+    TIntermAggregate* assignList = nullptr;
+
+    // If this is a complex rvalue, we don't want to dereference it many times.  Create a temporary.
+    TVariable* rhsTempVar = nullptr;
+    rhsTempVar = makeInternalVariable("@fragcoord", right->getType());
+    rhsTempVar->getWritableType().getQualifier().makeTemporary();
+
+    {
+        TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc);
+        assignList = intermediate.growAggregate(assignList,
+            intermediate.addAssign(EOpAssign, rhsTempSym, right, loc), loc);
+    }
+
+    // tmp.w = 1.0 / tmp.w
+    {
+        const int W = 3;
+
+        TIntermTyped* tempSymL = intermediate.addSymbol(*rhsTempVar, loc);
+        TIntermTyped* tempSymR = intermediate.addSymbol(*rhsTempVar, loc);
+        TIntermTyped* index = intermediate.addConstantUnion(W, loc);
+
+        TIntermTyped* lhsElement = intermediate.addIndex(EOpIndexDirect, tempSymL, index, loc);
+        TIntermTyped* rhsElement = intermediate.addIndex(EOpIndexDirect, tempSymR, index, loc);
+
+        const TType derefType(right->getType(), 0);
+
+        lhsElement->setType(derefType);
+        rhsElement->setType(derefType);
+
+        auto one     = intermediate.addConstantUnion(1.0, EbtFloat, loc);
+        auto recip_w = intermediate.addBinaryMath(EOpDiv, one, rhsElement, loc);
+
+        assignList = intermediate.growAggregate(assignList, intermediate.addAssign(EOpAssign, lhsElement, recip_w, loc));
+    }
+
+    // Assign the rhs temp (now with W reciprocal) to the final output
+    {
+        TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc);
+        assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, left, rhsTempSym, loc));
+    }
+
+    assert(assignList != nullptr);
+    assignList->setOperator(EOpSequence);
+
+    return assignList;
+}
+
 // Position may require special handling: we can optionally invert Y.
 // See: https://github.com/KhronosGroup/glslang/issues/1173
 //      https://github.com/KhronosGroup/glslang/issues/494
@@ -3071,6 +3140,10 @@
                                                                               subSplitLeft, subSplitRight);
 
                     assignList = intermediate.growAggregate(assignList, clipCullAssign, loc);
+                } else if (subSplitRight->getType().getQualifier().builtIn == EbvFragCoord) {
+                    // FragCoord can require special handling: see comment above assignFromFragCoord
+                    TIntermTyped* fragCoordAssign = assignFromFragCoord(loc, op, subSplitLeft, subSplitRight);
+                    assignList = intermediate.growAggregate(assignList, fragCoordAssign, loc);
                 } else if (assignsClipPos(subSplitLeft)) {
                     // Position can require special handling: see comment above assignPosition
                     TIntermTyped* positionAssign = assignPosition(loc, op, subSplitLeft, subSplitRight);
@@ -6935,6 +7008,9 @@
         if (lhs.isStruct() != rhs.isStruct())
             return false;
 
+        if (lhs.getQualifier().builtIn != rhs.getQualifier().builtIn)
+            return false;
+
         if (lhs.isStruct() && rhs.isStruct()) {
             if (lhs.getStruct()->size() != rhs.getStruct()->size())
                 return false;
diff --git a/glslang/HLSL/hlslParseHelper.h b/glslang/HLSL/hlslParseHelper.h
index 2d7165c..8bebb0e 100644
--- a/glslang/HLSL/hlslParseHelper.h
+++ b/glslang/HLSL/hlslParseHelper.h
@@ -94,6 +94,7 @@
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);
     TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* assignPosition(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
+    TIntermTyped* assignFromFragCoord(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h
index e7b5e07..9042a1a 100644
--- a/glslang/Include/Common.h
+++ b/glslang/Include/Common.h
@@ -39,6 +39,11 @@
 
 #include <algorithm>
 #include <cassert>
+#ifdef _MSC_VER
+#include <cfloat>
+#else
+#include <cmath>
+#endif
 #include <cstdio>
 #include <cstdlib>
 #include <list>
@@ -302,6 +307,34 @@
     return result;
 }
 
+inline bool IsInfinity(double x) {
+#ifdef _MSC_VER
+    switch (_fpclass(x)) {
+    case _FPCLASS_NINF:
+    case _FPCLASS_PINF:
+        return true;
+    default:
+        return false;
+    }
+#else
+    return std::isinf(x);
+#endif
+}
+
+inline bool IsNan(double x) {
+#ifdef _MSC_VER
+    switch (_fpclass(x)) {
+    case _FPCLASS_SNAN:
+    case _FPCLASS_QNAN:
+        return true;
+    default:
+        return false;
+    }
+#else
+  return std::isnan(x);
+#endif
+}
+
 } // end namespace glslang
 
 #endif // _COMMON_INCLUDED_
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index e87f258..91fcd4e 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -1865,10 +1865,12 @@
     bool isAtomic() const { return false; }
     bool isCoopMat() const { return false; }
     bool isReference() const { return false; }
+    bool isSpirvType() const { return false; }
 #else
     bool isAtomic() const { return basicType == EbtAtomicUint; }
     bool isCoopMat() const { return coopmat; }
     bool isReference() const { return getBasicType() == EbtReference; }
+    bool isSpirvType() const { return getBasicType() == EbtSpirvType; }
 #endif
 
     // return true if this type contains any subtype which satisfies the given predicate.
@@ -2140,7 +2142,8 @@
     const char* getPrecisionQualifierString() const { return ""; }
     TString getBasicTypeString() const { return ""; }
 #else
-    TString getCompleteString() const
+    TString getCompleteString(bool syntactic = false, bool getQualifiers = true, bool getPrecision = true,
+                              bool getType = true, TString name = "", TString structName = "") const
     {
         TString typeString;
 
@@ -2148,232 +2151,335 @@
         const auto appendUint = [&](unsigned int u) { typeString.append(std::to_string(u).c_str()); };
         const auto appendInt  = [&](int i)          { typeString.append(std::to_string(i).c_str()); };
 
-        if (qualifier.hasSprivDecorate())
+        if (getQualifiers) {
+          if (qualifier.hasSprivDecorate())
             appendStr(qualifier.getSpirvDecorateQualifierString().c_str());
 
-        if (qualifier.hasLayout()) {
+          if (qualifier.hasLayout()) {
             // To reduce noise, skip this if the only layout is an xfb_buffer
             // with no triggering xfb_offset.
             TQualifier noXfbBuffer = qualifier;
             noXfbBuffer.layoutXfbBuffer = TQualifier::layoutXfbBufferEnd;
             if (noXfbBuffer.hasLayout()) {
-                appendStr("layout(");
-                if (qualifier.hasAnyLocation()) {
-                    appendStr(" location=");
-                    appendUint(qualifier.layoutLocation);
-                    if (qualifier.hasComponent()) {
-                        appendStr(" component=");
-                        appendUint(qualifier.layoutComponent);
-                    }
-                    if (qualifier.hasIndex()) {
-                        appendStr(" index=");
-                        appendUint(qualifier.layoutIndex);
-                    }
+              appendStr("layout(");
+              if (qualifier.hasAnyLocation()) {
+                appendStr(" location=");
+                appendUint(qualifier.layoutLocation);
+                if (qualifier.hasComponent()) {
+                  appendStr(" component=");
+                  appendUint(qualifier.layoutComponent);
                 }
-                if (qualifier.hasSet()) {
-                    appendStr(" set=");
-                    appendUint(qualifier.layoutSet);
+                if (qualifier.hasIndex()) {
+                  appendStr(" index=");
+                  appendUint(qualifier.layoutIndex);
                 }
-                if (qualifier.hasBinding()) {
-                    appendStr(" binding=");
-                    appendUint(qualifier.layoutBinding);
-                }
-                if (qualifier.hasStream()) {
-                    appendStr(" stream=");
-                    appendUint(qualifier.layoutStream);
-                }
-                if (qualifier.hasMatrix()) {
-                    appendStr(" ");
-                    appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix));
-                }
-                if (qualifier.hasPacking()) {
-                    appendStr(" ");
-                    appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking));
-                }
-                if (qualifier.hasOffset()) {
-                    appendStr(" offset=");
-                    appendInt(qualifier.layoutOffset);
-                }
-                if (qualifier.hasAlign()) {
-                    appendStr(" align=");
-                    appendInt(qualifier.layoutAlign);
-                }
-                if (qualifier.hasFormat()) {
-                    appendStr(" ");
-                    appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat));
-                }
-                if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) {
-                    appendStr(" xfb_buffer=");
-                    appendUint(qualifier.layoutXfbBuffer);
-                }
-                if (qualifier.hasXfbOffset()) {
-                    appendStr(" xfb_offset=");
-                    appendUint(qualifier.layoutXfbOffset);
-                }
-                if (qualifier.hasXfbStride()) {
-                    appendStr(" xfb_stride=");
-                    appendUint(qualifier.layoutXfbStride);
-                }
-                if (qualifier.hasAttachment()) {
-                    appendStr(" input_attachment_index=");
-                    appendUint(qualifier.layoutAttachment);
-                }
-                if (qualifier.hasSpecConstantId()) {
-                    appendStr(" constant_id=");
-                    appendUint(qualifier.layoutSpecConstantId);
-                }
-                if (qualifier.layoutPushConstant)
-                    appendStr(" push_constant");
-                if (qualifier.layoutBufferReference)
-                    appendStr(" buffer_reference");
-                if (qualifier.hasBufferReferenceAlign()) {
-                    appendStr(" buffer_reference_align=");
-                    appendUint(1u << qualifier.layoutBufferReferenceAlign);
-                }
+              }
+              if (qualifier.hasSet()) {
+                appendStr(" set=");
+                appendUint(qualifier.layoutSet);
+              }
+              if (qualifier.hasBinding()) {
+                appendStr(" binding=");
+                appendUint(qualifier.layoutBinding);
+              }
+              if (qualifier.hasStream()) {
+                appendStr(" stream=");
+                appendUint(qualifier.layoutStream);
+              }
+              if (qualifier.hasMatrix()) {
+                appendStr(" ");
+                appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix));
+              }
+              if (qualifier.hasPacking()) {
+                appendStr(" ");
+                appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking));
+              }
+              if (qualifier.hasOffset()) {
+                appendStr(" offset=");
+                appendInt(qualifier.layoutOffset);
+              }
+              if (qualifier.hasAlign()) {
+                appendStr(" align=");
+                appendInt(qualifier.layoutAlign);
+              }
+              if (qualifier.hasFormat()) {
+                appendStr(" ");
+                appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat));
+              }
+              if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) {
+                appendStr(" xfb_buffer=");
+                appendUint(qualifier.layoutXfbBuffer);
+              }
+              if (qualifier.hasXfbOffset()) {
+                appendStr(" xfb_offset=");
+                appendUint(qualifier.layoutXfbOffset);
+              }
+              if (qualifier.hasXfbStride()) {
+                appendStr(" xfb_stride=");
+                appendUint(qualifier.layoutXfbStride);
+              }
+              if (qualifier.hasAttachment()) {
+                appendStr(" input_attachment_index=");
+                appendUint(qualifier.layoutAttachment);
+              }
+              if (qualifier.hasSpecConstantId()) {
+                appendStr(" constant_id=");
+                appendUint(qualifier.layoutSpecConstantId);
+              }
+              if (qualifier.layoutPushConstant)
+                appendStr(" push_constant");
+              if (qualifier.layoutBufferReference)
+                appendStr(" buffer_reference");
+              if (qualifier.hasBufferReferenceAlign()) {
+                appendStr(" buffer_reference_align=");
+                appendUint(1u << qualifier.layoutBufferReferenceAlign);
+              }
 
-                if (qualifier.layoutPassthrough)
-                    appendStr(" passthrough");
-                if (qualifier.layoutViewportRelative)
-                    appendStr(" layoutViewportRelative");
-                if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) {
-                    appendStr(" layoutSecondaryViewportRelativeOffset=");
-                    appendInt(qualifier.layoutSecondaryViewportRelativeOffset);
-                }
-                if (qualifier.layoutShaderRecord)
-                    appendStr(" shaderRecordNV");
+              if (qualifier.layoutPassthrough)
+                appendStr(" passthrough");
+              if (qualifier.layoutViewportRelative)
+                appendStr(" layoutViewportRelative");
+              if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) {
+                appendStr(" layoutSecondaryViewportRelativeOffset=");
+                appendInt(qualifier.layoutSecondaryViewportRelativeOffset);
+              }
+              if (qualifier.layoutShaderRecord)
+                appendStr(" shaderRecordNV");
 
-                appendStr(")");
+              appendStr(")");
             }
-        }
+          }
 
-        if (qualifier.invariant)
+          if (qualifier.invariant)
             appendStr(" invariant");
-        if (qualifier.noContraction)
+          if (qualifier.noContraction)
             appendStr(" noContraction");
-        if (qualifier.centroid)
+          if (qualifier.centroid)
             appendStr(" centroid");
-        if (qualifier.smooth)
+          if (qualifier.smooth)
             appendStr(" smooth");
-        if (qualifier.flat)
+          if (qualifier.flat)
             appendStr(" flat");
-        if (qualifier.nopersp)
+          if (qualifier.nopersp)
             appendStr(" noperspective");
-        if (qualifier.explicitInterp)
+          if (qualifier.explicitInterp)
             appendStr(" __explicitInterpAMD");
-        if (qualifier.pervertexNV)
+          if (qualifier.pervertexNV)
             appendStr(" pervertexNV");
-        if (qualifier.perPrimitiveNV)
+          if (qualifier.perPrimitiveNV)
             appendStr(" perprimitiveNV");
-        if (qualifier.perViewNV)
+          if (qualifier.perViewNV)
             appendStr(" perviewNV");
-        if (qualifier.perTaskNV)
+          if (qualifier.perTaskNV)
             appendStr(" taskNV");
-        if (qualifier.patch)
+          if (qualifier.patch)
             appendStr(" patch");
-        if (qualifier.sample)
+          if (qualifier.sample)
             appendStr(" sample");
-        if (qualifier.coherent)
+          if (qualifier.coherent)
             appendStr(" coherent");
-        if (qualifier.devicecoherent)
+          if (qualifier.devicecoherent)
             appendStr(" devicecoherent");
-        if (qualifier.queuefamilycoherent)
+          if (qualifier.queuefamilycoherent)
             appendStr(" queuefamilycoherent");
-        if (qualifier.workgroupcoherent)
+          if (qualifier.workgroupcoherent)
             appendStr(" workgroupcoherent");
-        if (qualifier.subgroupcoherent)
+          if (qualifier.subgroupcoherent)
             appendStr(" subgroupcoherent");
-        if (qualifier.shadercallcoherent)
+          if (qualifier.shadercallcoherent)
             appendStr(" shadercallcoherent");
-        if (qualifier.nonprivate)
+          if (qualifier.nonprivate)
             appendStr(" nonprivate");
-        if (qualifier.volatil)
+          if (qualifier.volatil)
             appendStr(" volatile");
-        if (qualifier.restrict)
+          if (qualifier.restrict)
             appendStr(" restrict");
-        if (qualifier.readonly)
+          if (qualifier.readonly)
             appendStr(" readonly");
-        if (qualifier.writeonly)
+          if (qualifier.writeonly)
             appendStr(" writeonly");
-        if (qualifier.specConstant)
+          if (qualifier.specConstant)
             appendStr(" specialization-constant");
-        if (qualifier.nonUniform)
+          if (qualifier.nonUniform)
             appendStr(" nonuniform");
-        if (qualifier.isNullInit())
+          if (qualifier.isNullInit())
             appendStr(" null-init");
-        if (qualifier.isSpirvByReference())
+          if (qualifier.isSpirvByReference())
             appendStr(" spirv_by_reference");
-        if (qualifier.isSpirvLiteral())
+          if (qualifier.isSpirvLiteral())
             appendStr(" spirv_literal");
-        appendStr(" ");
-        appendStr(getStorageQualifierString());
-        if (isArray()) {
-            for(int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
+          appendStr(" ");
+          appendStr(getStorageQualifierString());
+        }
+        if (getType) {
+          if (syntactic) {
+            if (getPrecision && qualifier.precision != EpqNone) {
+              appendStr(" ");
+              appendStr(getPrecisionQualifierString());
+            }
+            if (isVector() || isMatrix()) {
+              appendStr(" ");
+              switch (basicType) {
+              case EbtDouble:
+                appendStr("d");
+                break;
+              case EbtInt:
+                appendStr("i");
+                break;
+              case EbtUint:
+                appendStr("u");
+                break;
+              case EbtBool:
+                appendStr("b");
+                break;
+              case EbtFloat:
+              default:
+                break;
+              }
+              if (isVector()) {
+                appendStr("vec");
+                appendInt(vectorSize);
+              } else {
+                appendStr("mat");
+                appendInt(matrixCols);
+                appendStr("x");
+                appendInt(matrixRows);
+              }
+            } else if (isStruct() && structure) {
+                appendStr(" ");
+                appendStr(structName.c_str());
+                appendStr("{");
+                bool hasHiddenMember = true;
+                for (size_t i = 0; i < structure->size(); ++i) {
+                  if (!(*structure)[i].type->hiddenMember()) {
+                    if (!hasHiddenMember)
+                      appendStr(", ");
+                    typeString.append((*structure)[i].type->getCompleteString(syntactic, getQualifiers, getPrecision, getType, (*structure)[i].type->getFieldName()));
+                    hasHiddenMember = false;
+                  }
+                }
+                appendStr("}");
+            } else {
+                appendStr(" ");
+                switch (basicType) {
+                case EbtDouble:
+                  appendStr("double");
+                  break;
+                case EbtInt:
+                  appendStr("int");
+                  break;
+                case EbtUint:
+                  appendStr("uint");
+                  break;
+                case EbtBool:
+                  appendStr("bool");
+                  break;
+                case EbtFloat:
+                  appendStr("float");
+                  break;
+                default:
+                  appendStr("unexpected");
+                  break;
+                }
+            }
+            if (name.length() > 0) {
+              appendStr(" ");
+              appendStr(name.c_str());
+            }
+            if (isArray()) {
+              for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
                 int size = arraySizes->getDimSize(i);
                 if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
-                    appendStr(" runtime-sized array of");
+                  appendStr("[]");
                 else {
-                    if (size == UnsizedArraySize) {
-                        appendStr(" unsized");
-                        if (i == 0) {
-                            appendStr(" ");
-                            appendInt(arraySizes->getImplicitSize());
-                        }
-                    } else {
-                        appendStr(" ");
-                        appendInt(arraySizes->getDimSize(i));
-                    }
-                    appendStr("-element array of");
+                  if (size == UnsizedArraySize) {
+                    appendStr("[");
+                    if (i == 0)
+                      appendInt(arraySizes->getImplicitSize());
+                    appendStr("]");
+                  }
+                  else {
+                    appendStr("[");
+                    appendInt(arraySizes->getDimSize(i));
+                    appendStr("]");
+                  }
                 }
+              }
             }
-        }
-        if (isParameterized()) {
-            appendStr("<");
-            for(int i = 0; i < (int)typeParameters->getNumDims(); ++i) {
+          }
+          else {
+            if (isArray()) {
+              for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
+                int size = arraySizes->getDimSize(i);
+                if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
+                  appendStr(" runtime-sized array of");
+                else {
+                  if (size == UnsizedArraySize) {
+                    appendStr(" unsized");
+                    if (i == 0) {
+                      appendStr(" ");
+                      appendInt(arraySizes->getImplicitSize());
+                    }
+                  }
+                  else {
+                    appendStr(" ");
+                    appendInt(arraySizes->getDimSize(i));
+                  }
+                  appendStr("-element array of");
+                }
+              }
+            }
+            if (isParameterized()) {
+              appendStr("<");
+              for (int i = 0; i < (int)typeParameters->getNumDims(); ++i) {
                 appendInt(typeParameters->getDimSize(i));
                 if (i != (int)typeParameters->getNumDims() - 1)
+                  appendStr(", ");
+              }
+              appendStr(">");
+            }
+            if (getPrecision && qualifier.precision != EpqNone) {
+              appendStr(" ");
+              appendStr(getPrecisionQualifierString());
+            }
+            if (isMatrix()) {
+              appendStr(" ");
+              appendInt(matrixCols);
+              appendStr("X");
+              appendInt(matrixRows);
+              appendStr(" matrix of");
+            }
+            else if (isVector()) {
+              appendStr(" ");
+              appendInt(vectorSize);
+              appendStr("-component vector of");
+            }
+
+            appendStr(" ");
+            typeString.append(getBasicTypeString());
+
+            if (qualifier.builtIn != EbvNone) {
+              appendStr(" ");
+              appendStr(getBuiltInVariableString());
+            }
+
+            // Add struct/block members
+            if (isStruct() && structure) {
+              appendStr("{");
+              bool hasHiddenMember = true;
+              for (size_t i = 0; i < structure->size(); ++i) {
+                if (!(*structure)[i].type->hiddenMember()) {
+                  if (!hasHiddenMember)
                     appendStr(", ");
-            }
-            appendStr(">");
-        }
-        if (qualifier.precision != EpqNone) {
-            appendStr(" ");
-            appendStr(getPrecisionQualifierString());
-        }
-        if (isMatrix()) {
-            appendStr(" ");
-            appendInt(matrixCols);
-            appendStr("X");
-            appendInt(matrixRows);
-            appendStr(" matrix of");
-        } else if (isVector()) {
-            appendStr(" ");
-            appendInt(vectorSize);
-            appendStr("-component vector of");
-        }
-
-        appendStr(" ");
-        typeString.append(getBasicTypeString());
-
-        if (qualifier.builtIn != EbvNone) {
-            appendStr(" ");
-            appendStr(getBuiltInVariableString());
-        }
-
-        // Add struct/block members
-        if (isStruct() && structure) {
-            appendStr("{");
-            bool hasHiddenMember = true;
-            for (size_t i = 0; i < structure->size(); ++i) {
-                if (! (*structure)[i].type->hiddenMember()) {
-                    if (!hasHiddenMember) 
-                        appendStr(", ");
-                    typeString.append((*structure)[i].type->getCompleteString());
-                    typeString.append(" ");
-                    typeString.append((*structure)[i].type->getFieldName());
-                    hasHiddenMember = false;
+                  typeString.append((*structure)[i].type->getCompleteString());
+                  typeString.append(" ");
+                  typeString.append((*structure)[i].type->getFieldName());
+                  hasHiddenMember = false;
                 }
+              }
+              appendStr("}");
             }
-            appendStr("}");
+          }
         }
 
         return typeString;
@@ -2442,13 +2548,27 @@
     //  type definitions, and member names to be considered the same type.
     //  This rule applies recursively for nested or embedded types."
     //
-    bool sameStructType(const TType& right) const
+    // If type mismatch in structure, return member indices through lpidx and rpidx.
+    // If matching members for either block are exhausted, return -1 for exhausted
+    // block and the index of the unmatched member. Otherwise return {-1,-1}.
+    //
+    bool sameStructType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const
     {
+        // Initialize error to general type mismatch.
+        if (lpidx != nullptr) {
+            *lpidx = -1;
+            *rpidx = -1;
+        }
+
         // Most commonly, they are both nullptr, or the same pointer to the same actual structure
+        // TODO: Why return true when neither types are structures?
         if ((!isStruct() && !right.isStruct()) ||
             (isStruct() && right.isStruct() && structure == right.structure))
             return true;
 
+        if (!isStruct() || !right.isStruct())
+            return false;
+
         // Structure names have to match
         if (*typeName != *right.typeName)
             return false;
@@ -2458,12 +2578,17 @@
         bool isGLPerVertex = *typeName == "gl_PerVertex";
 
         // Both being nullptr was caught above, now they both have to be structures of the same number of elements
-        if (!isStruct() || !right.isStruct() ||
-            (structure->size() != right.structure->size() && !isGLPerVertex))
+        if (lpidx == nullptr &&
+            (structure->size() != right.structure->size() && !isGLPerVertex)) {
             return false;
+        }
 
         // Compare the names and types of all the members, which have to match
         for (size_t li = 0, ri = 0; li < structure->size() || ri < right.structure->size(); ++li, ++ri) {
+            if (lpidx != nullptr) {
+                *lpidx = static_cast<int>(li);
+                *rpidx = static_cast<int>(ri);
+            }
             if (li < structure->size() && ri < right.structure->size()) {
                 if ((*structure)[li].type->getFieldName() == (*right.structure)[ri].type->getFieldName()) {
                     if (*(*structure)[li].type != *(*right.structure)[ri].type)
@@ -2493,11 +2618,19 @@
                 }
             // If we get here, then there should only be inconsistently declared members left
             } else if (li < structure->size()) {
-                if (!(*structure)[li].type->hiddenMember() && !isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName()))
+                if (!(*structure)[li].type->hiddenMember() && !isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) {
+                    if (lpidx != nullptr) {
+                        *rpidx = -1;
+                    }
                     return false;
+                }
             } else {
-                if (!(*right.structure)[ri].type->hiddenMember() && !isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName()))
+                if (!(*right.structure)[ri].type->hiddenMember() && !isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) {
+                    if (lpidx != nullptr) {
+                        *lpidx = -1;
+                    }
                     return false;
+                }
             }
         }
 
@@ -2521,10 +2654,15 @@
         return *referentType == *right.referentType;
     }
 
-   // See if two types match, in all aspects except arrayness
-    bool sameElementType(const TType& right) const
+    // See if two types match, in all aspects except arrayness
+    // If mismatch in structure members, return member indices in lpidx and rpidx.
+    bool sameElementType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const
     {
-        return basicType == right.basicType && sameElementShape(right);
+        if (lpidx != nullptr) {
+            *lpidx = -1;
+            *rpidx = -1;
+        }
+        return basicType == right.basicType && sameElementShape(right, lpidx, rpidx);
     }
 
     // See if two type's arrayness match
@@ -2558,15 +2696,20 @@
 #endif
 
     // See if two type's elements match in all ways except basic type
-    bool sameElementShape(const TType& right) const
+    // If mismatch in structure members, return member indices in lpidx and rpidx.
+    bool sameElementShape(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const
     {
-        return    sampler == right.sampler    &&
+        if (lpidx != nullptr) {
+            *lpidx = -1;
+            *rpidx = -1;
+        }
+        return ((basicType != EbtSampler && right.basicType != EbtSampler) || sampler == right.sampler) &&
                vectorSize == right.vectorSize &&
                matrixCols == right.matrixCols &&
                matrixRows == right.matrixRows &&
                   vector1 == right.vector1    &&
               isCoopMat() == right.isCoopMat() &&
-               sameStructType(right)          &&
+               sameStructType(right, lpidx, rpidx) &&
                sameReferenceType(right);
     }
 
diff --git a/glslang/Include/glslang_c_interface.h b/glslang/Include/glslang_c_interface.h
index 4b32e2b..a98a7e1 100644
--- a/glslang/Include/glslang_c_interface.h
+++ b/glslang/Include/glslang_c_interface.h
@@ -224,6 +224,10 @@
 
 GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input);
 GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader);
+GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base);
+GLSLANG_EXPORT void glslang_shader_shift_binding_for_set(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base, unsigned int set);
+GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options); // glslang_shader_options_t
+GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version);
 GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input);
 GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input);
 GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader);
@@ -234,6 +238,7 @@
 GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program);
 GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader);
 GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t
+GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program);
 GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage);
 GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program);
 GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*);
diff --git a/glslang/Include/glslang_c_shader_types.h b/glslang/Include/glslang_c_shader_types.h
index f100a9a..dc9009f 100644
--- a/glslang/Include/glslang_c_shader_types.h
+++ b/glslang/Include/glslang_c_shader_types.h
@@ -101,8 +101,9 @@
     GLSLANG_TARGET_VULKAN_1_0 = (1 << 22),
     GLSLANG_TARGET_VULKAN_1_1 = (1 << 22) | (1 << 12),
     GLSLANG_TARGET_VULKAN_1_2 = (1 << 22) | (2 << 12),
+    GLSLANG_TARGET_VULKAN_1_3 = (1 << 22) | (3 << 12),
     GLSLANG_TARGET_OPENGL_450 = 450,
-    LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 4),
+    LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 5),
 } glslang_target_client_version_t;
 
 /* SH_TARGET_LanguageVersion counterpart */
@@ -113,13 +114,16 @@
     GLSLANG_TARGET_SPV_1_3 = (1 << 16) | (3 << 8),
     GLSLANG_TARGET_SPV_1_4 = (1 << 16) | (4 << 8),
     GLSLANG_TARGET_SPV_1_5 = (1 << 16) | (5 << 8),
-    LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 6),
+    GLSLANG_TARGET_SPV_1_6 = (1 << 16) | (6 << 8),
+    LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 7),
 } glslang_target_language_version_t;
 
 /* EShExecutable counterpart */
 typedef enum { GLSLANG_EX_VERTEX_FRAGMENT, GLSLANG_EX_FRAGMENT } glslang_executable_t;
 
-/* EShOptimizationLevel counterpart  */
+// EShOptimizationLevel counterpart
+// This enum is not used in the current C interface, but could be added at a later date.
+// GLSLANG_OPT_NONE is the current default.
 typedef enum {
     GLSLANG_OPT_NO_GENERATION,
     GLSLANG_OPT_NONE,
@@ -153,6 +157,7 @@
     GLSLANG_MSG_HLSL_LEGALIZATION_BIT = (1 << 12),
     GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13),
     GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14),
+    GLSLANG_MSG_ENHANCED = (1 << 15),
     LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT),
 } glslang_messages_t;
 
@@ -181,6 +186,26 @@
     LAST_ELEMENT_MARKER(GLSLANG_PROFILE_COUNT),
 } glslang_profile_t;
 
+/* Shader options */
+typedef enum {
+    GLSLANG_SHADER_DEFAULT_BIT = 0,
+    GLSLANG_SHADER_AUTO_MAP_BINDINGS = (1 << 0),
+    GLSLANG_SHADER_AUTO_MAP_LOCATIONS = (1 << 1),
+    GLSLANG_SHADER_VULKAN_RULES_RELAXED = (1 << 2),
+    LAST_ELEMENT_MARKER(GLSLANG_SHADER_COUNT),
+} glslang_shader_options_t;
+
+/* TResourceType counterpart */
+typedef enum {
+    GLSLANG_RESOURCE_TYPE_SAMPLER,
+    GLSLANG_RESOURCE_TYPE_TEXTURE,
+    GLSLANG_RESOURCE_TYPE_IMAGE,
+    GLSLANG_RESOURCE_TYPE_UBO,
+    GLSLANG_RESOURCE_TYPE_SSBO,
+    GLSLANG_RESOURCE_TYPE_UAV,
+    LAST_ELEMENT_MARKER(GLSLANG_RESOURCE_TYPE_COUNT),
+} glslang_resource_type_t;
+
 #undef LAST_ELEMENT_MARKER
 
 #endif
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 595bd62..a64ed68 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -1155,7 +1155,7 @@
     virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
     bool isAtomic() const { return type.isAtomic(); }
     bool isReference() const { return type.isReference(); }
-    TString getCompleteString() const { return type.getCompleteString(); }
+    TString getCompleteString(bool enhanced = false) const { return type.getCompleteString(enhanced); }
 
 protected:
     TIntermTyped& operator=(const TIntermTyped&);
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
index 7f5d4c4..5fc61db 100644
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -46,35 +46,6 @@
 
 using namespace glslang;
 
-typedef union {
-    double d;
-    int i[2];
-} DoubleIntUnion;
-
-// Some helper functions
-
-bool isNan(double x)
-{
-    DoubleIntUnion u;
-    // tough to find a platform independent library function, do it directly
-    u.d = x;
-    int bitPatternL = u.i[0];
-    int bitPatternH = u.i[1];
-    return (bitPatternH & 0x7ff80000) == 0x7ff80000 &&
-           ((bitPatternH & 0xFFFFF) != 0 || bitPatternL != 0);
-}
-
-bool isInf(double x)
-{
-    DoubleIntUnion u;
-    // tough to find a platform independent library function, do it directly
-    u.d = x;
-    int bitPatternL = u.i[0];
-    int bitPatternH = u.i[1];
-    return (bitPatternH & 0x7ff00000) == 0x7ff00000 &&
-           (bitPatternH & 0xFFFFF) == 0 && bitPatternL == 0;
-}
-
 const double pi = 3.1415926535897932384626433832795;
 
 } // end anonymous namespace
@@ -663,12 +634,12 @@
 
         case EOpIsNan:
         {
-            newConstArray[i].setBConst(isNan(unionArray[i].getDConst()));
+            newConstArray[i].setBConst(IsNan(unionArray[i].getDConst()));
             break;
         }
         case EOpIsInf:
         {
-            newConstArray[i].setBConst(isInf(unionArray[i].getDConst()));
+            newConstArray[i].setBConst(IsInfinity(unionArray[i].getDConst()));
             break;
         }
 
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 728cd4a..03fdce9 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -316,6 +316,7 @@
 
     { EOpTextureQuerySize,      "textureSize",           nullptr },
     { EOpTextureQueryLod,       "textureQueryLod",       nullptr },
+    { EOpTextureQueryLod,       "textureQueryLOD",       nullptr }, // extension GL_ARB_texture_query_lod
     { EOpTextureQueryLevels,    "textureQueryLevels",    nullptr },
     { EOpTextureQuerySamples,   "textureSamples",        nullptr },
     { EOpTexture,               "texture",               nullptr },
@@ -4269,7 +4270,7 @@
         //
         //============================================================================
 
-        if (profile != EEsProfile && version >= 400) {
+        if (profile != EEsProfile && (version >= 400 || version == 150)) {
             stageBuiltins[EShLangGeometry].append(
                 "void EmitStreamVertex(int);"
                 "void EndStreamPrimitive(int);"
@@ -4553,11 +4554,13 @@
             "\n");
     }
 
-    // GL_ARB_shader_clock
+    // GL_ARB_shader_clock& GL_EXT_shader_realtime_clock
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
             "uvec2 clock2x32ARB();"
             "uint64_t clockARB();"
+            "uvec2 clockRealtime2x32EXT();"
+            "uint64_t clockRealtimeEXT();"
             "\n");
     }
 
@@ -6245,38 +6248,44 @@
     //
     // textureQueryLod(), fragment stage only
     // Also enabled with extension GL_ARB_texture_query_lod
+    // Extension GL_ARB_texture_query_lod says that textureQueryLOD() also exist at extension.
 
     if (profile != EEsProfile && version >= 150 && sampler.isCombined() && sampler.dim != EsdRect &&
         ! sampler.isMultiSample() && ! sampler.isBuffer()) {
-        for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
-            if (f16TexAddr && sampler.type != EbtFloat16)
-                continue;
-            stageBuiltins[EShLangFragment].append("vec2 textureQueryLod(");
-            stageBuiltins[EShLangFragment].append(typeName);
-            if (dimMap[sampler.dim] == 1)
-                if (f16TexAddr)
-                    stageBuiltins[EShLangFragment].append(", float16_t");
-                else
-                    stageBuiltins[EShLangFragment].append(", float");
-            else {
-                if (f16TexAddr)
-                    stageBuiltins[EShLangFragment].append(", f16vec");
-                else
-                    stageBuiltins[EShLangFragment].append(", vec");
-                stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
-            }
-            stageBuiltins[EShLangFragment].append(");\n");
-        }
 
-        stageBuiltins[EShLangCompute].append("vec2 textureQueryLod(");
-        stageBuiltins[EShLangCompute].append(typeName);
-        if (dimMap[sampler.dim] == 1)
-            stageBuiltins[EShLangCompute].append(", float");
-        else {
-            stageBuiltins[EShLangCompute].append(", vec");
-            stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);
+        const TString funcName[2] = {"vec2 textureQueryLod(", "vec2 textureQueryLOD("};
+
+        for (int i = 0; i < 2; ++i){
+            for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
+                if (f16TexAddr && sampler.type != EbtFloat16)
+                    continue;
+                stageBuiltins[EShLangFragment].append(funcName[i]);
+                stageBuiltins[EShLangFragment].append(typeName);
+                if (dimMap[sampler.dim] == 1)
+                    if (f16TexAddr)
+                        stageBuiltins[EShLangFragment].append(", float16_t");
+                    else
+                        stageBuiltins[EShLangFragment].append(", float");
+                else {
+                    if (f16TexAddr)
+                        stageBuiltins[EShLangFragment].append(", f16vec");
+                    else
+                        stageBuiltins[EShLangFragment].append(", vec");
+                    stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
+                }
+                stageBuiltins[EShLangFragment].append(");\n");
+            }
+
+            stageBuiltins[EShLangCompute].append(funcName[i]);
+            stageBuiltins[EShLangCompute].append(typeName);
+            if (dimMap[sampler.dim] == 1)
+                stageBuiltins[EShLangCompute].append(", float");
+            else {
+                stageBuiltins[EShLangCompute].append(", vec");
+                stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);
+            }
+            stageBuiltins[EShLangCompute].append(");\n");
         }
-        stageBuiltins[EShLangCompute].append(");\n");
     }
 
     //
@@ -8061,7 +8070,7 @@
         }
 
         if (profile != EEsProfile && version < 400) {
-            symbolTable.setFunctionExtensions("textureQueryLod", 1, &E_GL_ARB_texture_query_lod);
+            symbolTable.setFunctionExtensions("textureQueryLOD", 1, &E_GL_ARB_texture_query_lod);
         }
 
         if (profile != EEsProfile && version >= 460) {
@@ -8324,6 +8333,9 @@
         symbolTable.setFunctionExtensions("clockARB",     1, &E_GL_ARB_shader_clock);
         symbolTable.setFunctionExtensions("clock2x32ARB", 1, &E_GL_ARB_shader_clock);
 
+        symbolTable.setFunctionExtensions("clockRealtimeEXT", 1, &E_GL_EXT_shader_realtime_clock);
+        symbolTable.setFunctionExtensions("clockRealtime2x32EXT", 1, &E_GL_EXT_shader_realtime_clock);
+
         if (profile == EEsProfile && version < 320) {
             symbolTable.setVariableExtensions("gl_PrimitiveID",  Num_AEP_geometry_shader, AEP_geometry_shader);
             symbolTable.setVariableExtensions("gl_Layer",        Num_AEP_geometry_shader, AEP_geometry_shader);
@@ -8341,10 +8353,11 @@
         }
 
         if (profile != EEsProfile && version < 330 ) {
-            symbolTable.setFunctionExtensions("floatBitsToInt", 1, &E_GL_ARB_shader_bit_encoding);
-            symbolTable.setFunctionExtensions("floatBitsToUint", 1, &E_GL_ARB_shader_bit_encoding);
-            symbolTable.setFunctionExtensions("intBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
-            symbolTable.setFunctionExtensions("uintBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
+            const char* bitsConvertExt[2] = {E_GL_ARB_shader_bit_encoding, E_GL_ARB_gpu_shader5};
+            symbolTable.setFunctionExtensions("floatBitsToInt", 2, bitsConvertExt);
+            symbolTable.setFunctionExtensions("floatBitsToUint", 2, bitsConvertExt);
+            symbolTable.setFunctionExtensions("intBitsToFloat", 2, bitsConvertExt);
+            symbolTable.setFunctionExtensions("uintBitsToFloat", 2, bitsConvertExt);
         }
 
         if (profile != EEsProfile && version < 430 ) {
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 1283f44..14fd053 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -2766,7 +2766,7 @@
         return;
 
     if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint ||
-        exp->getBasicType() == EbtFloat || exp->getBasicType() == EbtFloat16) {
+        exp->getBasicType() == EbtFloat) {
         if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) {
             exp->propagatePrecision(parentPrecision);
         }
@@ -3284,7 +3284,7 @@
 void TIntermUnary::updatePrecision()
 {
     if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
-        getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+        getBasicType() == EbtFloat) {
         if (operand->getQualifier().precision > getQualifier().precision)
             getQualifier().precision = operand->getQualifier().precision;
     }
@@ -3785,7 +3785,7 @@
 void TIntermAggregate::updatePrecision()
 {
     if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
-        getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+        getBasicType() == EbtFloat) {
         TPrecisionQualifier maxPrecision = EpqNone;
         TIntermSequence operands = getSequence();
         for (unsigned int i = 0; i < operands.size(); ++i) {
@@ -3807,7 +3807,7 @@
 void TIntermBinary::updatePrecision()
 {
      if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
-         getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+         getBasicType() == EbtFloat) {
        if (op == EOpRightShift || op == EOpLeftShift) {
          // For shifts get precision from left side only and thus no need to propagate
          getQualifier().precision = left->getQualifier().precision;
@@ -3902,7 +3902,7 @@
         case EbtFloat16: PROMOTE(setDConst, double, Get); break; \
         case EbtFloat: PROMOTE(setDConst, double, Get); break; \
         case EbtDouble: PROMOTE(setDConst, double, Get); break; \
-        case EbtInt8: PROMOTE(setI8Const, char, Get); break; \
+        case EbtInt8: PROMOTE(setI8Const, signed char, Get); break; \
         case EbtInt16: PROMOTE(setI16Const, short, Get); break; \
         case EbtInt: PROMOTE(setIConst, int, Get); break; \
         case EbtInt64: PROMOTE(setI64Const, long long, Get); break; \
diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp
index 1da50d6..616580f 100644
--- a/glslang/MachineIndependent/ParseContextBase.cpp
+++ b/glslang/MachineIndependent/ParseContextBase.cpp
@@ -74,6 +74,9 @@
 {
     if (messages & EShMsgOnlyPreprocessor)
         return;
+    // If enhanced msg readability, only print one error
+    if (messages & EShMsgEnhanced && numErrors > 0)
+        return;
     va_list args;
     va_start(args, szExtraInfoFormat);
     outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args);
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 7f2f171..496a9a1 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -902,8 +902,10 @@
         result = intermediate.addBinaryMath(op, left, right, loc);
     }
 
-    if (result == nullptr)
-        binaryOpError(loc, str, left->getCompleteString(), right->getCompleteString());
+    if (result == nullptr) {
+        bool enhanced = intermediate.getEnhancedMsgs();
+        binaryOpError(loc, str, left->getCompleteString(enhanced), right->getCompleteString(enhanced));
+    }
 
     return result;
 }
@@ -926,8 +928,10 @@
 
     if (result)
         return result;
-    else
-        unaryOpError(loc, str, childNode->getCompleteString());
+    else {
+        bool enhanced = intermediate.getEnhancedMsgs();
+        unaryOpError(loc, str, childNode->getCompleteString(enhanced));
+    }
 
     return childNode;
 }
@@ -953,8 +957,8 @@
             requireProfile(loc, ~EEsProfile, feature);
             profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, feature);
         } else if (!base->getType().isCoopMat()) {
-            error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString().c_str());
-
+            bool enhanced = intermediate.getEnhancedMsgs();
+            error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString(enhanced).c_str());
             return base;
         }
 
@@ -1005,10 +1009,16 @@
                     intermediate.addIoAccessed(field);
             }
             inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier());
-        } else
-            error(loc, "no such field in structure", field.c_str(), "");
+        } else {
+            auto baseSymbol = base;
+            while (baseSymbol->getAsSymbolNode() == nullptr)
+                baseSymbol = baseSymbol->getAsBinaryNode()->getLeft();
+            TString structName;
+            structName.append("\'").append(baseSymbol->getAsSymbolNode()->getName().c_str()).append( "\'");
+            error(loc, "no such field in structure", field.c_str(), structName.c_str());
+        }
     } else
-        error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString().c_str());
+        error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());
 
     // Propagate noContraction up the dereference chain
     if (base->getQualifier().isNoContraction())
@@ -1314,14 +1324,14 @@
             //
             result = addConstructor(loc, arguments, type);
             if (result == nullptr)
-                error(loc, "cannot construct with these arguments", type.getCompleteString().c_str(), "");
+                error(loc, "cannot construct with these arguments", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str(), "");
         }
     } else {
         //
         // Find it in the symbol table.
         //
         const TFunction* fnCandidate;
-        bool builtIn;
+        bool builtIn {false};
         fnCandidate = findFunction(loc, *function, builtIn);
         if (fnCandidate) {
             // This is a declared function that might map to
@@ -1494,7 +1504,7 @@
         else
             error(arguments->getLoc(), " wrong operand type", "Internal Error",
                                       "built in unary operator function.  Type: %s",
-                                      static_cast<TIntermTyped*>(arguments)->getCompleteString().c_str());
+                                      static_cast<TIntermTyped*>(arguments)->getCompleteString(intermediate.getEnhancedMsgs()).c_str());
     } else if (result->getAsOperator())
         builtInOpCheck(loc, function, *result->getAsOperator());
 
@@ -2495,6 +2505,8 @@
 
     case EOpEmitStreamVertex:
     case EOpEndStreamPrimitive:
+        if (version == 150)
+            requireExtensions(loc, 1, &E_GL_ARB_gpu_shader5, "if the verison is 150 , the EmitStreamVertex and EndStreamPrimitive only support at extension GL_ARB_gpu_shader5");
         intermediate.setMultiStream();
         break;
 
@@ -2597,23 +2609,24 @@
         // Check that if extended types are being used that the correct extensions are enabled.
         if (arg0 != nullptr) {
             const TType& type = arg0->getType();
+            bool enhanced = intermediate.getEnhancedMsgs();
             switch (type.getBasicType()) {
             default:
                 break;
             case EbtInt8:
             case EbtUint8:
-                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString().c_str());
+                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString(enhanced).c_str());
                 break;
             case EbtInt16:
             case EbtUint16:
-                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString().c_str());
+                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString(enhanced).c_str());
                 break;
             case EbtInt64:
             case EbtUint64:
-                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString().c_str());
+                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString(enhanced).c_str());
                 break;
             case EbtFloat16:
-                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString().c_str());
+                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString(enhanced).c_str());
                 break;
             }
         }
@@ -2786,7 +2799,10 @@
     TOperator op = intermediate.mapTypeToConstructorOp(type);
 
     if (op == EOpNull) {
-        error(loc, "cannot construct this type", type.getBasicString(), "");
+      if (intermediate.getEnhancedMsgs() && type.getBasicType() == EbtSampler)
+            error(loc, "function not supported in this version; use texture() instead", "texture*D*", "");
+        else
+            error(loc, "cannot construct this type", type.getBasicString(), "");
         op = EOpConstructFloat;
         TType errorType(EbtFloat);
         type.shallowCopy(errorType);
@@ -3196,6 +3212,12 @@
         break;
     }
 
+    TString constructorString;
+    if (intermediate.getEnhancedMsgs())
+        constructorString.append(type.getCompleteString(true, false, false, true)).append(" constructor");
+    else
+        constructorString.append("constructor");
+
     // See if it's a matrix
     bool constructingMatrix = false;
     switch (op) {
@@ -3253,7 +3275,7 @@
         if (function[arg].type->isArray()) {
             if (function[arg].type->isUnsizedArray()) {
                 // Can't construct from an unsized array.
-                error(loc, "array argument must be sized", "constructor", "");
+                error(loc, "array argument must be sized", constructorString.c_str(), "");
                 return true;
             }
             arrayArg = true;
@@ -3283,13 +3305,13 @@
             intArgument = true;
         if (type.isStruct()) {
             if (function[arg].type->contains16BitFloat()) {
-                requireFloat16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type");
+                requireFloat16Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 16-bit type");
             }
             if (function[arg].type->contains16BitInt()) {
-                requireInt16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type");
+                requireInt16Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 16-bit type");
             }
             if (function[arg].type->contains8BitInt()) {
-                requireInt8Arithmetic(loc, "constructor", "can't construct structure containing 8-bit type");
+                requireInt8Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 8-bit type");
             }
         }
     }
@@ -3303,9 +3325,9 @@
     case EOpConstructF16Vec3:
     case EOpConstructF16Vec4:
         if (type.isArray())
-            requireFloat16Arithmetic(loc, "constructor", "16-bit arrays not supported");
+            requireFloat16Arithmetic(loc, constructorString.c_str(), "16-bit arrays not supported");
         if (type.isVector() && function.getParamCount() != 1)
-            requireFloat16Arithmetic(loc, "constructor", "16-bit vectors only take vector types");
+            requireFloat16Arithmetic(loc, constructorString.c_str(), "16-bit vectors only take vector types");
         break;
     case EOpConstructUint16:
     case EOpConstructU16Vec2:
@@ -3316,9 +3338,9 @@
     case EOpConstructI16Vec3:
     case EOpConstructI16Vec4:
         if (type.isArray())
-            requireInt16Arithmetic(loc, "constructor", "16-bit arrays not supported");
+            requireInt16Arithmetic(loc, constructorString.c_str(), "16-bit arrays not supported");
         if (type.isVector() && function.getParamCount() != 1)
-            requireInt16Arithmetic(loc, "constructor", "16-bit vectors only take vector types");
+            requireInt16Arithmetic(loc, constructorString.c_str(), "16-bit vectors only take vector types");
         break;
     case EOpConstructUint8:
     case EOpConstructU8Vec2:
@@ -3329,9 +3351,9 @@
     case EOpConstructI8Vec3:
     case EOpConstructI8Vec4:
         if (type.isArray())
-            requireInt8Arithmetic(loc, "constructor", "8-bit arrays not supported");
+            requireInt8Arithmetic(loc, constructorString.c_str(), "8-bit arrays not supported");
         if (type.isVector() && function.getParamCount() != 1)
-            requireInt8Arithmetic(loc, "constructor", "8-bit vectors only take vector types");
+            requireInt8Arithmetic(loc, constructorString.c_str(), "8-bit vectors only take vector types");
         break;
     default:
         break;
@@ -3413,7 +3435,7 @@
 
     if (type.isArray()) {
         if (function.getParamCount() == 0) {
-            error(loc, "array constructor must have at least one argument", "constructor", "");
+            error(loc, "array constructor must have at least one argument", constructorString.c_str(), "");
             return true;
         }
 
@@ -3421,7 +3443,7 @@
             // auto adapt the constructor type to the number of arguments
             type.changeOuterArraySize(function.getParamCount());
         } else if (type.getOuterArraySize() != function.getParamCount()) {
-            error(loc, "array constructor needs one argument per array element", "constructor", "");
+            error(loc, "array constructor needs one argument per array element", constructorString.c_str(), "");
             return true;
         }
 
@@ -3434,7 +3456,7 @@
             // At least the dimensionalities have to match.
             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", "");
+                error(loc, "array constructor argument not correct type to construct array element", constructorString.c_str(), "");
                 return true;
             }
 
@@ -3451,7 +3473,7 @@
     }
 
     if (arrayArg && op != EOpConstructStruct && ! type.isArrayOfArrays()) {
-        error(loc, "constructing non-array constituent from array argument", "constructor", "");
+        error(loc, "constructing non-array constituent from array argument", constructorString.c_str(), "");
         return true;
     }
 
@@ -3461,51 +3483,51 @@
         // "If a matrix argument is given to a matrix constructor,
         // it is a compile-time error to have any other arguments."
         if (function.getParamCount() != 1)
-            error(loc, "matrix constructed from matrix can only have one argument", "constructor", "");
+            error(loc, "matrix constructed from matrix can only have one argument", constructorString.c_str(), "");
         return false;
     }
 
     if (overFull) {
-        error(loc, "too many arguments", "constructor", "");
+        error(loc, "too many arguments", constructorString.c_str(), "");
         return true;
     }
 
     if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {
-        error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", "");
+        error(loc, "Number of constructor parameters does not match the number of structure fields", constructorString.c_str(), "");
         return true;
     }
 
     if ((op != EOpConstructStruct && size != 1 && size < type.computeNumComponents()) ||
         (op == EOpConstructStruct && size < type.computeNumComponents())) {
-        error(loc, "not enough data provided for construction", "constructor", "");
+        error(loc, "not enough data provided for construction", constructorString.c_str(), "");
         return true;
     }
 
     if (type.isCoopMat() && function.getParamCount() != 1) {
-        error(loc, "wrong number of arguments", "constructor", "");
+        error(loc, "wrong number of arguments", constructorString.c_str(), "");
         return true;
     }
     if (type.isCoopMat() &&
         !(function[0].type->isScalar() || function[0].type->isCoopMat())) {
-        error(loc, "Cooperative matrix constructor argument must be scalar or cooperative matrix", "constructor", "");
+        error(loc, "Cooperative matrix constructor argument must be scalar or cooperative matrix", constructorString.c_str(), "");
         return true;
     }
 
     TIntermTyped* typed = node->getAsTyped();
     if (typed == nullptr) {
-        error(loc, "constructor argument does not have a type", "constructor", "");
+        error(loc, "constructor argument does not have a type", constructorString.c_str(), "");
         return true;
     }
     if (op != EOpConstructStruct && op != EOpConstructNonuniform && typed->getBasicType() == EbtSampler) {
-        error(loc, "cannot convert a sampler", "constructor", "");
+        error(loc, "cannot convert a sampler", constructorString.c_str(), "");
         return true;
     }
     if (op != EOpConstructStruct && typed->isAtomic()) {
-        error(loc, "cannot convert an atomic_uint", "constructor", "");
+        error(loc, "cannot convert an atomic_uint", constructorString.c_str(), "");
         return true;
     }
     if (typed->getBasicType() == EbtVoid) {
-        error(loc, "cannot convert a void", "constructor", "");
+        error(loc, "cannot convert a void", constructorString.c_str(), "");
         return true;
     }
 
@@ -4589,7 +4611,7 @@
 
     if (ssoPre150 ||
         (identifier == "gl_FragDepth"           && ((nonEsRedecls && version >= 420) || esRedecls)) ||
-        (identifier == "gl_FragCoord"           && ((nonEsRedecls && version >= 150) || esRedecls)) ||
+        (identifier == "gl_FragCoord"           && ((nonEsRedecls && version >= 140) || esRedecls)) ||
          identifier == "gl_ClipDistance"                                                            ||
          identifier == "gl_CullDistance"                                                            ||
          identifier == "gl_ShadingRateEXT"                                                          ||
@@ -4658,7 +4680,7 @@
                 symbolQualifier.storage != qualifier.storage)
                 error(loc, "cannot change qualification of", "redeclaration", symbol->getName().c_str());
         } else if (identifier == "gl_FragCoord") {
-            if (intermediate.inIoAccessed("gl_FragCoord"))
+            if (!intermediate.getTexCoordRedeclared() && intermediate.inIoAccessed("gl_FragCoord"))
                 error(loc, "cannot redeclare after use", "gl_FragCoord", "");
             if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||
                 qualifier.isMemory() || qualifier.isAuxiliary())
@@ -4668,6 +4690,9 @@
             if (! builtIn && (publicType.pixelCenterInteger != intermediate.getPixelCenterInteger() ||
                               publicType.originUpperLeft != intermediate.getOriginUpperLeft()))
                 error(loc, "cannot redeclare with different qualification:", "redeclaration", symbol->getName().c_str());
+
+
+            intermediate.setTexCoordRedeclared();
             if (publicType.pixelCenterInteger)
                 intermediate.setPixelCenterInteger();
             if (publicType.originUpperLeft)
@@ -5499,12 +5524,19 @@
     }
     if (language == EShLangFragment) {
         if (id == "origin_upper_left") {
-            requireProfile(loc, ECoreProfile | ECompatibilityProfile, "origin_upper_left");
+            requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, "origin_upper_left");
+            if (profile == ENoProfile) {
+                profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, "origin_upper_left");
+            }
+
             publicType.shaderQualifiers.originUpperLeft = true;
             return;
         }
         if (id == "pixel_center_integer") {
-            requireProfile(loc, ECoreProfile | ECompatibilityProfile, "pixel_center_integer");
+            requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, "pixel_center_integer");
+            if (profile == ENoProfile) {
+                profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, "pixel_center_integer");
+            }
             publicType.shaderQualifiers.pixelCenterInteger = true;
             return;
         }
@@ -6210,11 +6242,13 @@
 
 #ifndef GLSLANG_WEB
     if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) {
-        int repeated = intermediate.addXfbBufferOffset(type);
-        if (repeated >= 0)
-            error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
-        if (type.isUnsizedArray())
+        if (type.isUnsizedArray()) {
             error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer);
+        } else {
+            int repeated = intermediate.addXfbBufferOffset(type);
+            if (repeated >= 0)
+                error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
+        }
 
         // "The offset must be a multiple of the size of the first component of the first
         // qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate
@@ -6334,8 +6368,12 @@
         profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation);
     }
 
-    if (qualifier.isPushConstant() && type.getBasicType() != EbtBlock)
-        error(loc, "can only be used with a block", "push_constant", "");
+    if (qualifier.isPushConstant()) {
+        if (type.getBasicType() != EbtBlock)
+            error(loc, "can only be used with a block", "push_constant", "");
+        if (type.isArray())
+            error(loc, "Push constants blocks can't be an array", "push_constant", "");
+    }
 
     if (qualifier.hasBufferReference() && type.getBasicType() != EbtBlock)
         error(loc, "can only be used with a block", "buffer_reference", "");
@@ -6652,8 +6690,10 @@
                       : findFunctionExact(loc, call, builtIn));
     else if (version < 120)
         function = findFunctionExact(loc, call, builtIn);
-    else if (version < 400)
-        function = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn);
+    else if (version < 400) {
+        bool needfindFunction400 = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) || extensionTurnedOn(E_GL_ARB_gpu_shader5);
+        function = needfindFunction400 ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn);
+    }
     else if (explicitTypesEnabled)
         function = findFunctionExplicitTypes(loc, call, builtIn);
     else
@@ -7424,14 +7464,14 @@
     // Uniforms require a compile-time constant initializer
     if (qualifier == EvqUniform && ! initializer->getType().getQualifier().isFrontEndConstant()) {
         error(loc, "uniform initializers must be constant", "=", "'%s'",
-              variable->getType().getCompleteString().c_str());
+              variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());
         variable->getWritableType().getQualifier().makeTemporary();
         return nullptr;
     }
     // Global consts require a constant initializer (specialization constant is okay)
     if (qualifier == EvqConst && symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {
         error(loc, "global const initializers must be constant", "=", "'%s'",
-              variable->getType().getCompleteString().c_str());
+              variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());
         variable->getWritableType().getQualifier().makeTemporary();
         return nullptr;
     }
@@ -7494,7 +7534,7 @@
         TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);
         TIntermTyped* initNode = intermediate.addAssign(EOpAssign, intermSymbol, initializer, loc);
         if (! initNode)
-            assignError(loc, "=", intermSymbol->getCompleteString(), initializer->getCompleteString());
+            assignError(loc, "=", intermSymbol->getCompleteString(intermediate.getEnhancedMsgs()), initializer->getCompleteString(intermediate.getEnhancedMsgs()));
 
         return initNode;
     }
@@ -7565,7 +7605,7 @@
         }
     } else if (type.isMatrix()) {
         if (type.getMatrixCols() != (int)initList->getSequence().size()) {
-            error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
+            error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
             return nullptr;
         }
         TType vectorType(type, 0); // dereferenced type
@@ -7576,20 +7616,20 @@
         }
     } else if (type.isVector()) {
         if (type.getVectorSize() != (int)initList->getSequence().size()) {
-            error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
+            error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
             return nullptr;
         }
         TBasicType destType = type.getBasicType();
         for (int i = 0; i < type.getVectorSize(); ++i) {
             TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType();
             if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) {
-                error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString().c_str());
+                error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
                 return nullptr;
             }
 
         }
     } else {
-        error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str());
+        error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
         return nullptr;
     }
 
@@ -8097,8 +8137,9 @@
 {
     TIntermTyped* converted = intermediate.addConversion(EOpConstructStruct, type, node->getAsTyped());
     if (! converted || converted->getType() != type) {
+        bool enhanced = intermediate.getEnhancedMsgs();
         error(loc, "", "constructor", "cannot convert parameter %d from '%s' to '%s'", paramCount,
-              node->getAsTyped()->getType().getCompleteString().c_str(), type.getCompleteString().c_str());
+              node->getAsTyped()->getType().getCompleteString(enhanced).c_str(), type.getCompleteString(enhanced).c_str());
 
         return nullptr;
     }
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index a2dd71c..a5ba40e 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -813,6 +813,7 @@
     // set version/profile to defaultVersion/defaultProfile regardless of the #version
     // directive in the source code
     bool forceDefaultVersionAndProfile,
+    int overrideVersion, // overrides version specified by #verison or default version
     bool forwardCompatible,     // give errors for use of deprecated features
     EShMessages messages,       // warnings/errors/AST; things to print out
     TIntermediate& intermediate, // returned tree, etc.
@@ -900,6 +901,9 @@
         version = defaultVersion;
         profile = defaultProfile;
     }
+    if (source == EShSourceGlsl && overrideVersion != 0) {
+        version = overrideVersion;
+    }
 
     bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage,
                                             versionNotFirst, defaultVersion, source, version, profile, spvVersion);
@@ -1275,6 +1279,7 @@
     int defaultVersion,         // use 100 for ES environment, 110 for desktop
     EProfile defaultProfile,
     bool forceDefaultVersionAndProfile,
+    int overrideVersion,        // use 0 if not overriding GLSL version
     bool forwardCompatible,     // give errors for use of deprecated features
     EShMessages messages,       // warnings/errors/AST; things to print out
     TShader::Includer& includer,
@@ -1285,7 +1290,7 @@
     DoPreprocessing parser(outputString);
     return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
                            preamble, optLevel, resources, defaultVersion,
-                           defaultProfile, forceDefaultVersionAndProfile,
+                           defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
                            forwardCompatible, messages, intermediate, parser,
                            false, includer, "", environment);
 }
@@ -1314,6 +1319,7 @@
     int defaultVersion,         // use 100 for ES environment, 110 for desktop
     EProfile defaultProfile,
     bool forceDefaultVersionAndProfile,
+    int overrideVersion,        // use 0 if not overriding GLSL version
     bool forwardCompatible,     // give errors for use of deprecated features
     EShMessages messages,       // warnings/errors/AST; things to print out
     TIntermediate& intermediate,// returned tree, etc.
@@ -1324,7 +1330,7 @@
     DoFullParse parser;
     return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
                            preamble, optLevel, resources, defaultVersion,
-                           defaultProfile, forceDefaultVersionAndProfile,
+                           defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
                            forwardCompatible, messages, intermediate, parser,
                            true, includer, sourceEntryPointName, environment);
 }
@@ -1498,7 +1504,7 @@
     TIntermediate intermediate(compiler->getLanguage());
     TShader::ForbidIncluder includer;
     bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr,
-                                   "", optLevel, resources, defaultVersion, ENoProfile, false,
+                                   "", optLevel, resources, defaultVersion, ENoProfile, false, 0,
                                    forwardCompatible, messages, intermediate, includer);
 
     //
@@ -1759,7 +1765,7 @@
 };
 
 TShader::TShader(EShLanguage s)
-    : stage(s), lengths(nullptr), stringNames(nullptr), preamble("")
+    : stage(s), lengths(nullptr), stringNames(nullptr), preamble(""), overrideVersion(0)
 {
     pool = new TPoolAllocator;
     infoSink = new TInfoSink;
@@ -1828,7 +1834,14 @@
     intermediate->setUniqueId(id);
 }
 
+void TShader::setOverrideVersion(int version)
+{
+    overrideVersion = version;
+}
+
 void TShader::setInvertY(bool invert)                   { intermediate->setInvertY(invert); }
+void TShader::setDxPositionW(bool invert)               { intermediate->setDxPositionW(invert); }
+void TShader::setEnhancedMsgs()                         { intermediate->setEnhancedMsgs(); }
 void TShader::setNanMinMaxClamp(bool useNonNan)         { intermediate->setNanMinMaxClamp(useNonNan); }
 
 #ifndef GLSLANG_WEB
@@ -1908,7 +1921,7 @@
 
     return CompileDeferred(compiler, strings, numStrings, lengths, stringNames,
                            preamble, EShOptNone, builtInResources, defaultVersion,
-                           defaultProfile, forceDefaultVersionAndProfile,
+                           defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
                            forwardCompatible, messages, *intermediate, includer, sourceEntryPointName,
                            &environment);
 }
@@ -1935,7 +1948,7 @@
 
     return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble,
                               EShOptNone, builtInResources, defaultVersion,
-                              defaultProfile, forceDefaultVersionAndProfile,
+                              defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
                               forwardCompatible, message, includer, *intermediate, output_string,
                               &environment);
 }
@@ -2048,6 +2061,8 @@
                                                 firstIntermediate->getVersion(),
                                                 firstIntermediate->getProfile());
         intermediate[stage]->setLimits(firstIntermediate->getLimits());
+        if (firstIntermediate->getEnhancedMsgs())
+            intermediate[stage]->setEnhancedMsgs();
 
         // The new TIntermediate must use the same origin as the original TIntermediates.
         // Otherwise linking will fail due to different coordinate systems.
diff --git a/glslang/MachineIndependent/SymbolTable.cpp b/glslang/MachineIndependent/SymbolTable.cpp
index 5b7e27f..a3ffa0c 100644
--- a/glslang/MachineIndependent/SymbolTable.cpp
+++ b/glslang/MachineIndependent/SymbolTable.cpp
@@ -426,12 +426,7 @@
     symTableLevel->thisLevel = thisLevel;
     symTableLevel->retargetedSymbols.clear();
     for (auto &s : retargetedSymbols) {
-        // Extra constructions to make sure they use the correct allocator pool
-        TString newFrom;
-        newFrom = s.first;
-        TString newTo;
-        newTo = s.second;
-        symTableLevel->retargetedSymbols.push_back({std::move(newFrom), std::move(newTo)});
+        symTableLevel->retargetedSymbols.push_back({s.first, s.second});
     }
     std::vector<bool> containerCopied(anonId, false);
     tLevel::const_iterator iter;
@@ -462,11 +457,7 @@
         TSymbol* sym = symTableLevel->find(s.second);
         if (!sym)
             continue;
-
-        // Need to declare and assign so newS is using the correct pool allocator
-        TString newS;
-        newS = s.first;
-        symTableLevel->insert(newS, sym);
+        symTableLevel->insert(s.first, sym);
     }
 
     return symTableLevel;
diff --git a/glslang/MachineIndependent/SymbolTable.h b/glslang/MachineIndependent/SymbolTable.h
index 720999a..31312ec 100644
--- a/glslang/MachineIndependent/SymbolTable.h
+++ b/glslang/MachineIndependent/SymbolTable.h
@@ -84,7 +84,7 @@
 class TSymbol {
 public:
     POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
-    explicit TSymbol(const TString *n) :  name(n), extensions(0), writable(true) { }
+    explicit TSymbol(const TString *n) :  name(n), uniqueId(0), extensions(0), writable(true) { }
     virtual TSymbol* clone() const = 0;
     virtual ~TSymbol() { }  // rely on all symbol owned memory coming from the pool
 
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 2fc0d9e..8d96e0e 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -226,6 +226,8 @@
     extensionBehavior[E_GL_ARB_texture_query_lod]            = EBhDisable;
     extensionBehavior[E_GL_ARB_vertex_attrib_64bit]          = EBhDisable;
     extensionBehavior[E_GL_ARB_draw_instanced]               = EBhDisable;
+    extensionBehavior[E_GL_ARB_fragment_coord_conventions]   = EBhDisable;
+
 
     extensionBehavior[E_GL_KHR_shader_subgroup_basic]            = EBhDisable;
     extensionBehavior[E_GL_KHR_shader_subgroup_vote]             = EBhDisable;
@@ -467,6 +469,7 @@
             "#define GL_ARB_texture_query_lod 1\n"
             "#define GL_ARB_vertex_attrib_64bit 1\n"
             "#define GL_ARB_draw_instanced 1\n"
+            "#define GL_ARB_fragment_coord_conventions 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             "#define GL_EXT_shader_image_load_formatted 1\n"
             "#define GL_EXT_post_depth_coverage 1\n"
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 2dbac0b..96a6e1f 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -162,6 +162,7 @@
 const char* const E_GL_ARB_texture_query_lod            = "GL_ARB_texture_query_lod";
 const char* const E_GL_ARB_vertex_attrib_64bit          = "GL_ARB_vertex_attrib_64bit";
 const char* const E_GL_ARB_draw_instanced               = "GL_ARB_draw_instanced";
+const char* const E_GL_ARB_fragment_coord_conventions   = "GL_ARB_fragment_coord_conventions";
 
 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";
diff --git a/glslang/MachineIndependent/glslang.m4 b/glslang/MachineIndependent/glslang.m4
index d4cc5bc..624add5 100644
--- a/glslang/MachineIndependent/glslang.m4
+++ b/glslang/MachineIndependent/glslang.m4
@@ -798,7 +798,7 @@
         parseContext.rValueErrorCheck($5.loc, ":", $6);
         $$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc);
         if ($$ == 0) {
-            parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(), $6->getCompleteString());
+            parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $6->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             $$ = $6;
         }
     }
@@ -815,7 +815,7 @@
         parseContext.rValueErrorCheck($2.loc, "assign", $3);
         $$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
         if ($$ == 0) {
-            parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString());
+            parseContext.assignError($2.loc, "assign", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             $$ = $1;
         }
     }
@@ -877,7 +877,7 @@
         parseContext.samplerConstructorLocationCheck($2.loc, ",", $3);
         $$ = parseContext.intermediate.addComma($1, $3, $2.loc);
         if ($$ == 0) {
-            parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(), $3->getCompleteString());
+            parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             $$ = $3;
         }
     }
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index df53eb5..93c9899 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -798,7 +798,7 @@
         parseContext.rValueErrorCheck($5.loc, ":", $6);
         $$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc);
         if ($$ == 0) {
-            parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(), $6->getCompleteString());
+            parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $6->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             $$ = $6;
         }
     }
@@ -815,7 +815,7 @@
         parseContext.rValueErrorCheck($2.loc, "assign", $3);
         $$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
         if ($$ == 0) {
-            parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString());
+            parseContext.assignError($2.loc, "assign", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             $$ = $1;
         }
     }
@@ -877,7 +877,7 @@
         parseContext.samplerConstructorLocationCheck($2.loc, ",", $3);
         $$ = parseContext.intermediate.addComma($1, $3, $2.loc);
         if ($$ == 0) {
-            parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(), $3->getCompleteString());
+            parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             $$ = $3;
         }
     }
diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp
index 5ba6a6d..0b216b6 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp
+++ b/glslang/MachineIndependent/glslang_tab.cpp
@@ -5878,7 +5878,7 @@
         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());
+            parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
@@ -5902,7 +5902,7 @@
         parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.addAssign((yyvsp[-1].interm).loc, (yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0) {
-            parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
@@ -6023,7 +6023,7 @@
         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());
+            parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index a0fade1..d8a3aab 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -48,37 +48,6 @@
 #endif
 #include <cstdint>
 
-namespace {
-
-bool IsInfinity(double x) {
-#ifdef _MSC_VER
-    switch (_fpclass(x)) {
-    case _FPCLASS_NINF:
-    case _FPCLASS_PINF:
-        return true;
-    default:
-        return false;
-    }
-#else
-    return std::isinf(x);
-#endif
-}
-
-bool IsNan(double x) {
-#ifdef _MSC_VER
-    switch (_fpclass(x)) {
-    case _FPCLASS_SNAN:
-    case _FPCLASS_QNAN:
-        return true;
-    default:
-        return false;
-    }
-#else
-  return std::isnan(x);
-#endif
-}
-
-}
 
 namespace glslang {
 
diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp
index 19eabdf..4250e92 100644
--- a/glslang/MachineIndependent/iomapper.cpp
+++ b/glslang/MachineIndependent/iomapper.cpp
@@ -203,11 +203,7 @@
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
         TVarEntryInfo& ent = entKey.second;
-        ent.newLocation = -1;
-        ent.newComponent = -1;
-        ent.newBinding = -1;
-        ent.newSet = -1;
-        ent.newIndex = -1;
+        ent.clearNewAssignments();
         const bool isValid = resolver.validateBinding(stage, ent);
         if (isValid) {
             resolver.resolveSet(ent.stage, ent);
@@ -281,11 +277,7 @@
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)
     {
         TVarEntryInfo& ent = entKey.second;
-        ent.newLocation = -1;
-        ent.newComponent = -1;
-        ent.newBinding = -1;
-        ent.newSet = -1;
-        ent.newIndex = -1;
+        ent.clearNewAssignments();
         const bool isValid = resolver.validateInOut(ent.stage, ent);
         if (isValid) {
             resolver.resolveInOutLocation(stage, ent);
@@ -514,6 +506,24 @@
                         return;
                     }
                     else {
+                        // Deal with input/output pairs where one is a block member but the other is loose,
+                        // e.g. with ARB_separate_shader_objects
+                        if (type1.getBasicType() == EbtBlock &&
+                            type1.isStruct() && !type2.isStruct()) {
+                            // Iterate through block members tracking layout
+                            glslang::TString name;
+                            type1.getStruct()->begin()->type->appendMangledName(name);
+                            if (name == mangleName2
+                                && type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return;
+                        }
+                        if (type2.getBasicType() == EbtBlock &&
+                            type2.isStruct() && !type1.isStruct()) {
+                            // Iterate through block members tracking layout
+                            glslang::TString name;
+                            type2.getStruct()->begin()->type->appendMangledName(name);
+                            if (name == mangleName1
+                                && type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return;
+                        }
                         TString err = "Invalid In/Out variable type : " + entKey.first;
                         infoSink.info.message(EPrefixInternalError, err.c_str());
                         hadError = true;
@@ -827,7 +837,7 @@
     }
     // 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.isAtomic() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
+        type.isAtomic() || type.isSpirvType() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
         return ent.newLocation = -1;
     }
     // no locations on blocks of built-in variables
@@ -855,8 +865,8 @@
         return ent.newLocation = -1;
     }
 
-    // no locations added if already present, or a built-in variable
-    if (type.getQualifier().hasLocation() || type.isBuiltIn()) {
+    // no locations added if already present, a built-in variable, or a variable with SPIR-V decorate
+    if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getQualifier().hasSprivDecorate()) {
         return ent.newLocation = -1;
     }
 
@@ -942,8 +952,8 @@
     if (type.getQualifier().hasLocation()) {
         return ent.newLocation = type.getQualifier().layoutLocation;
     }
-    // no locations added if already present, or a built-in variable
-    if (type.isBuiltIn()) {
+    // no locations added if already present, a built-in variable, or a variable with SPIR-V decorate
+    if (type.isBuiltIn() || type.getQualifier().hasSprivDecorate()) {
         return ent.newLocation = -1;
     }
     // no locations on blocks of built-in variables
@@ -1024,7 +1034,8 @@
     } else {
         // 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.isAtomic() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
+            type.isAtomic() || type.isSpirvType() ||
+            (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
             return ent.newLocation = -1;
         }
         // no locations on blocks of built-in variables
@@ -1651,6 +1662,10 @@
                     if (size <= int(autoPushConstantMaxSize)) {
                         qualifier.setBlockStorage(EbsPushConstant);
                         qualifier.layoutPacking = autoPushConstantBlockPacking;
+                        // Push constants don't have set/binding etc. decorations, remove those.
+                        qualifier.layoutSet = TQualifier::layoutSetEnd;
+                        at->second.clearNewAssignments();
+
                         upgraded = true;
                     }
                 }
@@ -1658,10 +1673,14 @@
             // If it's been upgraded to push_constant, then remove it from the uniformVector
             // so it doesn't get a set/binding assigned to it.
             if (upgraded) {
-                auto at = std::find_if(uniformVector.begin(), uniformVector.end(),
-                                       [this](const TVarLivePair& p) { return p.first == autoPushConstantBlockName; });
-                if (at != uniformVector.end())
-                    uniformVector.erase(at);
+                while (1) {
+                    auto at = std::find_if(uniformVector.begin(), uniformVector.end(),
+                                           [this](const TVarLivePair& p) { return p.first == autoPushConstantBlockName; });
+                    if (at != uniformVector.end())
+                        uniformVector.erase(at);
+                    else
+                        break;
+                }
             }
         }
         for (size_t stage = 0; stage < EShLangCount; stage++) {
diff --git a/glslang/MachineIndependent/iomapper.h b/glslang/MachineIndependent/iomapper.h
index c43864e..ba7bc3b 100644
--- a/glslang/MachineIndependent/iomapper.h
+++ b/glslang/MachineIndependent/iomapper.h
@@ -61,6 +61,15 @@
     int newComponent;
     int newIndex;
     EShLanguage stage;
+
+    void clearNewAssignments() {
+        newBinding = -1;
+        newSet = -1;
+        newLocation = -1;
+        newComponent = -1;
+        newIndex = -1;
+    }
+
     struct TOrderById {
         inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) { return l.id < r.id; }
     };
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index b1adfc9..9b45570 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -55,22 +55,28 @@
 //
 // Link-time error emitter.
 //
-void TIntermediate::error(TInfoSink& infoSink, const char* message)
+void TIntermediate::error(TInfoSink& infoSink, const char* message, EShLanguage unitStage)
 {
 #ifndef GLSLANG_WEB
     infoSink.info.prefix(EPrefixError);
-    infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
+    if (unitStage < EShLangCount)
+        infoSink.info << "Linking " << StageName(getStage()) << " and " << StageName(unitStage) << " stages: " << message << "\n";
+    else
+        infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
 #endif
 
     ++numErrors;
 }
 
 // Link-time warning.
-void TIntermediate::warn(TInfoSink& infoSink, const char* message)
+void TIntermediate::warn(TInfoSink& infoSink, const char* message, EShLanguage unitStage)
 {
 #ifndef GLSLANG_WEB
     infoSink.info.prefix(EPrefixWarning);
-    infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
+    if (unitStage < EShLangCount)
+        infoSink.info << "Linking " << StageName(language) << " and " << StageName(unitStage) << " stages: " << message << "\n";
+    else
+        infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
 #endif
 }
 
@@ -312,6 +318,7 @@
     MERGE_TRUE(autoMapBindings);
     MERGE_TRUE(autoMapLocations);
     MERGE_TRUE(invertY);
+    MERGE_TRUE(dxPositionW);
     MERGE_TRUE(flattenUniformArrays);
     MERGE_TRUE(useUnknownFormat);
     MERGE_TRUE(hlslOffsets);
@@ -579,9 +586,6 @@
 }
 
 void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unit) {
-    if (block->getType() == unitBlock->getType()) {
-        return;
-    }
 
     if (block->getType().getTypeName() != unitBlock->getType().getTypeName() ||
         block->getType().getBasicType() != unitBlock->getType().getBasicType() ||
@@ -628,44 +632,42 @@
         }
     }
 
-    TType unitType;
-    unitType.shallowCopy(unitBlock->getType());
-
     // update symbol node in unit tree,
     // and other nodes that may reference it
     class TMergeBlockTraverser : public TIntermTraverser {
     public:
-        TMergeBlockTraverser(const glslang::TType &type, const glslang::TType& unitType,
-                             glslang::TIntermediate& unit,
-                             const std::map<unsigned int, unsigned int>& memberIdxUpdates) :
-            newType(type), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates)
-        { }
-        virtual ~TMergeBlockTraverser() { }
+        TMergeBlockTraverser(const TIntermSymbol* newSym)
+            : newSymbol(newSym), unitType(nullptr), unit(nullptr), memberIndexUpdates(nullptr)
+        {
+        }
+        TMergeBlockTraverser(const TIntermSymbol* newSym, const glslang::TType* unitType, glslang::TIntermediate* unit,
+                             const std::map<unsigned int, unsigned int>* memberIdxUpdates)
+            : newSymbol(newSym), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates)
+        {
+        }
+        virtual ~TMergeBlockTraverser() {}
 
-        const glslang::TType& newType;          // type with modifications
-        const glslang::TType& unitType;         // copy of original type
-        glslang::TIntermediate& unit;           // intermediate that is being updated
-        const std::map<unsigned int, unsigned int>& memberIndexUpdates;
+        const TIntermSymbol* newSymbol;
+        const glslang::TType* unitType; // copy of original type
+        glslang::TIntermediate* unit;   // intermediate that is being updated
+        const std::map<unsigned int, unsigned int>* memberIndexUpdates;
 
         virtual void visitSymbol(TIntermSymbol* symbol)
         {
-            glslang::TType& symType = symbol->getWritableType();
-
-            if (symType == unitType) {
-                // each symbol node has a local copy of the unitType
-                //  if merging involves changing properties that aren't shared objects
-                //  they should be updated in all instances
-
-                // e.g. the struct list is a ptr to an object, so it can be updated
-                // once, outside the traverser
-                //*symType.getWritableStruct() = *newType.getStruct();
+            if (newSymbol->getAccessName() == symbol->getAccessName() &&
+                newSymbol->getQualifier().getBlockStorage() == symbol->getQualifier().getBlockStorage()) {
+                // Each symbol node may have a local copy of the block structure.
+                // Update those structures to match the new one post-merge
+                *(symbol->getWritableType().getWritableStruct()) = *(newSymbol->getType().getStruct());
             }
-
         }
 
         virtual bool visitBinary(TVisit, glslang::TIntermBinary* node)
         {
-            if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == unitType) {
+            if (!unit || !unitType || !memberIndexUpdates || memberIndexUpdates->empty())
+                return true;
+
+            if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == *unitType) {
                 // this is a dereference to a member of the block since the
                 // member list changed, need to update this to point to the
                 // right index
@@ -673,8 +675,8 @@
 
                 glslang::TIntermConstantUnion* constNode = node->getRight()->getAsConstantUnion();
                 unsigned int memberIdx = constNode->getConstArray()[0].getUConst();
-                unsigned int newIdx = memberIndexUpdates.at(memberIdx);
-                TIntermTyped* newConstNode = unit.addConstantUnion(newIdx, node->getRight()->getLoc());
+                unsigned int newIdx = memberIndexUpdates->at(memberIdx);
+                TIntermTyped* newConstNode = unit->addConstantUnion(newIdx, node->getRight()->getLoc());
 
                 node->setRight(newConstNode);
                 delete constNode;
@@ -683,10 +685,20 @@
             }
             return true;
         }
-    } finalLinkTraverser(block->getType(), unitType, *unit, memberIndexUpdates);
+    };
 
-    // update the tree to use the new type
-    unit->getTreeRoot()->traverse(&finalLinkTraverser);
+    // 'this' may have symbols that are using the old block structure, so traverse the tree to update those
+    // in 'visitSymbol'
+    TMergeBlockTraverser finalLinkTraverser(block);
+    getTreeRoot()->traverse(&finalLinkTraverser);
+
+    // The 'unit' intermediate needs the block structures update, but also structure entry indices 
+    // may have changed from the old block to the new one that it was merged into, so update those
+    // in 'visitBinary'
+    TType unitType;
+    unitType.shallowCopy(unitBlock->getType());
+    TMergeBlockTraverser unitFinalLinkTraverser(block, &unitType, unit, &memberIndexUpdates);
+    unit->getTreeRoot()->traverse(&unitFinalLinkTraverser);
 
     // update the member list
     (*unitMemberList) = (*memberList);
@@ -759,7 +771,10 @@
 
                     auto checkName = [this, unitSymbol, &infoSink](const TString& name) {
                         for (unsigned int i = 0; i < unitSymbol->getType().getStruct()->size(); ++i) {
-                            if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()) {
+                            if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()
+                                && !((*unitSymbol->getType().getStruct())[i].type->getQualifier().hasLocation()
+                                    || unitSymbol->getType().getQualifier().hasLocation())
+                                ) {
                                 error(infoSink, "Anonymous member name used for global variable or other anonymous member: ");
                                 infoSink.info << (*unitSymbol->getType().getStruct())[i].type->getCompleteString() << "\n";
                             }
@@ -815,6 +830,10 @@
 #if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     bool crossStage = getStage() != unitStage;
     bool writeTypeComparison = false;
+    bool errorReported = false;
+    bool printQualifiers = false;
+    bool printPrecision = false;
+    bool printType = false;
 
     // Types have to match
     {
@@ -846,11 +865,48 @@
                 (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));
         }
 
-        if (!symbol.getType().sameElementType(unitSymbol.getType()) ||
-            !symbol.getType().sameTypeParameters(unitSymbol.getType()) ||
-            !arraysMatch ) {
+        int lpidx = -1;
+        int rpidx = -1;
+        if (!symbol.getType().sameElementType(unitSymbol.getType(), &lpidx, &rpidx)) {
+            if (lpidx >= 0 && rpidx >= 0) {
+                error(infoSink, "Member names and types must match:", unitStage);
+                infoSink.info << "    Block: " << symbol.getType().getTypeName() << "\n";
+                infoSink.info << "        " << StageName(getStage()) << " stage: \""
+                              << (*symbol.getType().getStruct())[lpidx].type->getCompleteString(true, false, false, true,
+                                      (*symbol.getType().getStruct())[lpidx].type->getFieldName()) << "\"\n";
+                infoSink.info << "        " << StageName(unitStage) << " stage: \""
+                              << (*unitSymbol.getType().getStruct())[rpidx].type->getCompleteString(true, false, false, true,
+                                      (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName()) << "\"\n";
+                errorReported = true;
+            } else if (lpidx >= 0 && rpidx == -1) {
+                  TString errmsg = StageName(getStage());
+                  errmsg.append(" block member has no corresponding member in ").append(StageName(unitStage)).append(" block:");
+                  error(infoSink, errmsg.c_str(), unitStage);
+                  infoSink.info << "    " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: "
+                    << (*symbol.getType().getStruct())[lpidx].type->getFieldName() << "\n";
+                  infoSink.info << "    " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: n/a \n";
+                  errorReported = true;
+            } else if (lpidx == -1 && rpidx >= 0) {
+                  TString errmsg = StageName(unitStage);
+                  errmsg.append(" block member has no corresponding member in ").append(StageName(getStage())).append(" block:");
+                  error(infoSink, errmsg.c_str(), unitStage);
+                  infoSink.info << "    " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: "
+                    << (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName() << "\n";
+                  infoSink.info << "    " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: n/a \n";
+                  errorReported = true;
+            } else {
+                  error(infoSink, "Types must match:", unitStage);
+                  writeTypeComparison = true;
+                  printType = true;
+            }
+        } else if (!arraysMatch) {
+            error(infoSink, "Array sizes must be compatible:", unitStage);
             writeTypeComparison = true;
-            error(infoSink, "Types must match:");
+            printType = true;
+        } else if (!symbol.getType().sameTypeParameters(unitSymbol.getType())) {
+            error(infoSink, "Type parameters must match:", unitStage);
+            writeTypeComparison = true;
+            printType = true;
         }
     }
 
@@ -871,13 +927,35 @@
             }
             const TQualifier& qualifier = (*symbol.getType().getStruct())[li].type->getQualifier();
             const TQualifier & unitQualifier = (*unitSymbol.getType().getStruct())[ri].type->getQualifier();
-            if (qualifier.layoutMatrix     != unitQualifier.layoutMatrix ||
-                qualifier.layoutOffset     != unitQualifier.layoutOffset ||
-                qualifier.layoutAlign      != unitQualifier.layoutAlign ||
-                qualifier.layoutLocation   != unitQualifier.layoutLocation ||
-                qualifier.layoutComponent  != unitQualifier.layoutComponent) {
-                error(infoSink, "Interface block member layout qualifiers must match:");
-                writeTypeComparison = true;
+            bool layoutQualifierError = false;
+            if (qualifier.layoutMatrix != unitQualifier.layoutMatrix) {
+                error(infoSink, "Interface block member layout matrix qualifier must match:", unitStage);
+                layoutQualifierError = true;
+            }
+            if (qualifier.layoutOffset != unitQualifier.layoutOffset) {
+                error(infoSink, "Interface block member layout offset qualifier must match:", unitStage);
+                layoutQualifierError = true;
+            }
+            if (qualifier.layoutAlign != unitQualifier.layoutAlign) {
+                error(infoSink, "Interface block member layout align qualifier must match:", unitStage);
+                layoutQualifierError = true;
+            }
+            if (qualifier.layoutLocation != unitQualifier.layoutLocation) {
+                error(infoSink, "Interface block member layout location qualifier must match:", unitStage);
+                layoutQualifierError = true;
+            }
+            if (qualifier.layoutComponent != unitQualifier.layoutComponent) {
+                error(infoSink, "Interface block member layout component qualifier must match:", unitStage);
+                layoutQualifierError = true;
+            }
+            if (layoutQualifierError) {
+                infoSink.info << "    " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: "
+                              << (*symbol.getType().getStruct())[li].type->getFieldName() << " \""
+                              << (*symbol.getType().getStruct())[li].type->getCompleteString(true, true, false, false) << "\"\n";
+                infoSink.info << "    " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: "
+                              << (*unitSymbol.getType().getStruct())[ri].type->getFieldName() << " \""
+                              << (*unitSymbol.getType().getStruct())[ri].type->getCompleteString(true, true, false, false) << "\"\n";
+                errorReported = true;
             }
             ++li;
             ++ri;
@@ -891,8 +969,9 @@
     // Qualifiers have to (almost) match
     // Storage...
     if (!isInOut && symbol.getQualifier().storage != unitSymbol.getQualifier().storage) {
-        error(infoSink, "Storage qualifiers must match:");
+        error(infoSink, "Storage qualifiers must match:", unitStage);
         writeTypeComparison = true;
+        printQualifiers = true;
     }
 
     // Uniform and buffer blocks must either both have an instance name, or
@@ -900,33 +979,36 @@
     if (symbol.getQualifier().isUniformOrBuffer() &&
         (IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()))) {
         error(infoSink, "Matched Uniform or Storage blocks must all be anonymous,"
-                        " or all be named:");
+                        " or all be named:", unitStage);
         writeTypeComparison = true;
     }
 
     if (symbol.getQualifier().storage == unitSymbol.getQualifier().storage &&
         (IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()) ||
          (!IsAnonymous(symbol.getName()) && symbol.getName() != unitSymbol.getName()))) {
-        warn(infoSink, "Matched shader interfaces are using different instance names.");
+        warn(infoSink, "Matched shader interfaces are using different instance names.", unitStage);
         writeTypeComparison = true;
     }
 
     // Precision...
     if (!isInOut && symbol.getQualifier().precision != unitSymbol.getQualifier().precision) {
-        error(infoSink, "Precision qualifiers must match:");
+        error(infoSink, "Precision qualifiers must match:", unitStage);
         writeTypeComparison = true;
+        printPrecision = true;
     }
 
     // Invariance...
     if (! crossStage && symbol.getQualifier().invariant != unitSymbol.getQualifier().invariant) {
-        error(infoSink, "Presence of invariant qualifier must match:");
+        error(infoSink, "Presence of invariant qualifier must match:", unitStage);
         writeTypeComparison = true;
+        printQualifiers = true;
     }
 
     // Precise...
     if (! crossStage && symbol.getQualifier().isNoContraction() != unitSymbol.getQualifier().isNoContraction()) {
-        error(infoSink, "Presence of precise qualifier must match:");
+        error(infoSink, "Presence of precise qualifier must match:", unitStage);
         writeTypeComparison = true;
+        printPrecision = true;
     }
 
     // Auxiliary and interpolation...
@@ -940,57 +1022,137 @@
         symbol.getQualifier().isSample()!= unitSymbol.getQualifier().isSample() ||
         symbol.getQualifier().isPatch() != unitSymbol.getQualifier().isPatch() ||
         symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective())) {
-        error(infoSink, "Interpolation and auxiliary storage qualifiers must match:");
+        error(infoSink, "Interpolation and auxiliary storage qualifiers must match:", unitStage);
         writeTypeComparison = true;
+        printQualifiers = true;
     }
 
     // Memory...
-    if (symbol.getQualifier().coherent          != unitSymbol.getQualifier().coherent ||
-        symbol.getQualifier().devicecoherent    != unitSymbol.getQualifier().devicecoherent ||
-        symbol.getQualifier().queuefamilycoherent  != unitSymbol.getQualifier().queuefamilycoherent ||
-        symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent ||
-        symbol.getQualifier().subgroupcoherent  != unitSymbol.getQualifier().subgroupcoherent ||
-        symbol.getQualifier().shadercallcoherent!= unitSymbol.getQualifier().shadercallcoherent ||
-        symbol.getQualifier().nonprivate        != unitSymbol.getQualifier().nonprivate ||
-        symbol.getQualifier().volatil           != unitSymbol.getQualifier().volatil ||
-        symbol.getQualifier().restrict          != unitSymbol.getQualifier().restrict ||
-        symbol.getQualifier().readonly          != unitSymbol.getQualifier().readonly ||
-        symbol.getQualifier().writeonly         != unitSymbol.getQualifier().writeonly) {
-        error(infoSink, "Memory qualifiers must match:");
-        writeTypeComparison = true;
+    bool memoryQualifierError = false;
+    if (symbol.getQualifier().coherent != unitSymbol.getQualifier().coherent) {
+        error(infoSink, "Memory coherent qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().devicecoherent != unitSymbol.getQualifier().devicecoherent) {
+        error(infoSink, "Memory devicecoherent qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().queuefamilycoherent != unitSymbol.getQualifier().queuefamilycoherent) {
+        error(infoSink, "Memory queuefamilycoherent qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent) {
+        error(infoSink, "Memory workgroupcoherent qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().subgroupcoherent != unitSymbol.getQualifier().subgroupcoherent) {
+        error(infoSink, "Memory subgroupcoherent qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().shadercallcoherent != unitSymbol.getQualifier().shadercallcoherent) {
+        error(infoSink, "Memory shadercallcoherent qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().nonprivate != unitSymbol.getQualifier().nonprivate) {
+        error(infoSink, "Memory nonprivate qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().volatil != unitSymbol.getQualifier().volatil) {
+        error(infoSink, "Memory volatil qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().restrict != unitSymbol.getQualifier().restrict) {
+        error(infoSink, "Memory restrict qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().readonly != unitSymbol.getQualifier().readonly) {
+        error(infoSink, "Memory readonly qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) {
+        error(infoSink, "Memory writeonly qualifier must match:", unitStage);
+        memoryQualifierError = true;
+    }
+    if (memoryQualifierError) {
+          writeTypeComparison = true;
+          printQualifiers = true;
     }
 
     // Layouts...
     // TODO: 4.4 enhanced layouts: Generalize to include offset/align: current spec
     //       requires separate user-supplied offset from actual computed offset, but
     //       current implementation only has one offset.
-    if (symbol.getQualifier().layoutMatrix    != unitSymbol.getQualifier().layoutMatrix ||
-        symbol.getQualifier().layoutPacking   != unitSymbol.getQualifier().layoutPacking ||
-        (symbol.getQualifier().hasLocation() && unitSymbol.getQualifier().hasLocation() && symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation) ||
-        symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent ||
-        symbol.getQualifier().layoutIndex     != unitSymbol.getQualifier().layoutIndex ||
-        (symbol.getQualifier().hasBinding() && unitSymbol.getQualifier().hasBinding() && symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding) ||
-        (symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset))) {
-        error(infoSink, "Layout qualification must match:");
+    bool layoutQualifierError = false;
+    if (symbol.getQualifier().layoutMatrix != unitSymbol.getQualifier().layoutMatrix) {
+        error(infoSink, "Layout matrix qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (symbol.getQualifier().layoutPacking != unitSymbol.getQualifier().layoutPacking) {
+        error(infoSink, "Layout packing qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (symbol.getQualifier().hasLocation() && unitSymbol.getQualifier().hasLocation() && symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation) {
+        error(infoSink, "Layout location qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent) {
+        error(infoSink, "Layout component qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (symbol.getQualifier().layoutIndex != unitSymbol.getQualifier().layoutIndex) {
+        error(infoSink, "Layout index qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (symbol.getQualifier().hasBinding() && unitSymbol.getQualifier().hasBinding() && symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding) {
+        error(infoSink, "Layout binding qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset)) {
+        error(infoSink, "Layout offset qualifier must match:", unitStage);
+        layoutQualifierError = true;
+    }
+    if (layoutQualifierError) {
         writeTypeComparison = true;
+        printQualifiers = true;
     }
 
     // Initializers have to match, if both are present, and if we don't already know the types don't match
-    if (! writeTypeComparison) {
+    if (! writeTypeComparison && ! errorReported) {
         if (! symbol.getConstArray().empty() && ! unitSymbol.getConstArray().empty()) {
             if (symbol.getConstArray() != unitSymbol.getConstArray()) {
-                error(infoSink, "Initializers must match:");
+                error(infoSink, "Initializers must match:", unitStage);
                 infoSink.info << "    " << symbol.getName() << "\n";
             }
         }
     }
 
     if (writeTypeComparison) {
-        infoSink.info << "    " << symbol.getName() << ": \"" << symbol.getType().getCompleteString() << "\" versus ";
-        if (symbol.getName() != unitSymbol.getName())
-            infoSink.info << unitSymbol.getName() << ": ";
-
-        infoSink.info << "\"" << unitSymbol.getType().getCompleteString() << "\"\n";
+        if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&
+            symbol.getType().getStruct() && unitSymbol.getType().getStruct()) {
+          if (printType) {
+            infoSink.info << "    " << StageName(getStage()) << " stage: \"" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision,
+                                                    printType, symbol.getName(), symbol.getType().getTypeName()) << "\"\n";
+            infoSink.info << "    " << StageName(unitStage) << " stage: \"" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision,
+                                                    printType, unitSymbol.getName(), unitSymbol.getType().getTypeName()) << "\"\n";
+          } else {
+            infoSink.info << "    " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << " Instance: " << symbol.getName()
+              << ": \"" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
+            infoSink.info << "    " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << " Instance: " << unitSymbol.getName()
+              << ": \"" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
+          }
+        } else {
+          if (printType) {
+            infoSink.info << "    " << StageName(getStage()) << " stage: \""
+              << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, symbol.getName()) << "\"\n";
+            infoSink.info << "    " << StageName(unitStage) << " stage: \""
+              << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, unitSymbol.getName()) << "\"\n";
+          } else {
+            infoSink.info << "    " << StageName(getStage()) << " stage: " << symbol.getName() << " \""
+              << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
+            infoSink.info << "    " << StageName(unitStage) << " stage: " << unitSymbol.getName() << " \""
+              << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
+          }
+        }
     }
 #endif
 }
@@ -1798,7 +1960,7 @@
         return size;
     }
 
-    int numComponents;
+    int numComponents {0};
     if (type.isScalar())
         numComponents = 1;
     else if (type.isVector())
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 6aa9399..581e9aa 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -290,6 +290,8 @@
         resources(TBuiltInResource{}),
         numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
         invertY(false),
+        dxPositionW(false),
+        enhancedMsgs(false),
         useStorageBuffer(false),
         invariantAll(false),
         nanMinMaxClamp(false),
@@ -307,7 +309,7 @@
         useVulkanMemoryModel(false),
         invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet),
         inputPrimitive(ElgNone), outputPrimitive(ElgNone),
-        pixelCenterInteger(false), originUpperLeft(false),
+        pixelCenterInteger(false), originUpperLeft(false),texCoordBuiltinRedeclared(false),
         vertexSpacing(EvsNone), vertexOrder(EvoNone), interlockOrdering(EioNone), pointMode(false), earlyFragmentTests(false),
         postDepthCoverage(false), depthLayout(EldNone),
         hlslFunctionality1(false),
@@ -397,6 +399,9 @@
         case EShTargetSpv_1_5:
             processes.addProcess("target-env spirv1.5");
             break;
+        case EShTargetSpv_1_6:
+            processes.addProcess("target-env spirv1.6");
+            break;
         default:
             processes.addProcess("target-env spirvUnknown");
             break;
@@ -415,6 +420,9 @@
         case EShTargetVulkan_1_2:
             processes.addProcess("target-env vulkan1.2");
             break;
+        case EShTargetVulkan_1_3:
+            processes.addProcess("target-env vulkan1.3");
+            break;
         default:
             processes.addProcess("target-env vulkanUnknown");
             break;
@@ -460,6 +468,20 @@
     }
     bool getInvertY() const { return invertY; }
 
+    void setDxPositionW(bool dxPosW)
+    {
+        dxPositionW = dxPosW;
+        if (dxPositionW)
+            processes.addProcess("dx-position-w");
+    }
+    bool getDxPositionW() const { return dxPositionW; }
+
+    void setEnhancedMsgs()
+    {
+        enhancedMsgs = true;
+    }
+    bool getEnhancedMsgs() const { return enhancedMsgs && source == EShSourceGlsl; }
+
 #ifdef ENABLE_HLSL
     void setSource(EShSource s) { source = s; }
     EShSource getSource() const { return source; }
@@ -812,6 +834,8 @@
     bool getOriginUpperLeft() const { return originUpperLeft; }
     void setPixelCenterInteger() { pixelCenterInteger = true; }
     bool getPixelCenterInteger() const { return pixelCenterInteger; }
+    void setTexCoordRedeclared() { texCoordBuiltinRedeclared = true; }
+    bool getTexCoordRedeclared() const { return texCoordBuiltinRedeclared; }
     void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
     unsigned int getBlendEquations() const { return blendEquations; }
     bool setXfbBufferStride(int buffer, unsigned stride)
@@ -1016,8 +1040,8 @@
 
 protected:
     TIntermSymbol* addSymbol(long long Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
-    void error(TInfoSink& infoSink, const char*);
-    void warn(TInfoSink& infoSink, const char*);
+    void error(TInfoSink& infoSink, const char*, EShLanguage unitStage = EShLangCount);
+    void warn(TInfoSink& infoSink, const char*, EShLanguage unitStage = EShLangCount);
     void mergeCallGraphs(TInfoSink&, TIntermediate&);
     void mergeModes(TInfoSink&, TIntermediate&);
     void mergeTrees(TInfoSink&, TIntermediate&);
@@ -1070,6 +1094,8 @@
     int numPushConstants;
     bool recursive;
     bool invertY;
+    bool dxPositionW;
+    bool enhancedMsgs;
     bool useStorageBuffer;
     bool invariantAll;
     bool nanMinMaxClamp;            // true if desiring min/max/clamp to favor non-NaN over NaN
@@ -1098,6 +1124,7 @@
     TLayoutGeometry outputPrimitive;
     bool pixelCenterInteger;
     bool originUpperLeft;
+    bool texCoordBuiltinRedeclared;
     TVertexSpacing vertexSpacing;
     TVertexOrder vertexOrder;
     TInterlockOrdering interlockOrdering;
@@ -1158,6 +1185,7 @@
                                             // for callableData/callableDataIn
     // set of names of statically read/written I/O that might need extra checking
     std::set<TString> ioAccessed;
+
     // source code of shader, useful as part of debug information
     std::string sourceFile;
     std::string sourceText;
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
index d2a4bf4..e44339d 100644
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -150,8 +150,8 @@
 
 typedef enum {
     EShClientNone,               // use when there is no client, e.g. for validation
-    EShClientVulkan,
-    EShClientOpenGL,
+    EShClientVulkan,             // as GLSL dialect, specifies KHR_vulkan_glsl extension
+    EShClientOpenGL,             // as GLSL dialect, specifies ARB_gl_spirv extension
     LAST_ELEMENT_MARKER(EShClientCount),
 } EShClient;
 
@@ -166,8 +166,9 @@
     EShTargetVulkan_1_0 = (1 << 22),                  // Vulkan 1.0
     EShTargetVulkan_1_1 = (1 << 22) | (1 << 12),      // Vulkan 1.1
     EShTargetVulkan_1_2 = (1 << 22) | (2 << 12),      // Vulkan 1.2
+    EShTargetVulkan_1_3 = (1 << 22) | (3 << 12),      // Vulkan 1.3
     EShTargetOpenGL_450 = 450,                        // OpenGL
-    LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 4),
+    LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 5),
 } EShTargetClientVersion;
 
 typedef EShTargetClientVersion EshTargetClientVersion;
@@ -179,7 +180,8 @@
     EShTargetSpv_1_3 = (1 << 16) | (3 << 8),          // SPIR-V 1.3
     EShTargetSpv_1_4 = (1 << 16) | (4 << 8),          // SPIR-V 1.4
     EShTargetSpv_1_5 = (1 << 16) | (5 << 8),          // SPIR-V 1.5
-    LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 6),
+    EShTargetSpv_1_6 = (1 << 16) | (6 << 8),          // SPIR-V 1.6
+    LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 7),
 } EShTargetLanguageVersion;
 
 struct TInputLanguage {
@@ -262,6 +264,7 @@
     EShMsgHlslLegalization  = (1 << 12), // enable HLSL Legalization messages
     EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
     EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
+    EShMsgEnhanced         = (1 << 15), // enhanced message readability
     LAST_ELEMENT_MARKER(EShMsgCount),
 };
 
@@ -468,6 +471,7 @@
     GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName);
     GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);
     GLSLANG_EXPORT void setUniqueId(unsigned long long id);
+    GLSLANG_EXPORT void setOverrideVersion(int version);
 
     // IO resolver binding data: see comments in ShaderLang.cpp
     GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);
@@ -485,6 +489,8 @@
     GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc);
     GLSLANG_EXPORT void setUniformLocationBase(int base);
     GLSLANG_EXPORT void setInvertY(bool invert);
+    GLSLANG_EXPORT void setDxPositionW(bool dxPosW);
+    GLSLANG_EXPORT void setEnhancedMsgs();
 #ifdef ENABLE_HLSL
     GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap);
     GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten);
@@ -512,6 +518,9 @@
     //                 use EShClientNone and version of 0, e.g. for validation mode.
     //                 Note 'version' does not describe the target environment,
     //                 just the version of the source dialect to compile under.
+    //                 For example, to choose the Vulkan dialect of GLSL defined by
+    //                 version 100 of the KHR_vulkan_glsl extension: lang = EShSourceGlsl,
+    //                 dialect = EShClientVulkan, and version = 100.
     //
     //                 See the definitions of TEnvironment, EShSource, EShLanguage,
     //                 and EShClient for choices and more detail.
@@ -703,6 +712,9 @@
     // a function in the source string can be renamed FROM this TO the name given in setEntryPoint.
     std::string sourceEntryPointName;
 
+    // overrides #version in shader source or default version if #version isn't present
+    int overrideVersion;
+
     TEnvironment environment;
 
     friend class TProgram;
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index f9680dd..1d97546 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -233,8 +233,10 @@
         "precise_struct_block.vert",
         "maxClipDistances.vert",
         "findFunction.frag",
+        "noMatchingFunction.frag",
         "constantUnaryConversion.comp",
         "xfbUnsizedArray.error.vert",
+        "xfbUnsizedArray.error.tese",
         "glsl.140.layoutOffset.error.vert",
         "glsl.430.layoutOffset.error.vert",
         "glsl.450.subgroup.frag",
@@ -284,9 +286,16 @@
         "textureoffset_sampler2darrayshadow.vert",
         "atomicAdd.comp",
         "GL_ARB_gpu_shader5.u2i.vert",
+        "textureQueryLOD.frag",
         "atomicCounterARBOps.vert",
         "GL_EXT_shader_integer_mix.vert",
         "GL_ARB_draw_instanced.vert",
+        "GL_ARB_fragment_coord_conventions.vert",
+        "BestMatchFunction.vert",
+        "EndStreamPrimitive.geom",
+        "floatBitsToInt.vert",
+        "coord_conventions.frag",
+        "gl_FragCoord.frag"
     })),
     FileNameAsCustomTestSuffix
 );
diff --git a/gtests/GlslMapIO.FromFile.cpp b/gtests/GlslMapIO.FromFile.cpp
index 574e905..aabb4ae 100644
--- a/gtests/GlslMapIO.FromFile.cpp
+++ b/gtests/GlslMapIO.FromFile.cpp
@@ -109,7 +109,52 @@
                 success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
             }
             else {
-                success &= false;
+                if (!in.getType()->isStruct()) {
+                    bool found = false;
+                    for (auto outIt : pipeOut) {
+                        if (outIt.second->getType()->isStruct()) {
+                            unsigned int baseLoc = outIt.second->getType()->getQualifier().hasLocation() ?
+                                outIt.second->getType()->getQualifier().layoutLocation :
+                                std::numeric_limits<unsigned int>::max();
+                            for (size_t j = 0; j < outIt.second->getType()->getStruct()->size(); j++) {
+                                baseLoc = (*outIt.second->getType()->getStruct())[j].type->getQualifier().hasLocation() ?
+                                    (*outIt.second->getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc;
+                                if (baseLoc != std::numeric_limits<unsigned int>::max()) {
+                                    if (baseLoc == in.getType()->getQualifier().layoutLocation) {
+                                        found = true;
+                                        break;
+                                    }
+                                    baseLoc += glslang::TIntermediate::computeTypeLocationSize(*(*outIt.second->getType()->getStruct())[j].type, EShLangVertex);
+                                }
+                            }
+                            if (found) {
+                                break;
+                            }
+                        }
+                    }
+                    success &= found;
+                }
+                else {
+                    unsigned int baseLoc = in.getType()->getQualifier().hasLocation() ? in.getType()->getQualifier().layoutLocation : -1;
+                    for (size_t j = 0; j < in.getType()->getStruct()->size(); j++) {
+                        baseLoc = (*in.getType()->getStruct())[j].type->getQualifier().hasLocation() ?
+                            (*in.getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc;
+                        if (baseLoc != std::numeric_limits<unsigned int>::max()) {
+                            bool isMemberFound = false;
+                            for (auto outIt : pipeOut) {
+                                if (baseLoc == outIt.second->getType()->getQualifier().layoutLocation) {
+                                    isMemberFound = true;
+                                    break;
+                                }
+                            }
+                            if (!isMemberFound) {
+                                success &= false;
+                                break;
+                            }
+                            baseLoc += glslang::TIntermediate::computeTypeLocationSize(*(*in.getType()->getStruct())[j].type, EShLangVertex);
+                        }
+                    }
+                }
             }
         }
     }
@@ -295,6 +340,10 @@
     ::testing::ValuesIn(std::vector<IoMapData>({
         {{"iomap.crossStage.vert", "iomap.crossStage.frag" }, Semantics::OpenGL},
         {{"iomap.crossStage.2.vert", "iomap.crossStage.2.geom", "iomap.crossStage.2.frag" }, Semantics::OpenGL},
+        {{"iomap.blockOutVariableIn.vert", "iomap.blockOutVariableIn.frag"}, Semantics::OpenGL},
+        {{"iomap.variableOutBlockIn.vert", "iomap.variableOutBlockIn.frag"}, Semantics::OpenGL},
+        {{"iomap.blockOutVariableIn.2.vert", "iomap.blockOutVariableIn.geom"}, Semantics::OpenGL},
+        {{"iomap.variableOutBlockIn.2.vert", "iomap.variableOutBlockIn.geom"}, Semantics::OpenGL},
         // vulkan semantics
         {{"iomap.crossStage.vk.vert", "iomap.crossStage.vk.geom", "iomap.crossStage.vk.frag" }, Semantics::Vulkan},
     }))
@@ -303,4 +352,4 @@
 
 }  // anonymous namespace
 }  // namespace glslangtest
-#endif 
\ No newline at end of file
+#endif 
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index 5e1cbda..519be25 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -59,6 +59,7 @@
 
 using HlslCompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
+using HlslSpv1_6CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslDebugTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
@@ -81,6 +82,13 @@
                             Target::BothASTAndSpv, true, GetParam().entryPoint);
 }
 
+TEST_P(HlslSpv1_6CompileTest, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
+                            Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_6,
+                            Target::BothASTAndSpv, true, GetParam().entryPoint);
+}
+
 TEST_P(HlslCompileAndFlattenTest, FromFile)
 {
     loadFileCompileFlattenUniformsAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
@@ -385,6 +393,7 @@
         {"hlsl.structbuffer.fn2.comp", "main"},
         {"hlsl.structbuffer.rw.frag", "main"},
         {"hlsl.structbuffer.rwbyte.frag", "main"},
+        {"hlsl.structbuffer.rwbyte2.comp", "main"},
         {"hlsl.structin.vert", "main"},
         {"hlsl.structIoFourWay.frag", "main"},
         {"hlsl.structStructName.frag", "main"},
@@ -451,6 +460,16 @@
 
 // clang-format off
 INSTANTIATE_TEST_SUITE_P(
+    ToSpirv, HlslSpv1_6CompileTest,
+    ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
+       {"hlsl.spv.1.6.discard.frag", "PixelShaderFunction"}
+    }),
+    FileNameAsCustomTestSuffix
+);
+// clang-format on
+
+// clang-format off
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslCompileAndFlattenTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.array.flatten.frag", "main"},
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index ef11764..db4ac26 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -69,6 +69,7 @@
 using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
 using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
 using CompileToSpirv14Test = GlslangTest<::testing::TestWithParam<std::string>>;
+using CompileToSpirv16Test = GlslangTest<::testing::TestWithParam<std::string>>;
 using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
 using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
 using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
@@ -122,6 +123,13 @@
                             Target::Spv);
 }
 
+TEST_P(CompileToSpirv16Test, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_6,
+                            Target::Spv);
+}
+
 // Compiling GLSL to SPIR-V under OpenGL semantics. Expected to successfully
 // generate SPIR-V.
 TEST_P(CompileOpenGLToSpirvTest, FromFile)
@@ -365,7 +373,6 @@
         "spv.int64.frag",
         "spv.intcoopmat.comp",
         "spv.intOps.vert",
-        "spv.intrinsicsSpecConst.vert",
         "spv.intrinsicsSpirvByReference.vert",
         "spv.intrinsicsSpirvDecorate.frag",
         "spv.intrinsicsSpirvExecutionMode.frag",
@@ -373,6 +380,7 @@
         "spv.intrinsicsSpirvLiteral.vert",
         "spv.intrinsicsSpirvStorageClass.rchit",
         "spv.intrinsicsSpirvType.rgen",
+        "spv.intrinsicsSpirvTypeLocalVar.vert",
         "spv.invariantAll.vert",
         "spv.layer.tese",
         "spv.layoutNested.vert",
@@ -520,6 +528,7 @@
         "spv.vulkan110.int16.frag",
         "spv.int32.frag",
         "spv.explicittypes.frag",
+        "spv.float16NoRelaxed.vert",
         "spv.float32.frag",
         "spv.float64.frag",
         "spv.memoryScopeSemantics.comp",
@@ -623,6 +632,18 @@
 
 // clang-format off
 INSTANTIATE_TEST_SUITE_P(
+    Glsl, CompileToSpirv16Test,
+    ::testing::ValuesIn(std::vector<std::string>({
+        "spv.1.6.conditionalDiscard.frag",
+        "spv.1.6.helperInvocation.frag",
+        "spv.1.6.specConstant.comp",
+    })),
+    FileNameAsCustomTestSuffix
+);
+
+
+// clang-format off
+INSTANTIATE_TEST_SUITE_P(
     Hlsl, HlslIoMap,
     ::testing::ValuesIn(std::vector<IoMapData>{
         { "spv.register.autoassign.frag", "main_ep", 5, 10, 0, 20, 30, true, false },
diff --git a/gtests/VkRelaxed.FromFile.cpp b/gtests/VkRelaxed.FromFile.cpp
index 777134d..96cd3cf 100644
--- a/gtests/VkRelaxed.FromFile.cpp
+++ b/gtests/VkRelaxed.FromFile.cpp
@@ -107,8 +107,8 @@
                 auto inQualifier = in.getType()->getQualifier();
                 auto outQualifier = out->second->getType()->getQualifier();
                 success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
-            }
-            else {
+            // These are not part of a matched interface. Other cases still need to be added.
+            } else if (name != "gl_FrontFacing" && name != "gl_FragCoord") {
                 success &= false;
             }
         }
@@ -293,6 +293,7 @@
     ::testing::ValuesIn(std::vector<vkRelaxedData>({
         {{"vk.relaxed.frag"}},
         {{"vk.relaxed.link1.frag", "vk.relaxed.link2.frag"}},
+        {{"vk.relaxed.stagelink.0.0.vert", "vk.relaxed.stagelink.0.1.vert", "vk.relaxed.stagelink.0.2.vert", "vk.relaxed.stagelink.0.0.frag", "vk.relaxed.stagelink.0.1.frag", "vk.relaxed.stagelink.0.2.frag"}},
         {{"vk.relaxed.stagelink.vert", "vk.relaxed.stagelink.frag"}},
         {{"vk.relaxed.errorcheck.vert", "vk.relaxed.errorcheck.frag"}},
         {{"vk.relaxed.changeSet.vert", "vk.relaxed.changeSet.frag" }, { {"0"}, {"1"} } },
diff --git a/known_good.json b/known_good.json
index bed5dd8..f87405e 100644
--- a/known_good.json
+++ b/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "339d4475c1a806c187c57678af26733575d1cecd"
+      "commit" : "b3c1790632737f6be2c0e1c2ea5bd844da9f17a9"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "29817199b7069bac971e5365d180295d4b077ebe"
+      "commit" : "4995a2f2723c401eb0ea3e10c81298906bf1422b"
     }
   ]
 }
diff --git a/license-checker.cfg b/license-checker.cfg
index 409f18e..51ce276 100644
--- a/license-checker.cfg
+++ b/license-checker.cfg
@@ -15,6 +15,8 @@
 

                     "_config.yml",

                     ".*",

+                    ".github/workflows/*.yml",

+                    ".github/workflows/*.js",

                     "CMakeSettings.json",

                     "known_good_khr.json",

                     "known_good.json",

diff --git a/update_glslang_sources.py b/update_glslang_sources.py
index 65be2f6..20f303b 100755
--- a/update_glslang_sources.py
+++ b/update_glslang_sources.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright 2017 The Glslang Authors. All rights reserved.
 #