Merge remote-tracking branch 'aosp/upstream-master' into update-shaderc

Includes:
91ac4290 Merge pull request #1510 from Kangz/complete_lib
873734dd BUILD.gn: make the static_lib complete to fix the build on OSX
5ff3c3da Interfaces: Remove NV_EXTENSIONS from two more headers.
01c4076a Merge pull request #1508 from jeffbolznv/remove_ifdefs_shaderlang
27f5db05 Remove NV_EXTENSION ifdefs from ShaderLang.h
1f60c72c Interface: remove NV_EXTENSIONS from the resources header.
a4752945 Merge pull request #1506 from alelenv/master
18268c85 Merge pull request #1505 from dj2/gn_build
aac6d637 Use unsigned int instead of uint32_t
a535bc13 Fix missing case label for miss stage.
b29c58ea Review feedback
257b25c8 Add BUILD.gn configuration.
a8453d4b SPIRV-Tools: Move to more recent (higher quality) version.
088da332 Bump revision.
dc591081 Merge pull request #1500 from KhronosGroup/turing-known-good
aedccf96 Update known-good to tools/headers for the Nvidia Turing extensions.
8751c13c Bump minor version.
5942c015 Merge pull request #1499 from chaoc/nvidia_turing
fb13a3ab update glslang test results for temporary validation fail
5b2203db Add-support-for-SPV_NV_shading_rate
b50c02ef Add-support-for-SPV_NVX_raytracing
3c366990 Add-support-for-SPV_NV_mesh_shader
3a137966 0003-Add-support-for-SPV_NV_shader_image_footprint
beae2251 Add-support-for-SPV_NV_compute_shader_derivatives
9eada4b9 Add-support-for-SPV_NV_fragment_shader_barycentric
6dd4757f Update to latest spirv.hpp header (which fixed a typo).
7105cb30 SPV: Move to latest SPIR-V header (latest NV extensions support).
d122a728 Build: Fix some warnings.
b4a598ba Bump revision.
92fab623 Merge pull request #1492 from NorbertGarnysAMD/shader_atomic_int64
dad0c1be Add GL_EXT_shader_atomic_int64
f658c303 Merge pull request #1491 from DennisOSRM/patch-1
fc89f065 Fix compiler warning emitted from GCC8
6def4375 Bump revision.
afe0c66f SPV: Fix #1487: Only declare AMD int16/half_float extensions when needed.
546b7885 Printing preprocessed shaders (not a supported path): Fix #1490: strings
1ca0f8e8 Bump version and revision.
ddfb4a80 Merge branch 'jeffbolznv-memory_scope_semantics'
36831c9b GL_KHR_memory_scope_semantics
97068d8b Merge pull request #1465 from otakuto/remove-execute-permissions
1d12970a Merge pull request #1485 from karl-lunarg/karl-lunarg-patch-1
12b99ef1 Merge pull request #1486 from mrtrizer/patch-1
949344f0 Update SpvTools.cpp
ac2e1b63 bump revision
4e11b615 SPV: Turn off the default validation done by the SPIRV-Tools optimizer.
a4dfede4 Merge pull request #1482 from KhronosGroup/validate
d5aabf34 GLSL: Remove use of __ in the implementation of keywords having __.
381dd3c0 GLSL: Remove use of __ in the implementation of keywords having __.
0cb8ad55 tooling: Fix update sources script for Python 3
c340425b SPV: Add option for controling when the SPIRV-Tools validator is used.
717c80a9 SPV: Isolate SPIRV-tools glue to its own file.
cc14f2d3 SPV: Add SPIRV-Tools validator. This needs the latest SPIR-Tools.
e7df8e0b Non-functional: Rationalize some existing use of SPIRV-Tools.
1323bf8e Merge pull request #1480 from dneto0/stringify
9fd2a8cd Use our own SPIRV-Tools message stringifier
93dbbdee Merge pull request #1474 from KhronosGroup/pure-8-16-bit-capability
09d7672d Merge pull request #1476 from greg-lunarg/kg24
1676e73d Update SPIRV-Tools known good.
31aa3d60 SPV: only declare the pure 8/16-bit capabilities when needed.
149afc39 SPV: More corrections of <id> versus "immediate" operands.
228e964b SPV: Correct SPIR-V operands for <id> versus immediate.
72f8c690 Bump version patch level.
251901ac Fix #1471: Merge shift amounts for different sets: --stb ... --std ...
ade8bbbf Fix #1393: rationalize usage, in the spirit of #1393.
ec5c1193 Bump revision.
640bd096 Fix #1468: Add command-line --entry-point support, same as existing -e.
56a75975 Fix #1469: Make it easier to copy/paste build instructions.
c4510e5e Merge pull request #1466 from Kangz/warning_fixes
242c28f2 Merge pull request #1470 from antiagainst/patch-2
fb4165b5 Appveyor CI: build artifacts for x64
e7061422 Fix -Wignored-qualifier and -Wunused-variable warnings
dae0b0a5 Add shebang
d03da06a Remove execute permissions
e0bc65b2 Merge pull request #1460 from KhronosGroup/postprocess
f04c51b3 Non-Functional: Add postprocess as more robust way to add capabilities
29619b23 Merge pull request #1459 from dgkoch/dgkoch_build_fixes4
883607d5 Fix build warnings/errors:
e99a2681 Merge pull request #1457 from KhronosGroup/parse-floats
7cdc24c0 PP: Address #1456: Strip float suffixes before using platform library.
994d4bf3 Tests: Add more string -> float tests. Related to #1456.
561a43d2 PP: floating-point parsing: more stable handling of istringstream::fail
13803b18 Bump revision.
6e382f63 Merge pull request #1455 from TiemoJung/nullpointer_crash_fix
e161cc11 GLSL: No more restrictions on (non)shadow sampler construction.
9f8cb850 Fixes a crash when in/out varying variable had no semantic name and an error was reported in ioremapper phase when the variable was rejected
62faea79 Merge pull request #1451 from KhronosGroup/shadow-forces-depth
11da9eed HLSL: Fix #1445: distance() works on scalars.
56b33196 Merge pull request #1453 from greg-lunarg/kg22
7d4c9a07 GLSL: Construct shadow texture from non-shadow sampler.
0339af3c GLSL/SPV: If a texture is used with a shadow sampler, force 'shadow'.
3f05bedd Update spirv-tools known good
fa4952c3 Merge branch 'zeux-master'
5a7321eb Merge branch 'master' of https://github.com/zeux/glslang into zeux-master
81793ad2 Merge pull request #1450 from KhronosGroup/link-merge-all
b617e14a Link: Merge all the settings in TIntermediate.
5d6b5679 Merge pull request #1436 from karl-lunarg/karl-ccache
8103cb95 Merge pull request #1446 from KhronosGroup/spv-link
ebd989dd Merge pull request #1437 from mattparks/patch-2
34e56891 Merge branch 'jeffbolznv-missing_descriptor_indexing_extension'
4137241a Merge branch 'missing_descriptor_indexing_extension' of https://github.com/jeffbolznv/glslang into jeffbolznv-missing_descriptor_indexing_extension
41436ad2 Link/SPV: Correct symbol IDs on merging ASTs to a single coherent space
806af25f Merge pull request #1442 from dneto0/use-forked-android-ndk-repo
c140b968 Add missing OpExtension SPV_EXT_descriptor_indexing for dynamic indexing capabilities
e7f9caea Errors and Build: Fix build warnings, which also improved error messages.
4aeca2df NDK build: Use NDK r17b and its own CMake toolchain file
b75c7065 Travis CI: Fix comments disabling code.
e5b27660 Merge pull request #1440 from dneto0/later-android
3541d8a5 Travis-CI: Use Android NDK r13b specifically
8dafeab4 Merge pull request #1438 from Think-Silicon/getUniformStages
0ea33a26 Non-functional: Retrigger bots; the previous failure looks suspicious.
cf6bd066 HLSL: Fix #1432: Globally initialize local static variables.
f556e5da Reflection exposes the Shader Stages where a Uniform is present
f9c2aeb7 Allowed debug postfix to be changed.
857f25cf Added the cmake option to disable building SPVRemapper.
64315a8a Merge pull request #1434 from antiagainst/fix-spirv-tools-header
23770b9a build: Add ccache option to CMake config
112e2858 SPIRV: Simplify matrix->matrix constructor
a2c39a29 Use public SPIRV-Tools header
cd57b4ba Merge pull request #1431 from KhronosGroup/implement-8-16-bit-storage
312dcfb0 Implement GL_EXT_shader_16bit_storage and GL_EXT_shader_8bit_storage extensions.
eefab240 Bump revision.
dccfeedf HLSL: Fix #1423: implement CalculateLevelOfDetailUnclamped().
ab8960fd Merge pull request #1416 from aejsmith/samplerless-texture-functions
513cc4cf Merge branch 'HaydnTrigg-patch-1'
c88edb13 Merge branch 'patch-1' of https://github.com/HaydnTrigg/glslang into HaydnTrigg-patch-1
5e701954 Merge pull request #1420 from KhronosGroup/spir-dis
e2156222 SPV: Add option to print disassembly in standard form using SPIRV-Tools.
6d61684f Bump revision.
802c62bc PP: Rationalize return values of MacroExpand.
9cc81de0 PP/HLSL: Fix #1424: support comma in nested curly braces for macro arg
e47bfaed Add support for GL_EXT_samplerless_texture_functions
e826286f Constant.cpp Floating point divide by zero
0b964b3c Merge pull request #1419 from tgjones/spirv-remap-artifact
9177e05f Include spirv-remap.exe in AppVeyor artifacts
ef1f899b Merge pull request #1413 from karl-lunarg/fix-update
fa403b96 script: Improve update sources script
16cf5a5d Merge pull request #1411 from KhronosGroup/fix-literal-warnings
866f6714 Build: Make literal casting have fewer warnings and be more consistent.
5fe506a8 Merge pull request #1409 from greg-lunarg/remap3
c6831d1e Add support for OpConstantNull and OpConstantSampler to spirv-remap
c99304c5 Bump revision.
2a805d9c Revert "GLSL: Fix #1279: refract does not have a double-type eta."
bea08fe0 Merge pull request #1405 from Igalia/nroberts/amb-arrays
1d024b53 Take into account arrays of opaque types when reserving bindings
2c8265bb GLSL: Fix #1358: Support "struct name", where name could be a user type
1ea8f595 Merge pull request #1402 from greg-lunarg/kg21
ff50b9fb Update spirv-tools known-good
7dc1a989 Merge pull request #1401 from dneto0/bad-e11
617d1b12 Relax a stringToDouble test for, OSX AppleClang 9.1
ba018e67 SPV: Fix #1399 emit ImageGatherExtended when using ConstOffsets operand
ad7645f4 Fix #1360: uint->int width conversions must still be typed as uint.
14b85d3f Fix #1395: GLSL volatile maps to SPIR-V Volatile and Coherent.
d6c97557 Change the major revision number for next commit.
a7eb582a Bump revision.
9c3fde7f Merge pull request #1397 from LoopDawg/warning-fix-4
470a68cf Fix several signed/unsigned comparison compile warnings.
32d3ec31 Merge pull request #1394 from greg-lunarg/kg20
b0c42b28 Update spirv-tools known-good.
4f888534 Fix #1391: Remove use of nonportable strnlen().
b91189db Merge pull request #876 from ligfx/cmaketargetincludedirectories
a895f378 CMake: use target_include_directories to expose includes
92d05c0c Merge pull request #1386 from zeux/master
369dc87a Merge pull request #1387 from jeffbolznv/disassembly_explicit_types
fa34a9ad Merge pull request #1385 from KhronosGroup/fix-strtod
3e8e9f7b PP: Implement locale-independent strtod, using istringstream and a fast path.
af7a9487 Add bit width of types to disassembleInstruction
6c52f896 PP: Remove second parsing of numbers recorded in macros; save/use original.
1ea1b13f Testing: Add new tests, and new ways of testing, for floating-point.
8e4b496d Merge pull request #1388 from greg-lunarg/kg19
d2b55801 Update spirv-tools known-good
b239d22f Fix TextureUpgradeAndSamplerRemovalTransform when used with qualifiers
c6d25539 Merge pull request #1384 from LoopDawg/self-cast
c5991671 HLSL: allow self-type cast (as no-op passthrough)
2aaef122 Bump revision.
ebec9094 GLSL: Fix #1279: refract does not have a double-type eta.
a0044f4f Merge pull request #1381 from LoopDawg/coverage_array
98e1d7f6 Merge pull request #1383 from amdrexu/bugfix
b4a2a6cf Fix issue #1376: SPV_AMD_gpu_shader_half_float is not emitted under vulkan1.1
4e6d3eaf HLSL: require coverage mask to be arrayed output.
cfb05ec7 Merge pull request #1379 from LoopDawg/groupid-fix
91a8178e HLSL: various SPIR-V compute shader IDs must be a 3-vector of integers.
90de7a74 Merge pull request #1378 from LoopDawg/append-decl-order
1326b8c7 HLSL: Allow stream output Append() method after entry point.
1831087e SPV: Fix #1374: For an SSBO 16-bit access, only emit StorageUniformBufferBlock16 capability.
2fb966aa Merge pull request #1375 from Igalia/nroberts/aml-arrayio
ecbd056b Tests: Fix #1372: Don't legalize runtests HLSL tests.
22b71f9a Skip outermost array when assigning locations to auto-array interfaces
fd9d9ef4 Bump version.
d2e9829a Merge pull request #1370 from KhronosGroup/fix-param-types
115c3b14 Merge pull request #1369 from greg-lunarg/kg18
d3ed90be Fix #944: Convert argument type to match formal parameter type.
517eabb4 Update spirv-opt known-good
25bef930 Merge pull request #1363 from mattparks/patch4
115cf8ea Merge pull request #1368 from danginsburg/issue_1367
fb6924d2 Fix issue #1367 - change the I/O remapper to ignore push constants so it does not apply a binding/descriptor set to them.
9cf275bb Build: Add missing break statements. Fixes #1052.
1199cf92 Fixed install for SPIRV, glslang, and hlsl when building shared libs
e375dad6 Merge pull request #1364 from greg-lunarg/kg17
6b5d52a6 Update known-good.
46e07313 GLSL/Vulkan: Warn about arrays of arrays of resources that need bindings.
b4cb70fc GLSL: Fix #1359: don't allow unsized arrays as initializers.
d8462c6f validate script: fix path
c325f436 GLSL: Fix #1300: Can redeclare without size a sized built-in block array.
3beac945 Infrastructure: If using .hlsl suffix, default is -D.
4c574708 Bump revision.
2ead40ff Tests: Add usage and tests for previous commit.
fccbb8b4 Merge branch 'nicebyte-glsl-ext'
62f84fd5 Merge branch 'glsl-ext' of https://github.com/nicebyte/glslang into nicebyte-glsl-ext
3bb4c48c Bump revision.
16b80f78 Merge pull request #1345 from amdrexu/bugfix
7c88aff1 Specify SPV_AMD_gpu_shader_int16 extension string when frexp() takes 16-bit exp operand
6cf7645c Bump revision.
c034c5a8 HLSL/SPV: Declare DepthReplacing for shaders declaring SV_Depth* outputs.
24eae066 Merge pull request #1348 from greg-lunarg/kg16
d91e0360 Merge pull request #1351 from danginsburg/issue_1350
5a69b675 Update gold results
33ddaaaf Make FindLanguage use the entire name if parseStageName is false
ef203bfa Fix build error
3350741e Make glslang validator support files ending in .glsl
95c87b65 Fix issue #1350 - set the node type to match the atomic TIntermAggregate node type so that AtomicSMin/Max is not generated with a result type of void.
0f8d43e5 GLSL/Vulkan: Enforce no location aliasing in vertex inputs.
c51bff8d Update spirv-opt known good
5d3babdb Build: Fix #1347: Compile with NV_EXTENSIONS disabled.
b9e9e57f Merge pull request #1326 from mattparks/patch1
461ea099 Non-functional: Fix tabs.
e891afac GLSL: Fix #1330: default outputs for GL_NV_geometry_shader_passthrough
9de57c81 Bump revision.
5cd155f0 Merge pull request #1343 from KhronosGroup/uint-counter-bufs
c3a370db Merge pull request #1341 from St0fF-NPL-ToM/master
6ae18707 HLSL: Fix #1332: consistently use uint for counter buf typing.
1aaa3567 Revert "add ability to record accessed and declared "named defines""
619dc896 Merge pull request #1338 from cgmb/minor-shaderlang-fixups
1dcd1623 GLSL/SPV: no location on atomic_uint; Fix #1339.
39bbad5a Minor cleanup in ShaderLang.cpp
a1184ddd fix further MSVC 2012 build issues
e7350423 add ability to record accessed and declared "named defines"
77d04598 fix VS2012 compile issues
b92ce60f GLSL/SPV: Fix #1310: don't create unnecessary integer matrices.
88a6a181 README: Expand on the C++11 compiler requirement for MSVS.
11b5c311 Update revision.
5d8d7882 Fix #1328: ENABLE_HLSL=OFF breaking build.
f52b6381 Fix #1331: Emit SPV_GOOGLE_hlsl_functionality1 for counters.
7f0bcfd8 Fix #1333: Protect against -g for non-generating code.
a89f8cf7 Merge branch 'nonuniform-dynindex'
4597fea8 Update revision.
6a8a678c Revision/Version update.
5611c6d2 GLSL/SPV: Implement SPV_EXT_descriptor_indexing and GL_EXT_nonuniform_qualifier
0b5e5da7 Update revision.
6a4a427e GLSL: Implement correct semantic checking for run-time sized arrays.
5a867aca Linker: Fix #1329: correctly merge unsized arrays, and fix link tests.
ed834895 Merge pull request #1327 from mattparks/patch2
21993569 Added getter for uniform block bindings
6c5f649a Allowed for LIB_TYPE to be set to switch between static and shared libs for glslang, SPIRV, and HLSL
fbdba369 Merge pull request #1325 from KhronosGroup/simplify-doc
10971553 Non-Functional: Remove unused parts of the disassembler.
d688796a Merge pull request #1322 from jeffbolznv/master
2abe9a4d Implement GL_NV_shader_subgroup_partitioned
6b1ede41 Merge pull request #1320 from greg-lunarg/addopt21
fb03a55e Only print legalization warning if optimizer disabled
7be36647 Merge pull request #1319 from KhronosGroup/array-rationalization
f9a05f96 Merge pull request #1316 from greg-lunarg/addopt18
c408b430 Merge pull request #1318 from amdrexu/feature
ead86224 Non-functional. Rationalizations enabling future generalizations:
2316924b Non-Functional: Remove merge-replicated code and fix white space.
ae06d1fe Add int16 support to AMD_trinary_minmax and AMD_shader_ballot
4bede9eb Disable DCE by Remapper through glslangValidator...
643e57cd Merge pull request #1313 from greg-lunarg/kg15
26ad99b5 Merge pull request #1312 from KhronosGroup/fix-mixed-array-styles
0b46c1ed Merge branch 'master' into kg15
eecb874c Update SPIRV-Tools known good.
859b0342 Types: Fix #1290: Rationalize and correct "mixed" style array dimensioning.
1c3ab274 Test Results Only: Include size in implicitly sized arrays (change to unsized).
7cec64fc Non functional: add EshTargetClientVersion alias for EShTargetClientVersion.
97e35420 Non-functional: always return value from makeFpConstant().
569dd84a Merge pull request #1306 from Igalia/uniform-aml-v2
1b1ad97d Merge pull request #1305 from amdrexu/bugfix
2d539049 Take into account the number of locations taken up by a uniform
1fe4a447 Add locations to opaque types for OpenGL
b126550b Add additional error check for fragment shader outputs
95b1334a Bump patch version.
ca4366cf Merge pull request #1302 from KhronosGroup/cpp-relax-skiptokens-errors
e7e081bd PP: don't give errors on some tokens under #if 0 (or similar).
56e80565 Merge pull request #1282 from KhronosGroup/hlslFunctionality1
5d610ee1 Implement SPV_GOOGLE_hlsl_functionality1.
cd23a475 Merge pull request #1291 from ben-clayton/add-nv-nopersp
0af69da1 Bump patch version.
fb1e40b4 Merge pull request #1299 from KhronosGroup/fix-conversions
f6480833 Add tests for GL_NV_shader_noperspective_interpolation
cb32c544 Merge pull request #1289 from Igalia/igalia/dmat-scalar-division
647fccaf AST: Fix shift conversions, which don't require matching types.
6e899be5 Non-functional: Rationalize operators handled by the split addConversion() functions.
137a24df AST: Remove convertToBasicType() which was obfuscating the conversion design.
075c8c11 Merge pull request #1294 from dgkoch/dgkoch_build_fixes4
bfe09521 Fix build several build errors
3e2a3c46 Merge pull request #1293 from baldurk/remove-en-dash
34cd7630 Replace en-dash with simple ASCII hyphen
017a567b Add support for GL_NV_shader_noperspective_interpolation
eddb1318 Use the correct type for the constant for matrix/scalar division
2ad4737d Merge pull request #1286 from greg-lunarg/kg14
b095da74 Merge pull request #1288 from amdrexu/bugfix
2bd8cd04 Merge pull request #1287 from eintw1ck/master
a00e51b5 HLSL: Correct some mistakes for min16 types
b3e80f5a include/Common.h: reorder includes to avoid redefinition on some platforms
bfa64afb Increment minor version to 4
c96885f4 Update known_good to SPIR-V 1.3 support
845860d5 Merge pull request #1283 from siavashserver/fix-memory-leak
ca279340 Merge pull request #1284 from amdrexu/bugfix
7798aaf1 Allow --hlsl-enable-16bit-types to be used without AMD_EXTENSIONS
b502a802 Fix memory leak upon ProcessDeferred failure.
a5152505 Merge pull request #1269 from bkaradzic/master
9c82dd10 Merge branch 'amdrexu-feature'
fb97d25c Merge branch 'feature' of https://github.com/amdrexu/glslang into amdrexu-feature
45422f18 Merge branch 'amdrexu-bugfix'
f15fbc04 Merge branch 'bugfix' of https://github.com/amdrexu/glslang into amdrexu-bugfix
56364b08 Merge branch 'sheredom-fixup_sm_60_wording'
e62d1baf Merge branch 'fixup_sm_60_wording' of https://github.com/sheredom/glslang into sheredom-fixup_sm_60_wording
ac370792 Revert the commits that change OpArrayLength type and bumped the version number.
fd920b3b WaveReadLaneFirst is the correct wording (was using WaveReadFirstLane previously...).
097047a9 Merge pull request #1277 from KhronosGroup/Vulkan_1_1
e68a7698 Add more error checks for swizzleInvocations{Masked}AMD()
cb61eec9 HLSL: Map min types to GLSL 16-bit types
1e5c9463 Fixed ifdef.
66011cb2 SPV: Implement Vulkan 1.1 features and extensions.
b2ae1d05 Revert "Merge pull request #1274 from greg-lunarg/legal2"
663b90d9 Build: Fix build issues with previous commit.
2c65069e Merge pull request #1274 from greg-lunarg/legal2
fa9b465b Versioning: Bump to minor version 1, for new SPIRV-Tools update.
fd50f6a4 Legalization: Omit legalization warning when spirv-opt is linked.
caa54449 Merge pull request #1263 from greg-lunarg/kg12
02538357 Merge pull request #1272 from amdrexu/bugfix
4f5b99e3 Add more error checks for interpolateAtVertexAMD()
c6c80a6e Versioning: Address #1255: Move to semantic versioning.
1de8e54d Fixed GCC+Clang errors and warnings on Linux and OSX.
41e24fdb Merge branch 'amdrexu-bugfix'
aa2295f1 Merge branch 'bugfix' of https://github.com/amdrexu/glslang into amdrexu-bugfix
0216f24f SPV: Bump up the generator number.
e518772d SPV: The result type of OpArrayLength should be UINT
b5b5f918 Non-functional: Make the vulkan version number meaning be only 0 or not 0.
e58d58b7 Non-functional: Move to latest headers.
29c49e10 Merge pull request #1266 from amdrexu/feature
2c40e856 Merge pull request #1268 from amdrexu/bugfix2
81f4c03a Fix issues of SPIRV headers
1e5d7b0b Implement the extension GL_AMD_gpu_shader_half_float_fetch
5630d0ec Fix typo.
60a57840 Merge pull request #1264 from dneto0/typo-client-version
52e9435e Merge pull request #1265 from davidhubbard/master
f5ddcfc5 TBuiltIns::identifyBuiltIns: EShLangFragment fallthrough
506d2c24 Fix typo in help for -V<bad-number>
c5215791 IO mapper: Fix #1261: Supply location mapper with size computer.
5778ee4a Update spirv-tools known_good
d55fe865 HLSL: Fix #1257: layout float1, int1, etc., as scalars.
46413d57 SPV: Fix #1258: cache constant structs by id, not opcode.
57f6a016 SPV: Complete OpModuleProcessed implementation, enabled by have 1.2 headers.
e1cc1e2e Merge pull request #1256 from KhronosGroup/require-binding
9c9c4e90 GLSL/SPV: Fix #1196: Require resources to have layout(binding=X).
2d9973de Tests: specExamples.vert is used twice, it needs two different output names.
90ac5fcf Merge pull request #1253 from KhronosGroup/hlsl-ternary-select
4bee531f HLSL: Fix #1249: Always execute both sides of ternary "?:".
a5cae082 Merge pull request #1250 from LoopDawg/image-fetch-conversion
4425f245 HLSL: Add conversions for image ops during SPV construction
b587fb62 GLSL: Fix #1247. Remove extraneous *= matrix test.
98e3fb19 Merge pull request #1246 from amdrexu/bugfix
35a3de74 Fix an issue of interpolateAtVertexAMD().
23ea3db3 Warning for #pragma once. GLSL and HLSL. Addresses #824.
b5bf536b Merge pull request #1244 from dneto0/update-spirv-tools
3394353b Merge pull request #1243 from greg-lunarg/kg11
497d5ffe Update SPIRV-Tools known-good
484cbd04 Upgrade update_glslang_sources.py to work with gitlab branch
4ee5193b Non-functional: GLSL: Fix #1242; don't pass reference to nullptr.
2f658e1f Merge pull request #1241 from greg-lunarg/kg9
8a4848f5 Add DeadInsertElim to legalization and RedundancyElim to -Os.
b5ab3459 Merge pull request #1239 from KhronosGroup/deeper-access-chains
9ffc72d1 Merge pull request #1238 from zeux/pp-string-buffer
71b5da60 SPV: Bump up generator number, because previous commit changes code gen slightly.
5c3eed54 SPV: Create more access chains addressing a few swizzling issues.
75cffdf9 Preprocessor: Use std::string instead of std::stringstream
2651ccae Merge pull request #1234 from dneto0/update-spirv
d1232992 Update SPIRV-Tools known-good
b3f9e0a3 GLSL: Fix #1229: merge array sizes in parameter declarations.
98e733cb Merge pull request #1232 from KhronosGroup/control-flow-attributes
da0b18c3 Error message: Improve error message (will help another party id a bug).
30476568 AST: dump attributes along with control flow.
a2858d9b GLSL: Implement GL_EXT_control_flow_attributes.
e18fd20d HLSL: Refactor attribute implementation.
e349af7e Non-functional: Fix #1231: remove duplicated code.
2b5ea9f8 SPV Version: Emit the requested SPIR-V version, not the header version.
43f5b273 Non-Functional: Use OpModuleProcessed from the unified header.
22f02d09 EShTargetSpv: Fix #1235, spelling, in a backward compatible way.
6c1c2766 SPV: Bump SPIR-V header to the unified1 version (version 1.2).
82ead04c Non-functional. Fix #1223: expand comments.
ade21c71 Merge pull request #1224 from fjhenigman/unused
ab46a2e5 Merge pull request #1221 from dneto0/update-spirv
541f7bbd Fix unused function warning.
0e58bbd5 Update known-good spirv-tools.
e22e3473 HLSL: Fix #1208: accept both int and uint in asuint() and asint().
63400477 HLSL: Protect against 'continue' outside of loops.
9b5668c8 HLSL: Fix #1214: check for nesting in loop/switch of break statements.
7420a761 HLSL: Fix #1215: propagate error on seeing a type name instead of a variable.
eb2c0c72 GLSL: XFB: more support for built-in block redeclarations with XFB.
9c6f8cc2 Scanner: Many int16 and float16 fixes, including performance.
c043aadd Scanner: Many int64 fixes, including performance.
adc33b23 Non-functional: Fix HLSL error message, and code formatting.
99892d5a Merge pull request #1211 from greg-lunarg/kg7
ead4bb19 Update known good spirv-tools. Fixes issue #1205.
798d005c Build: Tickle bots to try again... seems like a process hang; all tests passed.
132cf537 HLSL: Fix #1203: Declare anonymous members for cbuffer with no ';'
fd1e8a78 HLSL: Fix 1201: Accept 'layout' as an identifier.
046bae0b HLSL: Attributes: Add [[vk::constant_id()]] and [[vk::push_constant]]
e08ed0cc Merge pull request #1190 from jfmarquis/hlsl-store-type-propagation
848a0ccb Merge branch 'greg-lunarg-flatten1'
8a3f7a12 Merge branch 'flatten1' of https://github.com/greg-lunarg/glslang into greg-lunarg-flatten1
b3cff2f2 HLSL Tests: Remove optimization from tests that don't need it.
e0639287 HLSL Legalization: Add scalar replacement
3f0aff8e HLSL: Fix possibly incorrect type conversion in StoreN and LoadN
3b2dc1a7 Merge pull request #1195 from LoopDawg/gcc-bug-workaround
c074f2bc g++ 5.4.0 suspected defect workaround
3f0d4bcd SPV: Document history of the generator version number.
e1ff2312 GLSL: Fix #1193: no 'location' on uniform/buffer block.
a0d60f2b gcc: potentially a compiler-bug work around
2505057a SPV: Memory model: Reduce set of memory-semantic bits requested for "all".
838d7afc SPV: HLSL: Move to correct HLSL barrier semantics, per Khronos recommendation.
c72e5937 SPV: Bump the generator number to account for barrier changes.
8297936d SPV: Change barrier emission to conform to Khronos decisions.
070aaeaf HLSL: Fix #1192: when bool operands are converted to ints, convert result type.
35682b59 Merge pull request #1191 from greg-lunarg/kg6
72deeb25 Update spirv-tools known-good.
788fbeb3 HLSL: Make attributes for built-in override semantics.
a67d0706 Merge pull request #1189 from KhronosGroup/spv-xfb
edaf5567 SPV: Plumb through XFB buffer and stride information.
be3842f6 GLSL: Implement XFB for redeclared built-in blocks.
04f4566f Merge pull request #1184 from KhronosGroup/SPV_EXT_fragment_fully_covered
1c5443c6 Add implementation of SPV_EXT_fragment_fully_covered
e9e0cb60 Update to latest public headers.
396de16c Merge pull request #1183 from LoopDawg/builtin-output-array-indirect
69feabc9 Merge pull request #1186 from zeux/master
c92860e2 HLSL: Implement support for RT/Viewport output from VS
0cff5100 HLSL: for split output structs, propagate indirection to builtin.
e078059d Merge pull request #1174 from LoopDawg/y-flip
8116cfc9 HLSL: Give error on unsupported buffer initializer.
87982be1 HLSL: Remove unintended/untested functionality PrimitiveID.
67fca7c4 Merge pull request #1178 from LoopDawg/primitiveid-hs-input
1cfc0f9e Merge pull request #1175 from KhronosGroup/no-flatten-local-opaque
280c75ca HLSL: Allow primitive id on hull shader inputs
dc005fb0 HLSL: Stop flattening non-IO structs containing opaques.
b22c069f HLSL: add optional position.Y inversion
471bfed0 HLSL: Fix #606: make layout() override register.
cc951f81 HLSL: Fix #1154: Support PointSize, as an attribute.
b0159f85 Merge pull request #1151 from cgmb/update-readme
384b2070 Improve build instructions
6a14f780 HLSL: Fix #1163: treat buffers as references when calling functions.
1f899924 Merge pull request #1171 from greg-lunarg/kg5
531898a4 Merge pull request #1170 from LoopDawg/matsize-warnings
3e72d265 Update spirv-tools known-good
8c49f9b4 HLSL: minor: add warning for mat() matrix size truncation
7199a6d1 Add initialization in case it is causing the Apple Clang release failure.
ffc31cdc Tests: Trigger more texture tests, and hopefully see build failure go away.
1ce94b2d Merge pull request #1166 from tafuri/#1165-invalid_Store
b2abe2f0 Merge pull request #1169 from LoopDawg/cbuffer-identifier
c4372e43 Merge pull request #1167 from LoopDawg/matmul-truncate-mxm
72cddd01 Merge pull request #1168 from greg-lunarg/kg4
7ee29ba7 HLSL: allow keyword-identifiers as cbuffer/struct names.
30d92db0 Update spirv-tools known-good
cee29b04 HLSL: add implicit mat*mat truncations
66b319d3 Added new test to gtests and updated test data
59677dae Respect the array type in Store operation
792a9480 Merge pull request #1161 from LoopDawg/matmul-truncate
2e629106 HLSL: matrix and vector truncations for m*v, v*m, m*m
698bf754 Memory: Mak full explicit destructor functionality, techincally correctly.
1cf2b355 Memory: Fix #705: don't use pool object after invoking destructor.
fd1d07da Memory: Put pragma tables in the pool.
cbdf871d SPV: SampleMask does not depend on SampleRateShading.
e2c15b4f Memory: Reference count number of clients, to support multiple independent clients in same process.
b63f4a38 Usage: clarify meaning of -s; fixes #1135.
cb421ef9 Test: Add more legalization tests; those effected by flattening.
ca4ef9f4 Merge pull request #1156 from LoopDawg/snorm-uav
6e49c76e Merge pull request #1157 from LoopDawg/gs-hs-mix
7573a2ab HLSL: ignore geometry attributes on non-GS stages.
4036ef15 Merge pull request #1147 from KhronosGroup/memory1
ab9c6a8a Merge pull request #1155 from antiagainst/skip-tags
5da8ead7 Memory: Remove redundant pool popAll(), which is potentially confusing.
fa39cffd HLSL: Accept unorm and snorm on types
9a65c6a9 Appveyor: avoid double testing on master commits
fc3e8647 Implement OS_DumpMemoryCounters for Linux
74bde987 Memory: Restore unused interfaces, in case other tools called them.
c9e67405 Merge pull request #1150 from antiagainst/readme-release
30c60bdf Update README about the automatic master-tot relase
a9c8cce8 Merge pull request #1143 from LoopDawg/texturebuffer
94f28eb6 Memory: Add loop around main, to test tear-down and reuse, and monitor memory changes.
cb42541e Memory: Remove the need for per-thread tear down.
ff8e59f5 Memory: Do process and 1st thread tear down.
4ceaab16 Memory: Move to a normal model of ownership of memory pools, for new/delete.
be209055 Memory: Non-Functional: Rationalize and improve encapsulation of TLS usage.
a36997cb Merge pull request #1142 from greg-lunarg/kg3
4abd6b58 Merge pull request #1145 from antiagainst/travis-auto-deploy
fba299a2 Travis: auto deploy build artifacts to GitHub Releases
a0680e61 Merge pull request #1114 from LoopDawg/validator-script
a50a9de3 Merge pull request #1116 from LoopDawg/reverse-shift-args
7c2f6d85 Merge pull request #1144 from antiagainst/appveyor-auto-deploy
e570955c Reverse order of setShiftBindingForSet parameters
4ec680e1 Add script to crank test shaders through spirv-val
a7eab9b3 Appveyor: auto deploy build artifacts to GitHub Releases
e5530b92 HLSL: implement TextureBuffer<type>
c77da685 Update spirv-tools known good.
2edde666 SPV: Don't support noise*() when generating SPV.
af52799c Errors: Have a whole set of tool-level error messages report to stderr.
a372a3ed Versioning: Update some version strings. Still need better overall version.
9f0b6fa4 Merge pull request #1139 from greg-lunarg/remap2
e86b4c84 Remapper: Fix strip algo when strip ranges overlap
88e22a60 Fix #1079: don't give error when macro() name used without open (.
e8d21388 Fix nondeterminism discussed in 258b700f5957fc13b0512b3734a1b0e81a1c271d
ac516024 Fix #1065: don't validate Vulkan binding numbers.
715c353a Non-functional: copyright update, to help with non-determinism test.
5866e67b Tests: Non-determinancy: Add back in the IntMin tests.
a6362228 Merge pull request #1133 from greg-lunarg/kg2
3f9c03bd Add python3 compatibility to update_glslang_sources.py
258b700f Non-determinant tests: Remove recent tests, to see if things stabelize.
e9173b19 Non-functional: Add {} expected by convention; retrigger failed bot tests.
0501e7c8 Merge pull request #1129 from xorgy/const-fold-int-min-modulo-negative-one
f83e2f06 GLSL: Fold constant SHRT_MIN/INT_MIN/LLONG_MIN % -1 to 0.
b5b08462 Merge pull request #1124 from xorgy/check-inner-implicit-atomic-uint
60209951 Merge pull request #1127 from xorgy/preprocessor-int-min-mod-negative-one
9d4a1b24 Preprocessor: Evaluate INT_MIN % -1 to 0.
047b65f9 Merge pull request #1125 from greg-lunarg/kg1
cc80d80d Update spirv-tools known-good
437911af GLSL: Check for implicit inner dimension in array of atomic_uint.
9cfc1551 Merge pull request #1118 from xorgy/only-swizzle-numbers-and-bools
016e47f7 Merge branch 'only-parse-inf-constant-in-hlsl' of https://github.com/xorgy/glslang into xorgy-only-parse-inf-constant-in-hlsl
6e33b787 Tests: Add test for GLSL +-#INF.
79a40740 Merge pull request #1120 from xorgy/overlong-hex-literal
60312662 GLSL: Only parse [-]1.#INF in HLSL mode.
9028ed20 Check for hexadecimal literals exceeding MaxTokenLength.
07c0bcea Only try swizzles on vectors, numbers, and booleans.
b1eaf82c Merge pull request #1115 from LoopDawg/stdarray-binding-set
2915da30 Nonfunctional: minor: use std::array for per-set shifts, fix warning.
573cc9e9 Merge pull request #1111 from LoopDawg/per-set-binding-offsets
7a9db71f SPV: Don't emit StorageImageMultisample capability for subpass images.
6cfeced8 Non-functional: missing comments from missed git add.
1b46f137 HLSL: Fix #1106. Support shader setting of binding/set for $Global.
08a14422 Add per-descriptor-set IO mapping shift values.
fe4e572c GLSL->SPIR-V: Put precision decorations on imageLoad().
f0e35bf0 GLSL: Make sampling operations have agnostic precision qualifiers for desktop.
3112b568 Merge pull request #1113 from xorgy/preprocessor-int-min-over-negative-one
0b55e0f2 Merge pull request #1102 from KhronosGroup/partially-flatten
dc756a61 Preprocessor: Evaluate INT_MIN / -1 to 0.
a50b107e Build: Fix build warning.
8b555f74 Merge pull request #1109 from xorgy/never-try-to-swizzle-void
5313613d Don't try to swizzle void.
856502cb Update spirv-tools known-good
7d67c6cb PP: Fix #1104: Missing check for #if overflow.
1a4bbc4a HLSL: More clip fix: It is more involved than previous commit. Complete.
4ce5b562 Fix #1103: clip() works on int/uint.
5889fa03 Tests: Add clip(int) tests.
cf571f73 Infrastructure: Add a TShader method to publicly expose the intermediate.
41aa1995 HLSL: Partially flatten hierarchies, instead of all or nothing.
60e91611 Merge pull request #1098 from LoopDawg/attribute-gets
0d1f63ec Merge pull request #1097 from SWIFTingAround/master
ad2bc097 Merge pull request #1094 from LoopDawg/split-shadow-tx
ddb45f8d Merge pull request #1080 from hedejing/master
52c087ff HLSL: add helper access methods to TAttributeMap
aab00012 Set cmake-policy CMP0048 to NEW
fdbd0eba Add getAsLoopNode() method for Loop node
028c5a8d HLSL: nonfunctional: rename setId -> switchId, add comment
bb79abcc HLSL: Validate implicit initializer assignment to opaque members.
07ed11f9 SPV: GeneratorVersion: bump version number because of atomic decrement change.
b27de028 Merge pull request #1090 from tafuri/#1084-fix-segfault
48d6e798 SPV: Correct semantics of atomic-counter decrement.
592e8f04 HLSL: Tests: Add subset of flattened opaque test to legalize results.
4f6865f4 Added test for local structured buffer variable
5133b108 Fixed formatting
908813c2 Merge pull request #1089 from LoopDawg/split-shadow-tx
0a826111 Only track variables in the global scope
73c57bbe HLSL: split textures used for both shadow and non-shadow modes
263986eb Readme: Update with additional Windows build information for SPIRV-tools build.
2c9c2af6 Merge pull request #1085 from KhronosGroup/flatten-assign-subset
700bdeb7 HLSL: Fix #954: Track/access subsets of flattened multi-level aggregates.
86a82bb9 Merge pull request #1081 from xxxbxxx/for-upstream-1
a6085875 HLSL: Fix crash when flattening both side of assignement simultaneously.
24919659 Merge pull request #1075 from LoopDawg/subpass-input
7f93d56e HLSL: add subpass input types and methods
092b7d2e Build: Fix a couple build issues.
77ea30bd HLSL: Additional attribute support: [[]], namespace, parameters:
3693e631 Fix #1060: Could crash if using --source-entry-point with -e; fixed.
5a57ca68 Merge pull request #1078 from greg-lunarg/addopt14
354a54c6 Legalization: Fix tests after workarounds removed
d41993d9 SPV: rationalize parameter handling for "original" and "writable" parameters.
bed4e4f7 HLSL: Pass opaques by local copy, instead of by interface original.
15fa7ef5 HLSL: Remove workarounds for assigning to opaques.
dabd1bf2 Merge pull request #1076 from LoopDawg/shadow-tx-types
195f584e HLSL: force textures to shadow modes from combined samplers
fc7aeaee Merge pull request #1077 from greg-lunarg/addopt12
52fe3d59 Legalization: Fix warnings and disable tests when spirv-tools not present
3ddcd3f1 Merge pull request #1070 from greg-lunarg/addopt8
e2b36163 Advance spirv-opt known-good to hopefully fix travis multithread failure
b56366ab Legalization: Skip spirv-tools tests
741d1f20 Pick up latest spirv-tools in attempt to fix travis failures
87fd7429 Try Python interpreter on update_glslang_sources.py in appveyor
f451756d Fix travis and appveyor calls to update_glslang_sources.py
cd1f169c Enable HLSL legalization
44dd6a00 Merge pull request #1072 from amdrexu/feature
e8fe8b0d Implement extension GL_NV_shader_atomic_int64
f21c173a Merge pull request #1071 from antiagainst/ninja-make
afa128a8 Travis: use make instead of ninja and limit concurrent jobs
9cf5dfbd Merge pull request #1063 from LoopDawg/remapper-error-cleanup
ea5204d1 Build: Merge pull request #1068 from greg-lunarg/addopt4
fd34f0e6 CMake changes for HLSL legalization
8004d365 Remapper: make remapper robust against non-exiting error handlers
5f77d864 HLSL: Fix #1064: Don't include empty structures on OpEntryPoint
31365afa Merge pull request #1044 from dsrbecky/image_external_essl3
ae8af5d3 HLSL: fix array[1] of vec4 constant declaration.
c64a9dd6 Test: Make another test legal HLSL, and rationalize GLSL vs HLSL addConstructor().
bdbbc68e HLSL: Add bounds checking, shared with GLSL. Partially address #1032.
346dd7c7 Merge pull request #1051 from LoopDawg/bug-1049
4a145dbf HLSL: handle split InputPatch templat type in patch constant functions
a5d86164 HLSL: allow mixed user & builtin members in hull shader output structure
ba6a3c29 GLSL: Make gl_Layer and gl_ViewportIndex always be outside blocks.
aab3bcff Merge pull request #1056 from KhronosGroup/glsl-entrypoint-rename
9855bdad GLSL: Promote HLSL entry-point renaming code to be used by GLSL as well.
4f4683d2 Merge pull request #1050 from amdrexu/feature
30ac0525 Merge pull request #1055 from KhronosGroup/strdup
d9bd97d0 Build: Fix strdup -> _strdup warnings.
b3ca4045 Build: Fix build warnings.
5002c26b Fix #1043: set all scan string-locations to have bias, not just the first one.
a25530cc Non-functional: Make usage for entry points more consistent.
e22c11fd Merge pull request #1053 from mchock-nv/mchock-nv-fix-lambda
ea1ea974 Address #1052: Have language-level exits of case statements.
933c10cd Delete unused 'this' capture
05506bb8 Implement the extension GL_AMD_shader_fragment_mask
d004e5ca Merge pull request #1047 from svenstaro/add-stdin-option
0dd1285c Add --stdin
8688e3fb Merge pull request #1048 from LoopDawg/opaque-type-fix
76117921 Fix lvalue check in SPIR-V generation
2c5b3d64 Add support for GL_OES_EGL_image_external_essl3
3a21c880 Merge pull request #1042 from LoopDawg/warning-fix-2
43f682f6 Merge pull request #1039 from amdrexu/bugfix
2baa7742 Linux build warning fix
2a305f65 Fix issues of GL_ARB_viewport_layer_array
75e057f9 Merge pull request #1037 from LoopDawg/clip-cull-geom
5e5b12e9 HLSL: add geometry stage support for clip/cull distance
a459fc81 Merge pull request #1031 from xxxbxxx/for-upstream-2
4e2f05da Build: Fix #1036: size_t warning.
eb71cdd5 HLSL: fix preprocessor concatenation behaviour.
ea0c1643 Merge pull request #1035 from LoopDawg/clip-cull-type-fix
d6f4d9b4 HLSL: fix type on clip/cull index result
82e95a3a SPV: Add auto location mapping of non-opaque non-block uniform variables.
8268a355 Build: Attempt better support for VS 2012.
74c5f711 Merge pull request #1014 from KhronosGroup/SPV_EXT_shader_viewport_index_layer
35343cb8 Merge pull request #1034 from KhronosGroup/module-processes
b41bff69 SPV: 1st pass implementation of SPV_EXT_shader_viewport_index_layer.
2a27116c SPV reflection: Add OpModuleProcessed for compile options.
1f312f90 Merge pull request #1028 from LoopDawg/clip-cull-input
e2cda3c2 HLSL: handle clip and cull distance input builtin type conversion
fc343694 Merge pull request #1029 from amdrexu/feature2
00b3e384 Merge pull request #1025 from amdrexu/feature
129799a7 Implement extension GL_AMD_shader_image_load_store_lod
e8fdd79f SPV: Implement extension SPV_EXT_shader_stencil_export
3d1b7096 HLSL: Fix #1027.
778806a6 HLSL: Fix #1018: Give an error for mismatched return type.
b207daa5 Merge pull request #1017 from LoopDawg/texture-struct-return.1
786e8795 Build: Fix build when NV_EXTENSIONS is not enabled.
d6be6da0 SPV: Fix #1016: Don't allow non-GLSL-extension protected Layer and ViewportIndex members.
5ee05891 HLSL: add methods to track user structure in texture return type.
03e63fa8 HLSL: Add fall-back for opaque initializers to just generate long-term expected code.
25495fdf Merge pull request #1013 from KhronosGroup/flatten-nonarrayed
260f5061 SPV: Correct selection of storage-image capabilities. Fixes #986.
e29ff3cd HLSL: Flatten structs for all non-arrayed I/O interfaces.
01109546 HLSL: Make fresh array sizes for TessLevelOuter and TessLevelInner arrays.
4baebea8 HLSL Test: Expand test, adding a user-patch-constant signature.
e516d433 HLSL: Move debug naming to a simpler, more consistent, scheme.
3322dd8f HLSL: Include built-in processing for vertex input and fragment output flattening.
ecd08bc3 Non-functional HLSL: Factor out built-ins from splitting and related simplifications.
eaed0682 Merge pull request #1011 from LoopDawg/pragma-pack-matrix
6a264bed HLSL: implement #pragma pack_matrix(layout)
d5aedc19 HLSL: Correct which things flattening tracks for linkage, based on caller, not type.
7497e7c9 Merge pull request #1010 from LoopDawg/mat-rowcol-fix-1
898f5fbe HLSL: fix qualifier propagation from user struct types to block definitions.
2b4f77f2 HLSL: Correct use of isPerVertexBuiltIn() to be isClipOrCullDistance().
d319fb4e HLSL: Test change: Geometry shaders can't return values from main.
b6be80f4 HLSL: Flatten more I/O: non-arrayed user-only structures.
cca42a8e HLSL: Stop including empty structures in the I/O interface. Fix #785.
6042eb47 Non-functional: HLSL: Simplify I/O logic for splitting.
4cf52660 Merge pull request #1006 from KhronosGroup/4.60
934d11b6 GLSL 4.6: Implement shader group vote.
941f3bbd GLSL 4.6: Implement draw parameters.
0d0c6d38 GLSL 4.6: Implement atomic counter ops and SPV_KHR_shader_atomic_counter_ops.
de16e52b GLSL: Initiate version GLSL 460, including accept extraneous semicolons.
fda6edcb HLSL Tests: Fix two tests to be valid under FXC.
318a379b Non-functional: HLSL further simplications to base I/O flattening on.
8bcdf2ea Non-functional: HLSL: clean up dead code for splitting.
48dc5872 Merge pull request #1005 from LoopDawg/remove-unused
7a3cef10 HLSL: Non-functional: warning fix, remove unused member.
a58cc9ff GLSL reflection: Fix #985: reflect runtime sized arrays having no constant index.
a353bf1f Nonfunctional: Add reflect test case, and fix long lines in reflection code.
2ceec681 Nonfunctional: Shorten some lines to the coding standard, to retrigger failed test run.
38151b2f Merge pull request #1002 from amdrexu/bugfix
286ca432 SPV: Memory qualifiers should decorate top-level block members
f1f5058a Merge pull request #997 from LoopDawg/clipcull-semantic
307b6507 HLSL: handle multiple clip/cull semantic IDs
d2d3a142 SPV: Update to latest 1.0 headers, removing redundancies in GLSL.ext.AMD.h.
cd52fd5a Merge pull request #1000 from LoopDawg/samplecmpzero-cubearray-fix
ef94b1a5 Fix dref explicit LOD form of sample with cube texture arrays
53863a3a GLSL: Implement version 320 for ES.
9353f1af GLSL: Add version-number checking.
67eb4970 SPV/OpenGL: Require locations on non-opaque uniform variables.
ab008675 Merge pull request #991 from LoopDawg/resource-set-binding-fix
a2b71902 Reflection: Fix #977: Expose getBinding(), use in new getUniformBinding().
52017192 Fix crash with --resource-set-binding [n] (common set form, not per-register form)
0e392aa9 Merge pull request #996 from KhronosGroup/decorate-parameters
961cd35b SPV: Fix #995: Include memory decorations on parameters.
fad62972 SPV: Non-functional: support lists of decorations per parameter.
198652a6 Merge pull request #994 from KhronosGroup/opaque-init
0e6e2ffd Fix #980: flatten opaque initializers to use aliases.
37c202aa Merge pull request #992 from polarina/null-deref-fix
b5d9c11e Fix NULL pointer dereference in TParseContext::builtInOpCheck
91e69c03 SPV: Address #989: Don't add Location to built-ins when automapping.
56d2b990 Merge pull request #987 from KhronosGroup/global-std140
735d7e56 Address part A of #982: $Global will use std140 instead of HLSL offsets.
1e4a721c Merge pull request #978 from LoopDawg/global-const-init-fix
d854ac8b Merge pull request #983 from LoopDawg/warning-fix
b97b25e4 Fix StandAlone.cpp compilation warnings
0fca0baf WIP: HLSL: support global const initializers from non-constant rvalues
652db16f Build: Fix #975: shut up a compiler warning (code was fine).
4b1a890b Nonfunctional, infrastructure: Clean up Test directory droppings.
645fdaa7 Merge pull request #971 from amdrexu/bugfix
57e65929 HLSL: Translate directive [flatten] and [branch] to SPV control mask.
423fae48 Tests: Add a test for concurrent use of std430 and push_constant.
9645f782 Merge pull request #965 from chaoc/spv-khr-post-depth-coverage
c1204527 Implement SPV_KHR_post_depth_coverage
33bf7b2f Merge pull request #974 from LoopDawg/anyall-types
54b9ff9c HLSL: handle type conversion for any/all intrinsics
17b5f917 Merge pull request #969 from d3x0r/patch-1
3f70d405 Merge pull request #970 from rohith10/master
6206091e Fix CMake scripts: The set_property script can be used to set only a single property, so now setting the POSITION_INDEPENDENT_CODE property correctly.
45933124 Update CMakeLists.txt
4e53d905 Update CMakeLists.txt
89de217f Update CMakeLists.txt
9c6ea324 Update CMakeLists.txt
57a2b22d Update CMakeLists.txt
cde46127 Update CMakeLists.txt
02ed9eb2 Update CMakeLists.txt
42b69261 Update CMakeLists.txt
f8f494ff Add option to skip installation
eb5f12d1 Merge pull request #967 from dsrbecky/multiview
d1be7545 HLSL: Non-functional: Move partial flattened access into symbol node.
02a14e7c HLSL: Non-functional: some coding convention tweaks (120 columns, nullptr).
0af795e8 Merge pull request #966 from TiemoJung/io_remapper_update
aad93a80 Merge pull request #959 from TiemoJung/texture_upgrade
5513d9d0 Multiview extension: Accept layout(num_views) qualifier
0422eb23 io resolver improvements
99466020 Merge pull request #964 from dsrbecky/multiview
0fbe02c6 Implement extensions GL_OVR_multiview and GL_OVR_multiview2
fde4975d Fix for not transforming all image symbols into sampled images symbols
2ae23ca1 Merge pull request #957 from amdrexu/feature
37d7cfb1 Merge pull request #961 from benvanik/fix_order
82da44d4 Fixing initialization order to fix -Wreorder warning in clang.
89400ea7 GLSL: validation of early_fragment_tests, others, on an object.
37cdceed Implement extension GL_ARB_shader_stencil_export
89f8d1e6 HLSL: Fix #942: Map SV_TargetN to SPV Location N.
4f54c0c4 HLSL: Fix hull-shader test.
da9eb815 HLSL: Don't pin down which tessellation stage must error check input primitive.
fe6689c6 HLSL: support point mode.
102328b7 Merge pull request #950 from dsrbecky/shadow_samplers
a8a83204 Merge pull request #948 from KhronosGroup/env-control
6353d55e Command-line: Add support for setting language's environment.
c178f0a4 Infrastructure: Non-functional: rationalize some command-line processing.
4be4aebd Infrastructure: Non-functional: Move to rich description of environment.
c6ac40a1 Add support for GL_EXT_shadow_samplers
4fbb8cb4 Merge pull request #947 from LoopDawg/clip-cull-distance
c44b95fd WIP: HLSL: handle clip/cull distance array semantic matching
4329d555 HLSL: Broaden solution for #940, editing integer input for 'flat'.
f0bc598d HLSL: Force flat interpolation for structure members. Fixes #940.
be1085cb Build: add switch default to make compilers happy
fba125a9 Merge pull request #943 from xxxbxxx/for-upstream-1
54596ff9 HLSL: Force flat (nointerp) onto integer fragment inputs.
b1d97537 hlsl: "in out" is also an inout qualifier.
f02c8e6b Non-functional: Attempt to reset Travis error, while adding more nullptr use.
2fcdd64e HLSL: Remove support for named tbuffer/cbuffer.  Fixes #939.
054378d9 HLSL: Non-functional: Make test valid HLSL, and related comments/cleanup.
e2ff404f Merge pull request #917 from KhronosGroup/remove-redundant-locations
f790b161 Tests: Fix missing test result.
a931366f Standalone: Implement -D and -U for preprocessor macros.
04acb1b7 Standalone: Rationalize ShaderCompUnit and file data.
6263fb19 Infrastructure: Rationalize command-line options.
2d46e73b Merge pull request #931 from LoopDawg/scalar-mat-assign
e2713125 HLSL: fix several issues in mat construction from scalars
f7cd88a2 Merge pull request #937 from amdrexu/bugfix
301a2bc8 SPV: Fix an typo of SPV_AMD_texture_gather_bias_lod
82ae8c31 HLSL: Fix #924: Convert between two different arrays with cast.
0320d090 HLSL: Recognize types declared as identifiers as identifiers.
91c46c65 Merge pull request #932 from LoopDawg/warning-fix-1
1892886a HLSL: compilation warning fix: no functional change
5ea6a192 Merge branch 'amdrexu-feature'
cabbb788 Implement extension GL_AMD_gpu_shader_int16
4d5bcd31 HLSL: Allow macro expansions to create the 'defined' operator.
3fcb42cf GLSL: Fix #853: Only outer dimension of array can be specialization constant.
d314ecfb GLSL: Correct missing "not" from error message about non writeonly images.
dd56173d GLSL: Disallow 'shared' in nested scopes.
c5f2ab96 GLSL: Disallow unsized arrays of atomic_uint.
885443c7 Build: reset for multi-threaded test error, that reported a single missing character.
14d65beb GLSL: Fix Khronos private Bugzilla 15973: local sizes can't be 0.
2eb13550 GLSL: Fix #396: Error when 'defined' comes from macro expansion.
65755667 Merge pull request #922 from KhronosGroup/dash-I
971a0a8d Infrastructure: add include search paths (-I, etc.).
96f65521 HLSL: Implement half matrices, and map all half* -> float*.
f6deacd5 HLSL: Track control-flow nesting and warn on aliasing under it.
9b2531ba Infrastructure: Move nesting counters, etc., to base class.
b4d46627 Build: Fix build warnings.
a83959fa Merge pull request #920 from jeremy-lunarg/jeremy-build
549764b5 Build: Fix linux
0e07119a HLSL: Fix #919: for-init-statement is arbitrary declaration or expression.
e00e8f45 GLSL: replace general missing functionality with specific messages.
21369c82 Merge pull request #912 from amdrexu/feature
225e0fca Implement the extension GL_AMD_texture_gather_bias_lod
7cdf3fc3 Replace #422: Remove the redundant location setting in AST->SPIR-V.
94c18a84 GLSL: Fix bug setting component=0 for an auto-location assignment.
8de7e7bf GLSL: Error when using location on an arrayed block.
99f289d4 Merge pull request #899 from antiagainst/rm-empty-cpps
0b94a31e Merge pull request #915 from LoopDawg/subvec4-intrinsic
70942e5f Merge pull request #905 from KhronosGroup/flatten-opaque-structs
f3150742 HLSL: Convert run-time sampler assignments to compile-time aliases.
750c2d07 SPV: When passing structs of opaque types, flatten and pass the members instead.
d66c5b12 HLSL: iomapper: Fix #914. Tolerate user aliasing of bindings.
a696fd1a HLSL: add test coverage for sub-vec4 texture intrinsics
ae99875e Merge pull request #907 from KhronosGroup/include
5052152e Merge pull request #913 from amdrexu/bugfix
3494b4da HLSL: Add an Includer to handle #include.
0848cc07 Parser: Add missing codes for float16
44d2728e Merge pull request #911 from KhronosGroup/debug-info
e485c7af SPV: Debug output: Include OpLine information for execution path.
121853f4 SPV: Add OpSource shader source code and file name.
136b1e2d Merge pull request #856 from TiemoJung/texture_upgrade
baf570ef Pure Texture to Sampled Texture Transform
d6af18f6 Merge pull request #901 from LoopDawg/imat-construct
7c9129bc SPV: Fix #904: Correctly check for built-in block redeclations for location check.
84cc15f0 HLSL: Fix #903: Don't short-circuit && or ||.
6e2295d3 HLSL: Fix #902: Incorrect protection against zero arguments.
174ccb8f HLSL: Add imat, umat, and bmat constructors
2c6f48b1 Fix #373: Implicitly make gl_FragColor a location=0 output.
1d585ac8 SPV: Correctly enforce 'location' presence on in/out blocks.
557caf24 Merge pull request #900 from LoopDawg/tx-overloads
7b8c386c More non-determinism fixed.
b6cabc4f Fix C++ portability, non-deterministic order of argument evaluation.
80f92a19 Fix #857: Convert uniform int to local bool for struct alias assignment.
0d2b4713 HLSL: Don't do logical short-circuits when the operands are bool-vectors.
132a28aa HLSL: allow name mangling based on texture template type
ddda9cb8 Remove empty cpp files
ab0847ef Merge pull request #896 from KhronosGroup/spv-location
ff164d87 Merge pull request #897 from LoopDawg/remap-specconstop-fix.2
65c2eed6 Remapper: handle embedded opcode in OpSpecConstantOp
71facdf4 SPV: Give error on not assigning locations to I/O.
24e895b4 Merge pull request #860 from steve-lunarg/sb-counter-args.2
09a29d9b Merge pull request #893 from KhronosGroup/member-call
2bb1f39f WIP: HLSL: add ability to pass struct buffers with counters to fns
0a2a0cd3 HLSL: Implement member functions calling member functions.
b29cc30c Merge pull request #852 from steve-lunarg/declared-builtin
a4bfed12 WIP: track declared builtin type [proposal]
1a010b83 Merge pull request #890 from LoopDawg/mip-operator
726bf96a HLSL: add .mips[][] operator for texture types
c70bbc83 Merge pull request #889 from antiagainst/travis-android
b21213e8 Check Android build on Travis CI.
ef7efb21 Merge pull request #888 from LoopDawg/geometry-stage-mix
c6510a33 HLSL: allow GS-specific methods in other stages
c49b4efa HLSL: Fix #884: Use promoted children, not pre-promoted, in completing binary nodes.
c48c8e76 Merge pull request #886 from antiagainst/unordered-set
2840f63f Use unordered_set in ReadableOrderTraverser.
d9b08d5c Merge pull request #880 from aras-p/master
02c4728a Merge pull request #874 from xlpiao/DescriptorSet-and-Binding
23d3c712 [lumped builds] Add include guards (#pragma once) to header files that did not have any.
8e204b2d [lumped builds] Only define _CRT_SECURE_NO_WARNINGS if it’s not defined yet. When glslang is built with some other build system and lumped/unity builds are used, without the checks this would get “macro is being redefined” warnings/errors.
36dc8290 HLSL: Manually configure descriptor set and binding number for resources
12d69368 Build fix: Make string assignment simpler to avoid some compiler issues.
1ee1c8e1 Build: Fix portability in previous commit.
c10191d1 SPV: Support texelFetch() on a textureBuffer (no sampler).
a5c5fb61 SPV: Emit extension for using StorageClassStorageBuffer.
43c72b0e Merge pull request #878 from steve-lunarg/unroll-hint
f1709e71 HLSL: implement [unroll] and [loop] attributes
de1cc06c Merge pull request #877 from steve-lunarg/warn-fix1
0c20067c Fix iomapper build warnings
7aaf4191 Merge pull request #873 from steve-lunarg/gathercmp
6817f81e HLSL: Implement missing GatherCmp
22be5788 Merge pull request #870 from SoapGentoo/cmake-fixes
22afc38b Modernise CMake #2
eb9a532b Merge pull request #869 from KhronosGroup/revert-828-fixes
cfc69d95 Revert "Modernise CMake"
a01600b8 Merge pull request #828 from SoapGentoo/fixes
8f824265 Make test suite optional by using CTest
5a5699bd Modernise CMake
acce8dce Merge pull request #868 from TiemoJung/two_pass_io_remap
bbae7de0 Merge pull request #867 from steve-lunarg/emptyinit
f1bfeec7 Notification phase for io remapper
c0043cda HLSL: Allow empty struct initializers
7cca1409 HLSL: Turn on hlsl-offsets by default for HLSL-source shaders.
dd5dee0b Merge pull request #859 from steve-lunarg/sampleposition
d4d0b297 HLSL: add standard sample position return form of GetSamplePosition method
88aabcca Merge pull request #855 from steve-lunarg/constantbuffer
a766b838 HLSL: Add ConstantBuffer<T> syntax
a1cdd13b Merge pull request #851 from dgkoch/dgkoch_build_fixes3
15bb4370 Fix Android build errors
8a5718a9 Merge pull request #849 from steve-lunarg/samplercmp-errmsg
3cbc32f4 HLSL: add error for expected comparison sampler in SampleCmp* ops
32a385e9 HLSL: Fix #846: support mixed ternary types.
0603a383 Merge pull request #847 from steve-lunarg/sb-param-fix
1c04f1e5 Merge pull request #842 from steve-lunarg/sb-cast
1487db54 Merge pull request #840 from steve-lunarg/iomap-hlsl
e404e088 HLSL: fix for byte address buffers in fn parmeters
7b1dcd66 HLSL: add readonly qualifier to tbuffer, so they end up as SRV
be283550 WIP: HLSL: hlsl register class iomapping
ba5cc2fa GLSL: Fix #822: Improve information given for syntax errors.
0c6f9360 HLSL: Fix #96: Support do-while loop substatements with no curly braces.
f8203a0a HLSL: cast non-int types to uint on Load/Store indexes
67027189 SPV: Support test #pragma for generating the StorageBuffer storage class.
a8d3db6b Merge pull request #835 from steve-lunarg/sb-counters
d5d9ffbd HLSL: vector shape conversions for all ops: Fix #839. Fix #653. Fix #631.
2aa12b1c HLSL: Address #839: avoid crash by distinguishing between bad argument and no argument.
350b9485 WIP: HLSL: add refection queries for structuredbuffer counter blocks
12bc9aa9 WIP: HLSL: add Append/ConsumeBuffer support
8e26feb8 WIP: HLSL: structuredbuffer counter functionality
d1141843 SPV Non-functional: fix ordering causing problems with another branch.
97366a0d HLSL: Fix #770: implicitly convert bool operands to numeric operators.
a4c64c98 HLSL: Fix #834: Report #version is an illegal command.
a0c578a6 HLSL: Fix #758: Support character literals (except for numeric escape sequences).
2051815b HLSL: Fix #803: Add shape conversions to the constant-initializer path.
a8b217fd Merge pull request #833 from KhronosGroup/hlsl-inf-syntax
776c515e HLSL: Support 1.#INF and -1.#INF syntax.
b5e739c2 HLSL: Fix boolean conversion bug and add more tests for ?:.
636b62db HLSL: Support vector 'cond ? :' -> EOpMix -> OpSelect.
34718204 HLSL: Non-functional: add vector ? : tests.
13075c61 HLSL: Fix #832: don't require terminating semicolon for cbuffer/tbuffer.
e9f18fd9 Merge pull request #831 from steve-lunarg/isfinite
9e5a19fd HLSL: fix return type for isfinite
ae79697d Merge pull request #827 from amdrexu/feature4
a09eefd8 Non-functional: Fix typos in comments.
6fa17641 HLSL: Emit the OpSource HLSL instruction for HLSL, using new headers.
7962bda3 Merge pull request #825 from steve-lunarg/index-cast
f89ad980 Implement the extension SPV_KHR_16bit_storage
2efd6c6d HLSL: cast bracket dereference index to int type if not.
38a42535 SPV: Move to latest public headers.
07b30c42 Merge pull request #823 from steve-lunarg/tess-coord-size
4f1403ed SPV: Fix #807: use --hlsl-offsets to allow hlsl-style offsets in a buffer.
ccb076ac HLSL: allow non-vec3 tessellation coordinate declarations
6f1e595d Merge branch 'jantlo-cpp11-feat'
d92b5679 Merge branch 'cpp11-feat' of https://github.com/jantlo/glslang into jantlo-cpp11-feat
a558b265 This refactor the StandAlone and WorkList files in order to use more C++11 features remove the dependencies from OS specific code. Changes:
97cb85c7 PP: Fix #783: Catch end-of-argument expansion in token pasting.
82460b5e HLSL: Fix #805: Support cast of scalars to structures.
5ce1e4af Merge pull request #817 from steve-lunarg/isfinite
c633f644 HLSL: Non-functional: rationalize making constructors.
8df9a486 Merge pull request #812 from steve-lunarg/PatchIO
13975525 Decompose OpIsFinite to avoid capability restrictions
067eb9b4 WIP: HLSL: Support InputPatch variables in patch constant functions
b68b9a8b Merge pull request #808 from steve-lunarg/gs-ep-wrap-fix
08e0c086 HLSL: fix GS implementation for EP wrapping
2184c2f2 Fix #287: pin down the io-array size before checking for out of range index.
6f03bfc7 Merge pull request #815 from steve-lunarg/tess-ds-pcf-order
f38cca3c HLSL: handle PCF input to DS in arbitrary argument position
fa84001a Merge pull request #814 from steve-lunarg/contains
27309f68 Refactor TType::contains* methods (nonfunctional)
c7fd73b7 Merge pull request #811 from steve-lunarg/combine-test
bf1537f4 WIP: HLSL: force uncombined flag off for Buffer<>
f36542f4 Revert "Merge pull request #779 from steve-lunarg/buffer-unsampled-fix"
84a30c8b Merge pull request #774 from steve-lunarg/tess-ctrlpt-pcf
e70fcf2d Merge pull request #810 from steve-lunarg/clip-crash-fix
db2e3b41 HLSL: fix crash on empty sequence node passed to intrinsic expansions
e741249b HLSL: pass tessellation execution modes through to SPIR-V
9ce76553 Merge pull request #797 from steve-lunarg/scalar-length
18958f6c HLSL: Fix #802: Preserve promoted child under ! operator.
7e997e26 HLSL: Implicit bool conversions for conditional expressions and related.
8f9fdc98 HLSL: Add namespace grammar and some basic semantics.
e752f463 HLSL: HS return is arrayed to match SPIR-V semantics
7afe1344 HLSL: strip off array dimension when assign locations of arrayed IO.
194f0f39 HLSL: require tessellation factors to be fixed size arrays
9cee73e0 HLSL: support per control point patch const fn invocation
e434ad92 Fix #809: smear scalar condition in OpSelect for selecting vector operands.
4dc835c3 Non-functional: Round of adding 'const', related to more efficient getFullNamespaceName().
714e58b2 Merge pull request #801 from amdrexu/bugfix
3feac2eb Merge pull request #806 from amdrexu/bugfix2
bcf291a7 Don't emit NV-specific interface members if NV extensions are disabled.
470026f9 HLSL: Fix an issue of frexp().
86e49d17 HLSL: Move frexp() to a separate test file.
aa3c64c2 Fix #800 (mostly): set of Linux warnings.
9fb31ce8 Tests: strengthen the value of test for NV members.
0e737844 Fix #790: Don't emit NV-specific interface members unless enabled by extension.
1ca04c2b HLSL: allow length() on scalars
93750bc0 Merge pull request #796 from steve-lunarg/emptystruct-return-fix
d8e34c51 HLSL: fix crash on empty struct return from entry point
19ea5689 Tests: Update test results.
000c818e HLSL: Allow use of $Global members in between function calls.
7a41f96d HLSL: Implement 'this' keyword.
3778979c HLSL: non-static member functions: track and find active anonymous 'this' scopes and members.
f4ba25e0 HLSL: Non-functional: the symbol field of a token was in practice unused; remove it.
5a839069 Merge pull request #782 from steve-lunarg/builtin-methods-prefix
1dd65ca3 Merge pull request #779 from steve-lunarg/buffer-unsampled-fix
e7d0752a HLSL: use prefix for builtin functions names to avoid namespace collisions
4960baaf HLSL: Basic turn on of non-static member functions.
dfbdd9eb HLSL: Add implicit-this tracking to TFunction.
f3d88bd4 HLSL non-functional: Generalize namespace nesting.
d3947d23 WIP: HLSL: propagate readonly qualifier for buffer types
cf2e7275 WIP: HLSL: Buffer types should be unsampled.
e751bca7 Fix #777: don't parse .suffix if <stage> is provided.
26013595 Merge pull request #776 from amdrexu/bugfix
5e317ffe SPV: Fix unexpected declarations of capability and extension
36b218de HLSL: Fix #771: add inline keyword.
95e736c8 Merge pull request #767 from DragoonX6/master
2dd643ff Merge branch 'TiemoJung-semantic_handling'
2dc50ff3 Merge branch 'semantic_handling' of https://github.com/TiemoJung/glslang into TiemoJung-semantic_handling
71c100d7 GLSL output: Removed fixed-size buffer; fixes #769.
c08fb8ab Full stack: properly implement GL_EXT_device_group and GL_EXT_multiview.
78cfba97 Fix location of #defines for core and compatibility profile.
601b7fa4 Revert previous check-in, until knowing what the spec. is and whether the test failure is related.
7a44a31d SPV: Address #759: make ViewIndex and DeviceIndex by 'in', not 'uniform'.
946e0a6d Merge pull request #768 from amdrexu/bugfix
d41a696c HLSL: Additional channel value for textureGatherXXX().
8155934b Fix building on MinGW-w64
b16f7e68 HLSL: Member-functions: capture body token stream for deferred syntax/semantics.
088d52ba HLSL: Non-functional: consolidate function declarator information.
c04c6a40 Merge pull request #762 from LukasBanana/master
54ee28f4 HLSL: Add scoping operator, accept static member functions, and support calling them.
5f12d2f7 HLSL: non-functional: simplify handleBuiltInMethod() to isBuiltInMethod().
1fbc6e6c Added 'GL_core_profile' and 'GL_compatibility_profile' macro definition to preamble.
523e20dc PP: Recognize the '::' token, and translate appropriately to GLSL/HLSL token.
6212e86f Merge pull request #764 from steve-lunarg/imagequery-sign
0b5c2ae7 Preserve signedness in SPV image query ops
757bc874 Merge pull request #763 from steve-lunarg/nullstruct-preservation
4198b8bf WIP: HLSL: preserve empty structures after splitting
6e1d50a7 HLSL: Accept SV_Cull/ClipDistanceN, by refactoring the way semantics are mapped.
229a6f7f Merge pull request #761 from baldurk/vs2010-compile-fixes
79f8bf0d Merge pull request #760 from steve-lunarg/gathercmpred
5d5db80d Compile fixes for VS2010
d00b0261 Enable GatherCmpRed.  Green/Blue/Alpha cannot be supported.
88e88e59 HLSL: Non-functional: Remove dead .length() code.
516d92d3 HLSL: Non-functional: Drive existing method recognition by syntax, not by name.
78388726 HLSL: Non-functional: Don't process function name/parameters before expected a function declaration.
b7201f8e Merge pull request #756 from steve-lunarg/getdimensions-fix
ca71d946 HLSL: Grammar: Generalize accepting a declaration to accept an aggregate of subtrees.
3ce4536a HLSL: use LOD form of ImageQuerySize when needed.
057df293 HLSL: Fix #754: recognize type casts in if-statements separately from declarations.
621c0e3d Merge pull request #755 from steve-lunarg/sb-orderfix
40efe5ce WIP: HLSL: Fix ordering defect if global SB decl after fn param
33f85b6e SPV: Allow push constant buffers to not have an instance name.
789086a8 HLSL: Test for issue #699.
322cb192 Merge pull request #750 from dgkoch/rename_KHX_to_EXT
27ffb299 HLSL: Add 'class' keyword as (so far) synonym for 'struct'.
efc97279 Rename KHX to EXT to match the released specs
c18cae21 Merge pull request #748 from dgkoch/dgkoch_build_fixes2
d9b7a850 More build fixes
854fe247 HLSL: Fix #747: accept 'struct' in front of previously user-defined type name.
0479437a SPV: Fix #739: OpSelect can only operate on scalars and vectors.
173c0c01 Merge pull request #744 from realitix/sanitize_sh_link
9c3f7b60 Merge pull request #746 from dgkoch/dgkoch_build_fixes
efeefd98 Build: Another fix for issue #718: implement the hidden methods of tFinalize.
197082ca Fix build warnings on some platforms
bc3fdcc8 Sanitize ShaderLang.h
3494d71c PP: Fix issue #738: don't assert on characters within a string.
fb22b69f PP: Partially address issue #738: handle premature end of argument when token pasting.
45c1b5b9 Merge pull request #742 from steve-lunarg/f16tof32-typefix
fdbfb65e HLSL: small fix for index type in f16tof32 opcode
5a042c06 GLSL: Fix #741: rationalize per-block vs. per-member offset checking.
69a2c696 Merge pull request #736 from steve-lunarg/structbuffer-params
b67b4a70 PP: Address #737: accept 'h'/'H' floating-point suffix more broadly.
f67f9d7e Merge pull request #740 from steve-lunarg/f16tof32
86b510ef WIP: HLSL: add f16tof32 and f32tof16 decompositions.
42e33c9b SPV: Update SPV header to official Rev. 10 of 1.0, and fix the consequences of doing so.
6c8aaacd SPV: Implement new extensions GL_KHX_device_group and GL_KHX_multiview.
dd8287a1 WIP: HLSL: add structuredbuffer pass by reference in fn params
4a57dced SPV: Handle nested opaque types as function parameters.
74912347 Merge pull request #734 from steve-lunarg/ssbo-reflection
cb34945e Merge pull request #733 from amdrexu/bugfix
932bb5cc Add reflection queries for thread local size and ssbo auto-binding
3e783f9b SPV: Unexpected declarations of capabilities from NV extensions.
2fbe08c7 Merge pull request #725 from steve-lunarg/structurebuffer
5da1f038 HLSL: implement 4 (of 6) structuredbuffer types
c8aed915 Merge pull request #732 from dneto0/fix-overrides
4c64a40d Add override where needed by clang++
8f674e82 Fix issue #676: emit error message on failure to open spv file.
0302bdf0 SPV: Fix #723: construct vectors from matrices.
36852b83 Merge pull request #727 from jekstrand/image-load-formatted
f2b27603 Merge pull request #729 from gwihlidal/master
f44d89a3 Implement GL_EXT_shader_image_load_formatted
6f332f3a Warning fixes
005120cc HLSL - Support for SV_GroupIndex
b0cfcb5c Merge pull request #1 from KhronosGroup/master
b0561d93 Merge pull request #720 from flaviobortot/master
54f3ab7d Merge pull request #728 from MaciejJesionowskiAMD/fix-mismatched-subgroup-vote-string
5227b6de Fix mismatched doc string for SPV_KHR_subgroup_vote
d9502833 Merge pull request #724 from chaoc/master
15017db9 Removed tabs and replaced with spaces. Changed layout for "else if"
df3956c5 Implement NVX_multiview_per_view_attributes
8bb3ee53 added semantic handling and support for remapping variables with semantics
7225a1cb Support align/offset for all versions GLSL/ESSL targeting SPIR-V.
e4e8f7b7 Merge pull request #722 from steve-lunarg/tessellation
9a2733a9 PP, nonfunctional: Properly encapsulate a TokenStream.
858c928a Add basic HS/DS implementation.
b49bb2ca PP, nonfunctional: Remove crufty bit-twiddling of tokens.
8e711b84 Fix issue #708: token pasting within macro argument expansion.
07939886 Merge pull request #707 from KhronosGroup/emit-opSelect
f8d0d8c2 Address issue #718. Should change which warning is generated, hopefully to a better one.
8e6c6cef SPV: Implement specialization constants for ?:.
433e9ff8 SPV: Emit OpSelect when a selection node is simple enough.
509177d1 Merge pull request #685 from KhronosGroup/wrap-entry-point
dd40260b HLSL: don't do a deepCopy() for typedef, as we still want to share the type graph.
65ee230f HLSL: Add tests and refine what decorations are passed through per stage/in/out.
bf47286f HLSL: Move to fine-grained control for defining input/output/uniform IO types.
727b374f HLSL: Build IO types bottom up, as parsed, and cache the original (IO).
88c4464d HLSL: Have loose uniforms also go through the makeTypeNonIo() path.
2c5ab9c8 HLSL: remove pervertex output blocks
fbb58a4e Build: Fix Linux for older compiler: Use TMap instead of TUndorderedMap.
ec712ebe HLSL: fix copies between arrays of structs of builtins, and arrayed builtins.
abd8dca8 HLSL: Make the entry-point shadow function have non-IO params and return.
5d3023af HLSL: Type sanitization: create non-IO types for var decl and fn param/ret
0fe106af AST: Have type deepCopy() preserve type graphs as graphs.
02467d8d HLSL: Wrap the entry-point; need to write 'in' args, and support 'inout' args.
aea3c890 Added --vn option to generate a C header file containing a variable assigned to the hex representation of the shader. This is a standard feature on Microsoft's HLSL compiler and it allows developers to include pre-compiled shaders directly into the code. This option enables "Hex output", so it is NOT required to specify -x as well. The output file name is preserved, so no ".h" extension is added. If you want the output file to have ".h" extension then you have to specify it on the output file name. The generated header file uses the "#pragma once" pragma to avoid multiple inclusions.
18adbdbb Resolve issue #700: allow initializers on struct members.
32fd5d26 Memory/constructor/warning clean-up. Addresses issue #705.
f1aeac89 Merge pull request #711 from eoma/fix-friendly-specialization-name
ad58d454 SPV: Emit names of specialization constants
7e134cdf Merge pull request #706 from Ralith/install-headers
5a074532 Install headers
62c3e400 Fix bug from PR #678: NV_EXTENSIONS deleted implicit array sizing.
82e0e589 Fix issue #693. Ternary operator on void type.
c0904c15 Merge pull request #690 from ligfx/proper_dependencies
2918a2ef README: point to HLSL status issues
24ed24dd Merge pull request #702 from resetnow/master
689490fd SpvBuilder: add const specifier to vector reference arguments
72754864 Merge pull request #694 from mtavenrath/fix_origin_link
7b89e752 Use correct OriginUpperLeft when linking more than one shader.
047a6a49 Merge pull request #696 from amdrexu/bugfix2
ab9e5e9f Merge pull request #695 from amdrexu/bugfix
00d54b44 Semantics: Texture clamp functions are available for fragment shader only.
c708f980 Fix a CMakeLists issue
2043da90 Merge pull request #692 from hrydgard/no-nvextensions-build-fix
bec5fc89 Fix build if NV_EXTENSIONS is not set
64b010f3 Merge pull request #678 from chaoc/stereo_view_rendering
6077a19b CMake: add target_link_libraries internally
771d89fc support SPV_NV_viewport_array2 and SPV_NV_stereo_view_rendering
52fceb08 Merge pull request #689 from mikew-lunarg/master
4e9e400e Fix for not-handled-in-switch warnings
c37f8d6b Merge pull request #683 from rdb/master
a2f0e0e7 Fix compilation with MSVC 2010
22f25d80 Merge pull request #682 from steve-lunarg/split-copy-fix
d3aea5ed Merge pull request #679 from ashwinkolhe/akolhe_spv_khr_subgroup_vote
7dccb151 SPV: Merge pull request #675 from amdrexu/feature
e48b8d74 Infrastructure: remove potential memory leaks.
65cdff9a HLSL: fix dereferencing when copying split structures with arrays
430ef40a Implement new revision of extension GL_AMD_shader_ballot
94dfb7a5 Non-functional: Factor out entry-point logic from handleFunctionDefinition().
c720f3e6 Implement SPV_KHR_subgroup_vote
33dadd12 Fix build break for non-VS.
44251539 Non-functional: Fix round of compiler warnings.
c142c889 Front-ends: Non-functional: Rationalize vector and matrix swizzles.
0a76a187 Merge pull request #656 from TiemoJung/overload_fix
fdf6347f HLSL: Add EOpMatrixSwizzle, selectively decomposed to other ops, for issue #670.
001dfa1c HLSL: matrix swizzle (_12, _m23) syntax, partial semantics.
913e3b68 PP: Clean up and rationalize floating-point-number scanner.
e86fc094 Merge pull request #664 from steve-lunarg/stage-io-fix
dc1a8196 Infrastructure: Support standard build with ENABLE_HLSL set to off.
65d538c8 Infrastructure: Protect against missing built-in symbol table generators.
ce80197c Merge pull request #663 from KhronosGroup/full-include-semantics
eaecfe71 Merge pull request #668 from slime73/DisableHLSL
ff21a25b Change disabled-by-default DISABLE_HLSL option to enabled-by-default ENABLE_HLSL.
46d54284 WIP: add other builtins to interstage IO
84eabf7e Add a CMake option to disable compilation of HLSL input support.
5d89d4d4 Merge pull request #667 from slime73/Compiler-Warnings
5f316d9b Reorder initializer fields to match variable declaration order (or vice versa) for several class constructors.
844dd45d Add a virtual destructor to a class which has virtual methods.
7d39ad58 Mark an overriden method in a subclass with ‘override’.
facde2c8 PP #include: address PR feedback.
63204c25 External interface change: PP: Full <> and "" semantics for the Includer.
25086025 PP #include non-functional: consistent notation for "header" and "header name".
927608b3 Non-functional: White space after "//", mostly for copyrights.
ecba76fe Non-Functional: Whitespace, comments, replace accidentally deleted comment.
3dd32293 Merge pull request #661 from KhronosGroup/fix-include-error-paths
1b1defd6 PP: #include: simplify the different paths out of #include.
28d31335 PP: #include: add names to error messages, so that lexical analysis can be tested.
64285c9e Non-functional: Very minor clean up.
acb9076a Merge pull request #650 from steve-lunarg/lvalue-swizzle-fix
085b8334 HLSL: Fix issue #658: Don't adopt initializer constness from declaration.
bf9a2f30 Merge pull request #648 from steve-lunarg/type-identifiers
ddfbbe26 Merge pull request #632 from steve-lunarg/structure-splitting
5abd308e Merge pull request #659 from steve-lunarg/d3dcolortoubyte4
c4ed9500 Merge pull request #647 from steve-lunarg/default-fn-params
7ea7ff4c Add EOpD3DCOLORtoUBYTE4 decomposition
affc2667 PP: Recognize <> style #include header names. I.e., #include <header-name>.
cd6829ba HLSL: allow destination swizzles when writing RWTexture/RWBuffer objects.
faa720f1 PP: Fix issue #426, recover from bad-source macro expansion.
bc5196c0 SPV: Fix issue #369, don't support gl_NumSamples -> SPIR-V.
f37f4d23 HLSL: Fix issue #646: map SV_DispatchThreadID -> GlobalInvocationID.
84e59203 updates overload handling to be more careful when allowing overloads over texture types
aa6d5629 HLSL: Handle const with no initializer. Fixes issue #651.
53864846 HLSL: Support empty {} initializers for arrays and scalars.
26d31453 HLSL default function parameters
5ca85ad9 HLSL: allow scalar type keywords as identifiers, and add half type support.
132d3318 HLSL: struct splitting: assignments of hierarchical split types
a2e75310 HLSL: inter-stage structure splitting.
807a0d9e Merge pull request #640 from chaoc/modify-shader-ballot
f48faec3 PP: Non-functional: Make a proper class out of the atom <-> string mapping.
f200da86 Modify shader ballot extension by adding OpSubgroupReadInvocationKHR
224b1f73 PP: Support operator creation with token pasting.
0c4b7c93 PP: Rationalize names of tokens.
2dcdda92 Merge pull request #641 from chaoc/passthrough
906b0a3e Merge pull request #644 from hrydgard/override-warning-fixes
9a931b39 Fix a large number of warnings about inconsistent usage of 'override' produced by clang
907aabb6 PP: Non-functional: Only use string <-> atom mapping when needed.
54af2de7 PP: Non-functional: rationalize TPpToken.
1fbb9c14 PP: Non-functional: clean up, simplify, completely identical operation.
6e5acae1 Add support for SPV_NV_geometry_shader_passthrough
3c264ce8 Merge pull request #639 from hrydgard/master
7a21a115 Merge pull request #638 from chaoc/master
b8387c87 PP: Non-functional: Remove custom allocator and related improvements.
868746ad Add option to make it possible not to build the executables
bfff871d PP: Add missing i64val code.
0ad6a4e6 Add support for SPV_NV_sample_mask_override_coverage
7583ed73 Merge remote-tracking branch 'refs/remotes/KhronosGroup/master'
432576fd Build: Fix #633, add missing overrides.
0955b1cb Merge pull request #637 from KhronosGroup/token-paste
e6cbc5b1 Merge pull request #624 from steve-lunarg/remapper-strip-removed
4ba444b6 Merge pull request #635 from steve-lunarg/sample-fix-2
059d46ee Merge pull request #625 from jbeich/gcc6
d485e0b7 PP: Implement token pasting for PP identifiers.
a64ed3eb HLSL: allow "sample" in expressions.
abf50579 Fix comment typo.
1e275c84 HLSL: More robust handling of bad shader input, catching a few more things.
dca93d6b Merge pull request #629 from null77/fix-unicode
cebd97eb Change unicode dash to ASCII.
95abd284 Merge pull request #628 from null77/fix-cast-warn
3ec327c5 Fix size_t to int cast warnings.
20f01e7f Fix last commit; EOptionKeepUncalled incorrect enum bug.
297754cf Remapper: remove debug info for IDs stripped in other passes
906cc218 Linker: Eliminate uncalled functions, because they can be ill-defined.
bf6d7f43 Linker: Track the mangled entry-point name along with the non-mangled one.
4b6ce415 GLSL Linker: Track entry point across compilation units.
1bcb254a Add missing header and drop duplicate one
6a60c2f9 Linker: Walk the call graph to report an error on missing bodies.
e795cc91 Merge pull request #621 from steve-lunarg/recursive-flattening
302e619e Merge pull request #619 from steve-lunarg/opcode-specific-promote
56b45476 Merge pull request #620 from fjhenigman/foo
a2b01a0d HLSL: Recursive composite flattening
05f75142 HLSL: opcode specific promotion rules for interlocked ops
8dcf2029 GLSL: Always define TShader::~Includer().
b56f4ac7 Merge pull request #615 from dneto0/consistent-location-for-test-files
9df6aa53 GLSL: Allow desktop shaders to call functions from outside main().
ec2e27ad Merge pull request #613 from Corillian/hlslpreprocess
5cc92c56 runtests should refer to test files in current directory
205dc4e4 Fixed processing #include's when preprocessing HLSL
fb06e955 Don't print the "Linked stage" message unless the AST is being dumped.
09512cbd Merge branch 'steve-lunarg-intrinsic-promotion'
21b11f4c Merge branch 'intrinsic-promotion' of https://github.com/steve-lunarg/glslang into steve-lunarg-intrinsic-promotion
41be1cbe Merge pull request #604 from steve-lunarg/entry-rename-2
f1e0c871 allow renaming of shader entry point when creating SPIR-V
ef33ec09 HLSL: add intrinsic function implicit promotions

Change-Id: I295258005685b14d53ddbc2d516cb7d69e9b20cd
Testing: checkbuild.py on Linux, unit tests on Windows
diff --git a/.appveyor.yml b/.appveyor.yml
index 4463fa6..55ce618 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -40,7 +40,7 @@
 
 build_script:
   - mkdir build && cd build
-  - cmake .. -DCMAKE_INSTALL_PREFIX=install
+  - cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=install ..
   - cmake --build . --config %CONFIGURATION% --target install
 
 test_script:
diff --git a/.gitattributes b/.gitattributes
old mode 100755
new mode 100644
diff --git a/.travis.yml b/.travis.yml
old mode 100755
new mode 100644
diff --git a/BUILD.gn b/BUILD.gn
new file mode 100644
index 0000000..91bb4bb
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,165 @@
+# Copyright (C) 2018 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import("//build_overrides/glslang.gni")
+
+spirv_tools_dir = glslang_spirv_tools_dir
+
+config("glslang_public") {
+  include_dirs = [ "." ]
+}
+
+source_set("glslang_sources") {
+  sources = [
+    "OGLCompilersDLL/InitializeDll.cpp",
+    "OGLCompilersDLL/InitializeDll.h",
+    "SPIRV/GLSL.ext.EXT.h",
+    "SPIRV/GLSL.ext.KHR.h",
+    "SPIRV/GLSL.std.450.h",
+    "SPIRV/GlslangToSpv.cpp",
+    "SPIRV/GlslangToSpv.h",
+    "SPIRV/InReadableOrder.cpp",
+    "SPIRV/Logger.cpp",
+    "SPIRV/Logger.h",
+    "SPIRV/SPVRemapper.cpp",
+    "SPIRV/SPVRemapper.h",
+    "SPIRV/SpvBuilder.cpp",
+    "SPIRV/SpvBuilder.h",
+    "SPIRV/SpvPostProcess.cpp",
+    "SPIRV/SpvPostProcess.h",
+    "SPIRV/bitutils.h",
+    "SPIRV/disassemble.cpp",
+    "SPIRV/disassemble.h",
+    "SPIRV/doc.cpp",
+    "SPIRV/doc.h",
+    "SPIRV/hex_float.h",
+    "SPIRV/spirv.hpp",
+    "SPIRV/spvIR.h",
+    "glslang/GenericCodeGen/CodeGen.cpp",
+    "glslang/GenericCodeGen/Link.cpp",
+    "glslang/Include/BaseTypes.h",
+    "glslang/Include/Common.h",
+    "glslang/Include/ConstantUnion.h",
+    "glslang/Include/InfoSink.h",
+    "glslang/Include/InitializeGlobals.h",
+    "glslang/Include/PoolAlloc.h",
+    "glslang/Include/ResourceLimits.h",
+    "glslang/Include/ShHandle.h",
+    "glslang/Include/Types.h",
+    "glslang/Include/arrays.h",
+    "glslang/Include/intermediate.h",
+    "glslang/Include/revision.h",
+    "glslang/MachineIndependent/Constant.cpp",
+    "glslang/MachineIndependent/InfoSink.cpp",
+    "glslang/MachineIndependent/Initialize.cpp",
+    "glslang/MachineIndependent/Initialize.h",
+    "glslang/MachineIndependent/IntermTraverse.cpp",
+    "glslang/MachineIndependent/Intermediate.cpp",
+    "glslang/MachineIndependent/LiveTraverser.h",
+    "glslang/MachineIndependent/ParseContextBase.cpp",
+    "glslang/MachineIndependent/ParseHelper.cpp",
+    "glslang/MachineIndependent/ParseHelper.h",
+    "glslang/MachineIndependent/PoolAlloc.cpp",
+    "glslang/MachineIndependent/RemoveTree.cpp",
+    "glslang/MachineIndependent/RemoveTree.h",
+    "glslang/MachineIndependent/Scan.cpp",
+    "glslang/MachineIndependent/Scan.h",
+    "glslang/MachineIndependent/ScanContext.h",
+    "glslang/MachineIndependent/ShaderLang.cpp",
+    "glslang/MachineIndependent/SymbolTable.cpp",
+    "glslang/MachineIndependent/SymbolTable.h",
+    "glslang/MachineIndependent/Versions.cpp",
+    "glslang/MachineIndependent/Versions.h",
+    "glslang/MachineIndependent/attribute.cpp",
+    "glslang/MachineIndependent/attribute.h",
+    "glslang/MachineIndependent/gl_types.h",
+    "glslang/MachineIndependent/glslang.y",
+    "glslang/MachineIndependent/glslang_tab.cpp",
+    "glslang/MachineIndependent/glslang_tab.cpp.h",
+    "glslang/MachineIndependent/intermOut.cpp",
+    "glslang/MachineIndependent/iomapper.cpp",
+    "glslang/MachineIndependent/iomapper.h",
+    "glslang/MachineIndependent/limits.cpp",
+    "glslang/MachineIndependent/linkValidate.cpp",
+    "glslang/MachineIndependent/localintermediate.h",
+    "glslang/MachineIndependent/parseConst.cpp",
+    "glslang/MachineIndependent/parseVersions.h",
+    "glslang/MachineIndependent/preprocessor/Pp.cpp",
+    "glslang/MachineIndependent/preprocessor/PpAtom.cpp",
+    "glslang/MachineIndependent/preprocessor/PpContext.cpp",
+    "glslang/MachineIndependent/preprocessor/PpContext.h",
+    "glslang/MachineIndependent/preprocessor/PpScanner.cpp",
+    "glslang/MachineIndependent/preprocessor/PpTokens.cpp",
+    "glslang/MachineIndependent/preprocessor/PpTokens.h",
+    "glslang/MachineIndependent/propagateNoContraction.cpp",
+    "glslang/MachineIndependent/propagateNoContraction.h",
+    "glslang/MachineIndependent/reflection.cpp",
+    "glslang/MachineIndependent/reflection.h",
+    "glslang/OSDependent/osinclude.h",
+    "glslang/Public/ShaderLang.h",
+  ]
+
+  defines = []
+  if (is_win) {
+    sources += [ "glslang/OSDependent/Windows/ossource.cpp" ]
+    defines += [ "GLSLANG_OSINCLUDE_WIN32" ]
+  } else {
+    sources += [ "glslang/OSDependent/Unix/ossource.cpp" ]
+    defines += [ "GLSLANG_OSINCLUDE_UNIX" ]
+  }
+
+  if (is_clang) {
+    cflags_cc = [
+      "-Wno-implicit-fallthrough",
+      "-Wno-ignored-qualifiers",
+      "-Wno-unused-variable",
+    ]
+  }
+
+  deps = [
+    "${spirv_tools_dir}:spvtools_opt",
+  ]
+}
+
+static_library("glslang_static") {
+  public_configs = [ ":glslang_public" ]
+
+  deps = [
+    ":glslang_sources",
+  ]
+  complete_static_lib = true
+
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [ "//build/config/compiler:no_chromium_code" ]
+}
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a869c2..a4d7bcd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,6 +21,7 @@
 if(NOT ${SKIP_GLSLANG_INSTALL})
   set(ENABLE_GLSLANG_INSTALL ON)
 endif()
+option(ENABLE_SPVREMAPPER "Enables building of SPVRemapper" ON)
 
 option(ENABLE_AMD_EXTENSIONS "Enables support of AMD-specific extensions" ON)
 option(ENABLE_GLSLANG_BINARIES "Builds glslangValidator and spirv-remap" ON)
@@ -35,6 +36,14 @@
     set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "..." FORCE)
 endif()
 
+option(USE_CCACHE "Use ccache" OFF)
+if(USE_CCACHE)
+    find_program(CCACHE_FOUND ccache)
+    if(CCACHE_FOUND)
+        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+    endif(CCACHE_FOUND)
+endif()
+
 project(glslang)
 # make testing optional
 include(CTest)
@@ -52,7 +61,7 @@
 endif(ENABLE_HLSL)
 
 if(WIN32)
-    set(CMAKE_DEBUG_POSTFIX "d")
+    set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Adds a postfix for debug-built libraries.")
     if(MSVC)
         include(ChooseMSVCCRT.cmake)
     endif(MSVC)
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index 402b4d6..544081d
--- a/README.md
+++ b/README.md
@@ -105,8 +105,8 @@
 For building on Linux:
 
 ```bash
-cmake -DCMAKE_BUILD_TYPE={Debug|Release|RelWithDebInfo} \
-      -DCMAKE_INSTALL_PREFIX="$(pwd)/install" $SOURCE_DIR
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" $SOURCE_DIR
+# "Release" (for CMAKE_BUILD_TYPE) could also be "Debug" or "RelWithDebInfo"
 ```
 
 For building on Windows:
@@ -125,8 +125,8 @@
 make -j4 install
 
 # for Windows:
-cmake --build . --config {Release|Debug|MinSizeRel|RelWithDebInfo} \
-      --target install
+cmake --build . --config Release --target install
+# "Release" (for --config) could also be "Debug", "MinSizeRel", or "RelWithDebInfo"
 ```
 
 If using MSVC, after running CMake to configure, use the
diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
old mode 100755
new mode 100644
index bf2be16..1997e74
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -3,7 +3,9 @@
     InReadableOrder.cpp
     Logger.cpp
     SpvBuilder.cpp
+    SpvPostProcess.cpp
     doc.cpp
+    SpvTools.cpp
     disassemble.cpp)
 
 set(SPVREMAP_SOURCES
@@ -22,6 +24,7 @@
     SpvBuilder.h
     spvIR.h
     doc.h
+    SpvTools.h
     disassemble.h)
 
 set(SPVREMAP_HEADERS
@@ -45,13 +48,17 @@
 set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_include_directories(SPIRV PUBLIC ..)
 
-add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
-set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
-set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
+if (ENABLE_SPVREMAPPER)
+    add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
+    set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
+    set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
+endif()
 
 if(WIN32 AND BUILD_SHARED_LIBS)
     set_target_properties(SPIRV PROPERTIES PREFIX "")
-    set_target_properties(SPVRemapper PROPERTIES PREFIX "")
+    if (ENABLE_SPVREMAPPER)
+        set_target_properties(SPVRemapper PROPERTIES PREFIX "")
+    endif()
 endif()
 
 if(ENABLE_OPT)
@@ -72,11 +79,20 @@
 
 if(ENABLE_GLSLANG_INSTALL)
     if(BUILD_SHARED_LIBS)
-        install(TARGETS SPIRV SPVRemapper
+        if (ENABLE_SPVREMAPPER)
+            install(TARGETS SPVRemapper
+                    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+        endif()
+        install(TARGETS SPIRV
                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
                 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
     else()
-        install(TARGETS SPIRV SPVRemapper
+        if (ENABLE_SPVREMAPPER)
+            install(TARGETS SPVRemapper
+                    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+        endif()
+        install(TARGETS SPIRV
                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
     endif()
 
diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h
old mode 100755
new mode 100644
index ec0c06d..16b0d9c
--- a/SPIRV/GLSL.ext.KHR.h
+++ b/SPIRV/GLSL.ext.KHR.h
@@ -39,5 +39,6 @@
 static const char* const E_SPV_KHR_8bit_storage                 = "SPV_KHR_8bit_storage";
 static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
 static const char* const E_SPV_KHR_post_depth_coverage          = "SPV_KHR_post_depth_coverage";
+static const char* const E_SPV_KHR_vulkan_memory_model          = "SPV_KHR_vulkan_memory_model";
 
 #endif  // #ifndef GLSLextKHR_H
diff --git a/SPIRV/GLSL.ext.NV.h b/SPIRV/GLSL.ext.NV.h
index 148d4b4..6abc469 100644
--- a/SPIRV/GLSL.ext.NV.h
+++ b/SPIRV/GLSL.ext.NV.h
@@ -33,7 +33,7 @@
 enum Capability;
 
 static const int GLSLextNVVersion = 100;
-static const int GLSLextNVRevision = 5;
+static const int GLSLextNVRevision = 11;
 
 //SPV_NV_sample_mask_override_coverage
 const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
@@ -54,4 +54,22 @@
 //SPV_NV_shader_subgroup_partitioned
 const char* const E_SPV_NV_shader_subgroup_partitioned = "SPV_NV_shader_subgroup_partitioned";
 
-#endif  // #ifndef GLSLextNV_H
\ No newline at end of file
+//SPV_NV_fragment_shader_barycentric
+const char* const E_SPV_NV_fragment_shader_barycentric = "SPV_NV_fragment_shader_barycentric";
+
+//SPV_NV_compute_shader_derivatives
+const char* const E_SPV_NV_compute_shader_derivatives = "SPV_NV_compute_shader_derivatives";
+
+//SPV_NV_shader_image_footprint
+const char* const E_SPV_NV_shader_image_footprint = "SPV_NV_shader_image_footprint";
+
+//SPV_NV_mesh_shader
+const char* const E_SPV_NV_mesh_shader = "SPV_NV_mesh_shader";
+
+//SPV_NVX_raytracing
+const char* const E_SPV_NVX_raytracing = "SPV_NVX_raytracing";
+
+//SPV_NV_shading_rate
+const char* const E_SPV_NV_shading_rate = "SPV_NV_shading_rate";
+
+#endif  // #ifndef GLSLextNV_H
diff --git a/SPIRV/GLSL.std.450.h b/SPIRV/GLSL.std.450.h
old mode 100755
new mode 100644
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index d5fb1ac..f0040b8 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -54,15 +54,6 @@
 #endif
 }
 
-#if ENABLE_OPT
-    #include "spirv-tools/optimizer.hpp"
-    #include "message.h"
-#endif
-
-#if ENABLE_OPT
-using namespace spvtools;
-#endif
-
 // Glslang includes
 #include "../glslang/MachineIndependent/localintermediate.h"
 #include "../glslang/MachineIndependent/SymbolTable.h"
@@ -138,6 +129,10 @@
     spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateNonUniformDecoration(const glslang::TQualifier& qualifier);
+    spv::Builder::AccessChain::CoherentFlags TranslateCoherent(const glslang::TType& type);
+    spv::MemoryAccessMask TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
+    spv::ImageOperandsMask TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
+    spv::Scope TranslateMemoryScope(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
     spv::BuiltIn TranslateBuiltInDecoration(glslang::TBuiltInVariable, bool memberDeclaration);
     spv::ImageFormat TranslateImageFormat(const glslang::TType& type);
     spv::SelectionControlMask TranslateSelectionControl(const glslang::TIntermSelection&) const;
@@ -199,6 +194,9 @@
     spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId);
     spv::Id getSymbolId(const glslang::TIntermSymbol* node);
+#ifdef NV_EXTENSIONS
+    void addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier & qualifier);
+#endif
     spv::Id createSpvConstant(const glslang::TIntermTyped&);
     spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&, int& nextConst, bool specConstant);
     bool isTrivialLeaf(const glslang::TIntermTyped* node);
@@ -277,6 +275,16 @@
     case EShLangGeometry:         return spv::ExecutionModelGeometry;
     case EShLangFragment:         return spv::ExecutionModelFragment;
     case EShLangCompute:          return spv::ExecutionModelGLCompute;
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:         return spv::ExecutionModelRayGenerationNVX;
+    case EShLangIntersectNV:      return spv::ExecutionModelIntersectionNVX;
+    case EShLangAnyHitNV:         return spv::ExecutionModelAnyHitNVX;
+    case EShLangClosestHitNV:     return spv::ExecutionModelClosestHitNVX;
+    case EShLangMissNV:           return spv::ExecutionModelMissNVX;
+    case EShLangCallableNV:       return spv::ExecutionModelCallableNVX;
+    case EShLangTaskNV:           return spv::ExecutionModelTaskNV;
+    case EShLangMeshNV:           return spv::ExecutionModelMeshNV;
+#endif
     default:
         assert(0);
         return spv::ExecutionModelFragment;
@@ -326,6 +334,11 @@
         case glslang::EvqBuffer:       return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock;
         case glslang::EvqVaryingIn:    return spv::DecorationBlock;
         case glslang::EvqVaryingOut:   return spv::DecorationBlock;
+#ifdef NV_EXTENSIONS
+        case glslang::EvqPayloadNV:    return spv::DecorationBlock;
+        case glslang::EvqPayloadInNV:  return spv::DecorationBlock;
+        case glslang::EvqHitAttrNV:    return spv::DecorationBlock;
+#endif
         default:
             assert(0);
             break;
@@ -336,13 +349,15 @@
 }
 
 // Translate glslang type to SPIR-V memory decorations.
-void TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector<spv::Decoration>& memory)
+void TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector<spv::Decoration>& memory, bool useVulkanMemoryModel)
 {
-    if (qualifier.coherent)
-        memory.push_back(spv::DecorationCoherent);
-    if (qualifier.volatil) {
-        memory.push_back(spv::DecorationVolatile);
-        memory.push_back(spv::DecorationCoherent);
+    if (!useVulkanMemoryModel) {
+        if (qualifier.coherent)
+            memory.push_back(spv::DecorationCoherent);
+        if (qualifier.volatil) {
+            memory.push_back(spv::DecorationVolatile);
+            memory.push_back(spv::DecorationCoherent);
+        }
     }
     if (qualifier.restrict)
         memory.push_back(spv::DecorationRestrict);
@@ -382,8 +397,22 @@
                 }
             case glslang::EvqVaryingIn:
             case glslang::EvqVaryingOut:
-                assert(type.getQualifier().layoutPacking == glslang::ElpNone);
+                if (type.getQualifier().isTaskMemory()) {
+                    switch (type.getQualifier().layoutPacking) {
+                    case glslang::ElpShared:  return spv::DecorationGLSLShared;
+                    case glslang::ElpPacked:  return spv::DecorationGLSLPacked;
+                    default: break;
+                    }
+                } else {
+                    assert(type.getQualifier().layoutPacking == glslang::ElpNone);
+                }
                 return spv::DecorationMax;
+#ifdef NV_EXTENSIONS
+            case glslang::EvqPayloadNV:
+            case glslang::EvqPayloadInNV:
+            case glslang::EvqHitAttrNV:
+                return spv::DecorationMax;
+#endif
             default:
                 assert(0);
                 return spv::DecorationMax;
@@ -459,6 +488,105 @@
         return spv::DecorationMax;
 }
 
+spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
+{
+    if (!glslangIntermediate->usingVulkanMemoryModel() || coherentFlags.isImage) {
+        return spv::MemoryAccessMaskNone;
+    }
+    spv::MemoryAccessMask mask = spv::MemoryAccessMaskNone;
+    if (coherentFlags.volatil ||
+        coherentFlags.coherent ||
+        coherentFlags.devicecoherent ||
+        coherentFlags.queuefamilycoherent ||
+        coherentFlags.workgroupcoherent ||
+        coherentFlags.subgroupcoherent) {
+        mask = mask | spv::MemoryAccessMakePointerAvailableKHRMask |
+                      spv::MemoryAccessMakePointerVisibleKHRMask;
+    }
+    if (coherentFlags.nonprivate) {
+        mask = mask | spv::MemoryAccessNonPrivatePointerKHRMask;
+    }
+    if (coherentFlags.volatil) {
+        mask = mask | spv::MemoryAccessVolatileMask;
+    }
+    if (mask != spv::MemoryAccessMaskNone) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
+    return mask;
+}
+
+spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
+{
+    if (!glslangIntermediate->usingVulkanMemoryModel()) {
+        return spv::ImageOperandsMaskNone;
+    }
+    spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
+    if (coherentFlags.volatil ||
+        coherentFlags.coherent ||
+        coherentFlags.devicecoherent ||
+        coherentFlags.queuefamilycoherent ||
+        coherentFlags.workgroupcoherent ||
+        coherentFlags.subgroupcoherent) {
+        mask = mask | spv::ImageOperandsMakeTexelAvailableKHRMask |
+                      spv::ImageOperandsMakeTexelVisibleKHRMask;
+    }
+    if (coherentFlags.nonprivate) {
+        mask = mask | spv::ImageOperandsNonPrivateTexelKHRMask;
+    }
+    if (coherentFlags.volatil) {
+        mask = mask | spv::ImageOperandsVolatileTexelKHRMask;
+    }
+    if (mask != spv::ImageOperandsMaskNone) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
+    return mask;
+}
+
+spv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCoherent(const glslang::TType& type)
+{
+    spv::Builder::AccessChain::CoherentFlags flags;
+    flags.coherent = type.getQualifier().coherent;
+    flags.devicecoherent = type.getQualifier().devicecoherent;
+    flags.queuefamilycoherent = type.getQualifier().queuefamilycoherent;
+    // shared variables are implicitly workgroupcoherent in GLSL.
+    flags.workgroupcoherent = type.getQualifier().workgroupcoherent ||
+                              type.getQualifier().storage == glslang::EvqShared;
+    flags.subgroupcoherent = type.getQualifier().subgroupcoherent;
+    // *coherent variables are implicitly nonprivate in GLSL
+    flags.nonprivate = type.getQualifier().nonprivate ||
+                       type.getQualifier().subgroupcoherent ||
+                       type.getQualifier().workgroupcoherent ||
+                       type.getQualifier().queuefamilycoherent ||
+                       type.getQualifier().devicecoherent ||
+                       type.getQualifier().coherent;
+    flags.volatil = type.getQualifier().volatil;
+    flags.isImage = type.getBasicType() == glslang::EbtSampler;
+    return flags;
+}
+
+spv::Scope TGlslangToSpvTraverser::TranslateMemoryScope(const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
+{
+    spv::Scope scope;
+    if (coherentFlags.coherent) {
+        // coherent defaults to Device scope in the old model, QueueFamilyKHR scope in the new model
+        scope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice;
+    } else if (coherentFlags.devicecoherent) {
+        scope = spv::ScopeDevice;
+    } else if (coherentFlags.queuefamilycoherent) {
+        scope = spv::ScopeQueueFamilyKHR;
+    } else if (coherentFlags.workgroupcoherent) {
+        scope = spv::ScopeWorkgroup;
+    } else if (coherentFlags.subgroupcoherent) {
+        scope = spv::ScopeSubgroup;
+    } else {
+        scope = spv::ScopeMax;
+    }
+    if (glslangIntermediate->usingVulkanMemoryModel() && scope == spv::ScopeDevice) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+    }
+    return scope;
+}
+
 // Translate a glslang built-in variable to a SPIR-V built in decoration.  Also generate
 // associated capabilities when required.  For some built-in variables, a capability
 // is generated only when using the variable in an executable instruction, but not when
@@ -523,6 +651,11 @@
         return spv::BuiltInSampleMask;
 
     case glslang::EbvLayer:
+#ifdef NV_EXTENSIONS
+        if (glslangIntermediate->getStage() == EShLangMeshNV) {
+            return spv::BuiltInLayer;
+        }
+#endif
         builder.addCapability(spv::CapabilityGeometry);
         if (glslangIntermediate->getStage() == EShLangVertex ||
             glslangIntermediate->getStage() == EShLangTessControl ||
@@ -731,6 +864,66 @@
         builder.addExtension(spv::E_SPV_EXT_fragment_fully_covered);
         builder.addCapability(spv::CapabilityFragmentFullyCoveredEXT);
         return spv::BuiltInFullyCoveredEXT;
+    case glslang::EbvFragmentSizeNV:
+        builder.addExtension(spv::E_SPV_NV_shading_rate);
+        builder.addCapability(spv::CapabilityShadingRateNV);
+        return spv::BuiltInFragmentSizeNV;
+    case glslang::EbvInvocationsPerPixelNV:
+        builder.addExtension(spv::E_SPV_NV_shading_rate);
+        builder.addCapability(spv::CapabilityShadingRateNV);
+        return spv::BuiltInInvocationsPerPixelNV;
+
+    // raytracing
+    case glslang::EbvLaunchIdNV:
+        return spv::BuiltInLaunchIdNVX;
+    case glslang::EbvLaunchSizeNV:
+        return spv::BuiltInLaunchSizeNVX;
+    case glslang::EbvWorldRayOriginNV:
+        return spv::BuiltInWorldRayOriginNVX;
+    case glslang::EbvWorldRayDirectionNV:
+        return spv::BuiltInWorldRayDirectionNVX;
+    case glslang::EbvObjectRayOriginNV:
+        return spv::BuiltInObjectRayOriginNVX;
+    case glslang::EbvObjectRayDirectionNV:
+        return spv::BuiltInObjectRayDirectionNVX;
+    case glslang::EbvRayTminNV:
+        return spv::BuiltInRayTminNVX;
+    case glslang::EbvRayTmaxNV:
+        return spv::BuiltInRayTmaxNVX;
+    case glslang::EbvInstanceCustomIndexNV:
+        return spv::BuiltInInstanceCustomIndexNVX;
+    case glslang::EbvHitTNV:
+        return spv::BuiltInHitTNVX;
+    case glslang::EbvHitKindNV:
+        return spv::BuiltInHitKindNVX;
+    case glslang::EbvObjectToWorldNV:
+        return spv::BuiltInObjectToWorldNVX;
+    case glslang::EbvWorldToObjectNV:
+        return spv::BuiltInWorldToObjectNVX;
+    case glslang::EbvBaryCoordNV:
+        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);
+        builder.addCapability(spv::CapabilityFragmentBarycentricNV);
+        return spv::BuiltInBaryCoordNV;
+    case glslang::EbvBaryCoordNoPerspNV:
+        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);
+        builder.addCapability(spv::CapabilityFragmentBarycentricNV);
+        return spv::BuiltInBaryCoordNoPerspNV;
+     case glslang::EbvTaskCountNV:
+        return spv::BuiltInTaskCountNV;
+     case glslang::EbvPrimitiveCountNV:
+        return spv::BuiltInPrimitiveCountNV;
+     case glslang::EbvPrimitiveIndicesNV:
+        return spv::BuiltInPrimitiveIndicesNV;
+     case glslang::EbvClipDistancePerViewNV:
+        return spv::BuiltInClipDistancePerViewNV;
+     case glslang::EbvCullDistancePerViewNV:
+        return spv::BuiltInCullDistancePerViewNV;
+     case glslang::EbvLayerPerViewNV:
+        return spv::BuiltInLayerPerViewNV;
+     case glslang::EbvMeshViewCountNV:
+        return spv::BuiltInMeshViewCountNV;
+     case glslang::EbvMeshViewIndicesNV:
+        return spv::BuiltInMeshViewIndicesNV;
 #endif 
     default:
         return spv::BuiltInMax;
@@ -887,6 +1080,10 @@
     if (type.getQualifier().isUniformOrBuffer()) {
         if (type.getQualifier().layoutPushConstant)
             return spv::StorageClassPushConstant;
+#ifdef NV_EXTENSIONS
+        if (type.getQualifier().layoutShaderRecordNV)
+            return spv::StorageClassShaderRecordBufferNVX;
+#endif
         if (type.getBasicType() == glslang::EbtBlock)
             return spv::StorageClassUniform;
         return spv::StorageClassUniformConstant;
@@ -897,6 +1094,11 @@
     case glslang::EvqGlobal:        return spv::StorageClassPrivate;
     case glslang::EvqConstReadOnly: return spv::StorageClassFunction;
     case glslang::EvqTemporary:     return spv::StorageClassFunction;
+#ifdef NV_EXTENSIONS
+    case glslang::EvqPayloadNV:     return spv::StorageClassRayPayloadNVX;
+    case glslang::EvqPayloadInNV:   return spv::StorageClassIncomingRayPayloadNVX;
+    case glslang::EvqHitAttrNV:     return spv::StorageClassHitAttributeNVX;
+#endif
     default:
         assert(0);
         break;
@@ -911,6 +1113,7 @@
 {
     if (indexType.getQualifier().isNonUniform()) {
         // deal with an asserted non-uniform index
+        // SPV_EXT_descriptor_indexing already added in TranslateNonUniformDecoration
         if (baseType.getBasicType() == glslang::EbtSampler) {
             if (baseType.getQualifier().hasAttachment())
                 builder.addCapability(spv::CapabilityInputAttachmentArrayNonUniformIndexingEXT);
@@ -931,12 +1134,16 @@
     } else {
         // assume a dynamically uniform index
         if (baseType.getBasicType() == glslang::EbtSampler) {
-            if (baseType.getQualifier().hasAttachment())
+            if (baseType.getQualifier().hasAttachment()) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
                 builder.addCapability(spv::CapabilityInputAttachmentArrayDynamicIndexingEXT);
-            else if (baseType.isImage() && baseType.getSampler().dim == glslang::EsdBuffer)
+            } else if (baseType.isImage() && baseType.getSampler().dim == glslang::EsdBuffer) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
                 builder.addCapability(spv::CapabilityStorageTexelBufferArrayDynamicIndexingEXT);
-            else if (baseType.isTexture() && baseType.getSampler().dim == glslang::EsdBuffer)
+            } else if (baseType.isTexture() && baseType.getSampler().dim == glslang::EsdBuffer) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
                 builder.addCapability(spv::CapabilityUniformTexelBufferArrayDynamicIndexingEXT);
+            }
         }
     }
 }
@@ -947,7 +1154,11 @@
 {
     // uniform and buffer blocks are included, unless it is a push_constant
     if (type.getBasicType() == glslang::EbtBlock)
-        return type.getQualifier().isUniformOrBuffer() && ! type.getQualifier().layoutPushConstant;
+        return type.getQualifier().isUniformOrBuffer() &&
+#ifdef NV_EXTENSIONS
+        ! type.getQualifier().layoutShaderRecordNV &&
+#endif
+        ! type.getQualifier().layoutPushConstant;
 
     // non block...
     // basically samplerXXX/subpass/sampler/texture are all included
@@ -983,6 +1194,16 @@
         child.sample = true;
     if (parent.coherent)
         child.coherent = true;
+    if (parent.devicecoherent)
+        child.devicecoherent = true;
+    if (parent.queuefamilycoherent)
+        child.queuefamilycoherent = true;
+    if (parent.workgroupcoherent)
+        child.workgroupcoherent = true;
+    if (parent.subgroupcoherent)
+        child.subgroupcoherent = true;
+    if (parent.nonprivate)
+        child.nonprivate = true;
     if (parent.volatil)
         child.volatil = true;
     if (parent.restrict)
@@ -991,6 +1212,14 @@
         child.readonly = true;
     if (parent.writeonly)
         child.writeonly = true;
+#ifdef NV_EXTENSIONS
+    if (parent.perPrimitiveNV)
+        child.perPrimitiveNV = true;
+    if (parent.perViewNV)
+        child.perViewNV = true;
+    if (parent.perTaskNV)
+        child.perTaskNV = true;
+#endif
 }
 
 bool HasNonLayoutQualifiers(const glslang::TType& type, const glslang::TQualifier& qualifier)
@@ -1049,7 +1278,12 @@
         builder.setSourceText(text);
     }
     stdBuiltins = builder.import("GLSL.std.450");
-    builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);
+    if (glslangIntermediate->usingVulkanMemoryModel()) {
+        builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelVulkanKHR);
+        builder.addExtension(spv::E_SPV_KHR_vulkan_memory_model);
+    } else {
+        builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);
+    }
     shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str());
     entryPoint = builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str());
 
@@ -1176,8 +1410,52 @@
         builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
                                                                            glslangIntermediate->getLocalSize(1),
                                                                            glslangIntermediate->getLocalSize(2));
+#ifdef NV_EXTENSIONS
+        if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) {
+            builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV);
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV);
+            builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives);
+        } else if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupLinear) {
+            builder.addCapability(spv::CapabilityComputeDerivativeGroupLinearNV);
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupLinearNV);
+            builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives);
+        }
+#endif
         break;
 
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:
+    case EShLangIntersectNV:
+    case EShLangAnyHitNV:
+    case EShLangClosestHitNV:
+    case EShLangMissNV:
+    case EShLangCallableNV:
+        builder.addCapability(spv::CapabilityRaytracingNVX);
+        builder.addExtension("SPV_NVX_raytracing");
+        break;
+    case EShLangTaskNV:
+    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->getStage() == EShLangMeshNV) {
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices, glslangIntermediate->getVertices());
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputPrimitivesNV, glslangIntermediate->getPrimitives());
+
+            switch (glslangIntermediate->getOutputPrimitive()) {
+            case glslang::ElgPoints:        mode = spv::ExecutionModeOutputPoints;      break;
+            case glslang::ElgLines:         mode = spv::ExecutionModeOutputLinesNV;     break;
+            case glslang::ElgTriangles:     mode = spv::ExecutionModeOutputTrianglesNV; break;
+            default:                        mode = spv::ExecutionModeMax;               break;
+            }
+            if (mode != spv::ExecutionModeMax)
+                builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
+        }
+        break;
+#endif
+
     default:
         break;
     }
@@ -1186,6 +1464,7 @@
 // Finish creating SPV, after the traversal is complete.
 void TGlslangToSpvTraverser::finishSpv()
 {
+    // Finish the entry point function
     if (! entryPointTerminated) {
         builder.setBuildPoint(shaderEntry->getLastBlock());
         builder.leaveFunction();
@@ -1195,7 +1474,9 @@
     for (auto it = iOSet.cbegin(); it != iOSet.cend(); ++it)
         entryPoint->addIdOperand(*it);
 
-    builder.eliminateDeadDecorations();
+    // Add capabilities, extensions, remove unneeded decorations, etc., 
+    // based on the resulting SPIR-V.
+    builder.postProcess();
 }
 
 // Write the SPV into 'out'.
@@ -1352,7 +1633,7 @@
 
             // store the result
             builder.setAccessChain(lValue);
-            multiTypeStore(node->getType(), rValue);
+            multiTypeStore(node->getLeft()->getType(), rValue);
 
             // assignments are expressions having an rValue after they are evaluated...
             builder.clearAccessChain();
@@ -1389,7 +1670,7 @@
                 }
 
                 // normal case for indexing array or structure or block
-                builder.accessChainPush(builder.makeIntConstant(spvIndex));
+                builder.accessChainPush(builder.makeIntConstant(spvIndex), TranslateCoherent(node->getLeft()->getType()));
 
                 // Add capabilities here for accessing PointSize and clip/cull distance.
                 // We have deferred generation of associated capabilities until now.
@@ -1425,7 +1706,7 @@
             if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector())
                 builder.accessChainPushComponent(index, convertGlslangToSpvType(node->getLeft()->getType()));
             else
-                builder.accessChainPush(index);
+                builder.accessChainPush(index, TranslateCoherent(node->getLeft()->getType()));
         }
         return false;
     case glslang::EOpVectorSwizzle:
@@ -1659,11 +1940,11 @@
         builder.setAccessChainRValue(result);
 
         return false;
+    } else if (node->getOp() == glslang::EOpImageStore ||
 #ifdef AMD_EXTENSIONS
-    } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod) {
-#else
-    } else if (node->getOp() == glslang::EOpImageStore) {
+        node->getOp() == glslang::EOpImageStoreLod ||
 #endif
+        node->getOp() == glslang::EOpImageAtomicStore) {
         // "imageStore" is a special case, which has no result
         return false;
     }
@@ -1953,6 +2234,10 @@
         // These all have 0 operands and will naturally finish up in the code below for 0 operands
         break;
 
+    case glslang::EOpAtomicStore:
+        noReturnValue = true;
+        // fallthrough
+    case glslang::EOpAtomicLoad:
     case glslang::EOpAtomicAdd:
     case glslang::EOpAtomicMin:
     case glslang::EOpAtomicMax:
@@ -1978,6 +2263,15 @@
         atomic = true;
         break;
 
+#ifdef NV_EXTENSIONS
+    case glslang::EOpIgnoreIntersectionNV:
+    case glslang::EOpTerminateRayNV:
+    case glslang::EOpTraceNV:
+    case glslang::EOpWritePackedPrimitiveIndices4x8NV:
+        noReturnValue = true;
+        break;
+#endif
+
     default:
         break;
     }
@@ -2051,6 +2345,8 @@
         case glslang::EOpAtomicXor:
         case glslang::EOpAtomicExchange:
         case glslang::EOpAtomicCompSwap:
+        case glslang::EOpAtomicLoad:
+        case glslang::EOpAtomicStore:
         case glslang::EOpAtomicCounterAdd:
         case glslang::EOpAtomicCounterSubtract:
         case glslang::EOpAtomicCounterMin:
@@ -2604,11 +2900,6 @@
         spvType = builder.makeFloatType(64);
         break;
     case glslang::EbtFloat16:
-        builder.addCapability(spv::CapabilityFloat16);
-#if AMD_EXTENSIONS
-        if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3)
-            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
-#endif
         spvType = builder.makeFloatType(16);
         break;
     case glslang::EbtBool:
@@ -2619,28 +2910,16 @@
         else
             spvType = builder.makeBoolType();
         break;
-   case glslang::EbtInt8:
-        builder.addCapability(spv::CapabilityInt8);
+    case glslang::EbtInt8:
         spvType = builder.makeIntType(8);
         break;
     case glslang::EbtUint8:
-        builder.addCapability(spv::CapabilityInt8);
         spvType = builder.makeUintType(8);
         break;
-   case glslang::EbtInt16:
-        builder.addCapability(spv::CapabilityInt16);
-#ifdef AMD_EXTENSIONS
-        if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3)
-            builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16);
-#endif
+    case glslang::EbtInt16:
         spvType = builder.makeIntType(16);
         break;
     case glslang::EbtUint16:
-        builder.addCapability(spv::CapabilityInt16);
-#ifdef AMD_EXTENSIONS
-        if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3)
-            builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16);
-#endif
         spvType = builder.makeUintType(16);
         break;
     case glslang::EbtInt:
@@ -2659,6 +2938,11 @@
         builder.addCapability(spv::CapabilityAtomicStorage);
         spvType = builder.makeUintType(32);
         break;
+#ifdef NV_EXTENSIONS
+    case glslang::EbtAccStructNV:
+        spvType = builder.makeAccelerationStructureNVType();
+        break;
+#endif
     case glslang::EbtSampler:
         {
             const glslang::TSampler& sampler = type.getSampler();
@@ -2765,23 +3049,28 @@
 //
 bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member)
 {
+#ifdef NV_EXTENSIONS
     auto& extensions = glslangIntermediate->getRequestedExtensions();
 
-    if (member.getFieldName() == "gl_ViewportMask" &&
-        extensions.find("GL_NV_viewport_array2") == extensions.end())
-        return true;
     if (member.getFieldName() == "gl_SecondaryViewportMaskNV" &&
         extensions.find("GL_NV_stereo_view_rendering") == extensions.end())
         return true;
     if (member.getFieldName() == "gl_SecondaryPositionNV" &&
         extensions.find("GL_NV_stereo_view_rendering") == extensions.end())
         return true;
-    if (member.getFieldName() == "gl_PositionPerViewNV" &&
-        extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
-        return true;
-    if (member.getFieldName() == "gl_ViewportMaskPerViewNV" &&
-        extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
-        return true;
+
+    if (glslangIntermediate->getStage() != EShLangMeshNV) {
+        if (member.getFieldName() == "gl_ViewportMask" &&
+            extensions.find("GL_NV_viewport_array2") == extensions.end())
+            return true;
+        if (member.getFieldName() == "gl_PositionPerViewNV" &&
+            extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
+            return true;
+        if (member.getFieldName() == "gl_ViewportMaskPerViewNV" &&
+            extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
+            return true;
+    }
+#endif
 
     return false;
 };
@@ -2874,6 +3163,9 @@
                 glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
                 builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier));
                 builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier));
+#ifdef NV_EXTENSIONS
+                addMeshNVDecoration(spvType, member, memberQualifier);
+#endif
             }
         }
         builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));
@@ -2882,7 +3174,7 @@
             qualifier.storage == glslang::EvqBuffer) {
             // Add memory decorations only to top-level members of shader storage block
             std::vector<spv::Decoration> memory;
-            TranslateMemoryDecoration(memberQualifier, memory);
+            TranslateMemoryDecoration(memberQualifier, memory, glslangIntermediate->usingVulkanMemoryModel());
             for (unsigned int i = 0; i < memory.size(); ++i)
                 builder.addMemberDecoration(spvType, member, memory[i]);
         }
@@ -2993,8 +3285,15 @@
 spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type)
 {
     spv::Id nominalTypeId = builder.accessChainGetInferredType();
+
+    spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;
+    coherentFlags |= TranslateCoherent(type);
+
     spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),
-                                               TranslateNonUniformDecoration(type.getQualifier()), nominalTypeId);
+                                               TranslateNonUniformDecoration(type.getQualifier()),
+                                               nominalTypeId,
+                                               spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask),
+                                               TranslateMemoryScope(coherentFlags));
 
     // Need to convert to abstract types when necessary
     if (type.getBasicType() == glslang::EbtBool) {
@@ -3050,7 +3349,12 @@
         }
     }
 
-    builder.accessChainStore(rvalue);
+    spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;
+    coherentFlags |= TranslateCoherent(type);
+
+    builder.accessChainStore(rvalue,
+                             spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerVisibleKHRMask),
+                             TranslateMemoryScope(coherentFlags));
 }
 
 // For storing when types match at the glslang level, but not might match at the
@@ -3096,7 +3400,7 @@
             // set up the target storage
             builder.clearAccessChain();
             builder.setAccessChainLValue(lValue);
-            builder.accessChainPush(builder.makeIntConstant(index));
+            builder.accessChainPush(builder.makeIntConstant(index), TranslateCoherent(type));
 
             // store the member
             multiTypeStore(glslangElementType, elementRValue);
@@ -3116,7 +3420,7 @@
             // set up the target storage
             builder.clearAccessChain();
             builder.setAccessChainLValue(lValue);
-            builder.accessChainPush(builder.makeIntConstant(m));
+            builder.accessChainPush(builder.makeIntConstant(m), TranslateCoherent(type));
 
             // store the member
             multiTypeStore(glslangMemberType, memberRValue);
@@ -3133,9 +3437,10 @@
     if (type.getBasicType() != glslang::EbtBlock)
         return glslang::ElpNone;
 
-    // has to be a uniform or buffer block
+    // has to be a uniform or buffer block or task in/out blocks
     if (type.getQualifier().storage != glslang::EvqUniform &&
-        type.getQualifier().storage != glslang::EvqBuffer)
+        type.getQualifier().storage != glslang::EvqBuffer &&
+        !type.getQualifier().isTaskMemory())
         return glslang::ElpNone;
 
     // return the layout to use
@@ -3217,7 +3522,7 @@
     //       adjusting this late means inconsistencies with earlier code, which for reflection is an issue
     // Until reflection is brought in sync with these adjustments, don't apply to $Global,
     // which is the most likely to rely on reflection, and least likely to rely implicit layouts
-    if (glslangIntermediate->usingHlslOFfsets() &&
+    if (glslangIntermediate->usingHlslOffsets() &&
         ! memberType.isArray() && memberType.isVector() && structType.getTypeName().compare("$Global") != 0) {
         int dummySize;
         int componentAlignment = glslangIntermediate->getBaseAlignmentScalar(memberType, dummySize);
@@ -3249,6 +3554,14 @@
     case glslang::EbvSecondaryViewportMaskNV:
     case glslang::EbvPositionPerViewNV:
     case glslang::EbvViewportMaskPerViewNV:
+    case glslang::EbvTaskCountNV:
+    case glslang::EbvPrimitiveCountNV:
+    case glslang::EbvPrimitiveIndicesNV:
+    case glslang::EbvClipDistancePerViewNV:
+    case glslang::EbvCullDistancePerViewNV:
+    case glslang::EbvLayerPerViewNV:
+    case glslang::EbvMeshViewCountNV:
+    case glslang::EbvMeshViewIndicesNV:
 #endif
         // Generate the associated capability.  Delegate to TranslateBuiltInDecoration.
         // Alternately, we could just call this for any glslang built-in, since the
@@ -3293,11 +3606,11 @@
 // Make all the functions, skeletally, without actually visiting their bodies.
 void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslFunctions)
 {
-    const auto getParamDecorations = [](std::vector<spv::Decoration>& decorations, const glslang::TType& type) {
+    const auto getParamDecorations = [](std::vector<spv::Decoration>& decorations, const glslang::TType& type, bool useVulkanMemoryModel) {
         spv::Decoration paramPrecision = TranslatePrecisionDecoration(type);
         if (paramPrecision != spv::NoPrecision)
             decorations.push_back(paramPrecision);
-        TranslateMemoryDecoration(type.getQualifier(), decorations);
+        TranslateMemoryDecoration(type.getQualifier(), decorations, useVulkanMemoryModel);
     };
 
     for (int f = 0; f < (int)glslFunctions.size(); ++f) {
@@ -3336,7 +3649,7 @@
                 typeId = builder.makePointer(spv::StorageClassFunction, typeId);
             else
                 rValueParameters.insert(parameters[p]->getAsSymbolNode()->getId());
-            getParamDecorations(paramDecorations[p], paramType);
+            getParamDecorations(paramDecorations[p], paramType, glslangIntermediate->usingVulkanMemoryModel());
             paramTypes.push_back(typeId);
         }
 
@@ -3426,6 +3739,8 @@
         case glslang::EOpImageAtomicXor:
         case glslang::EOpImageAtomicExchange:
         case glslang::EOpImageAtomicCompSwap:
+        case glslang::EOpImageAtomicLoad:
+        case glslang::EOpImageAtomicStore:
             if (i == 0)
                 lvalue = true;
             break;
@@ -3527,6 +3842,25 @@
                 lvalue = true;
             break;
 #endif
+#ifdef NV_EXTENSIONS
+        case glslang::EOpImageSampleFootprintNV:
+            if (i == 4)
+                lvalue = true;
+            break;
+        case glslang::EOpImageSampleFootprintClampNV:
+        case glslang::EOpImageSampleFootprintLodNV:
+            if (i == 5)
+                lvalue = true;
+            break;
+        case glslang::EOpImageSampleFootprintGradNV:
+            if (i == 6)
+                lvalue = true;
+            break;
+        case glslang::EOpImageSampleFootprintGradClampNV:
+            if (i == 7)
+                lvalue = true;
+            break;
+#endif
         default:
             break;
         }
@@ -3553,8 +3887,10 @@
     builder.setLine(node->getLoc().line);
 
     // Process a GLSL texturing op (will be SPV image)
-    const glslang::TSampler sampler = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().getSampler()
-                                                             : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType().getSampler();
+
+    const glslang::TType &imageType = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType()
+                                                             : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType();
+    const glslang::TSampler sampler = imageType.getSampler();
 #ifdef AMD_EXTENSIONS
     bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate())
                                 ? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16
@@ -3622,9 +3958,10 @@
 
     // Check for image functions other than queries
     if (node->isImage()) {
-        std::vector<spv::Id> operands;
+        std::vector<spv::IdImmediate> operands;
         auto opIt = arguments.begin();
-        operands.push_back(*(opIt++));
+        spv::IdImmediate image = { true, *(opIt++) };
+        operands.push_back(image);
 
         // Handle subpass operations
         // TODO: GLSL should change to have the "MS" only on the type rather than the
@@ -3635,38 +3972,63 @@
             std::vector<spv::Id> comps;
             comps.push_back(zero);
             comps.push_back(zero);
-            operands.push_back(builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps));
+            spv::IdImmediate coord = { true,
+                builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps) };
+            operands.push_back(coord);
             if (sampler.ms) {
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*(opIt++));
+                spv::IdImmediate imageOperands = { false, spv::ImageOperandsSampleMask };
+                operands.push_back(imageOperands);
+                spv::IdImmediate imageOperand = { true, *(opIt++) };
+                operands.push_back(imageOperand);
             }
             spv::Id result = builder.createOp(spv::OpImageRead, resultType(), operands);
             builder.setPrecision(result, precision);
             return result;
         }
 
-        operands.push_back(*(opIt++));
+        spv::IdImmediate coord = { true, *(opIt++) };
+        operands.push_back(coord);
 #ifdef AMD_EXTENSIONS
         if (node->getOp() == glslang::EOpImageLoad || node->getOp() == glslang::EOpImageLoadLod) {
 #else
         if (node->getOp() == glslang::EOpImageLoad) {
 #endif
+            spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
             if (sampler.ms) {
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*opIt);
+                mask = mask | spv::ImageOperandsSampleMask;
+            }
 #ifdef AMD_EXTENSIONS
-            } else if (cracked.lod) {
+            if (cracked.lod) {
                 builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);
                 builder.addCapability(spv::CapabilityImageReadWriteLodAMD);
-
-                operands.push_back(spv::ImageOperandsLodMask);
-                operands.push_back(*opIt);
-#endif
+                mask = mask | spv::ImageOperandsLodMask;
             }
-            if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown)
+#endif
+            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
+            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
+            if (mask) {
+                spv::IdImmediate imageOperands = { false, (unsigned int)mask };
+                operands.push_back(imageOperands);
+            }
+            if (mask & spv::ImageOperandsSampleMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#ifdef AMD_EXTENSIONS
+            if (mask & spv::ImageOperandsLodMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#endif
+            if (mask & spv::ImageOperandsMakeTexelVisibleKHRMask) {
+                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
+                operands.push_back(imageOperand);
+            }
+
+            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormatUnknown)
                 builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat);
 
-            std::vector<spv::Id> result( 1, builder.createOp(spv::OpImageRead, resultType(), operands) );
+            std::vector<spv::Id> result(1, builder.createOp(spv::OpImageRead, resultType(), operands));
             builder.setPrecision(result[0], precision);
 
             // If needed, add a conversion constructor to the proper size.
@@ -3679,23 +4041,54 @@
 #else
         } else if (node->getOp() == glslang::EOpImageStore) {
 #endif
-            if (sampler.ms) {
-                operands.push_back(*(opIt + 1));
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*opIt);
+
+            // Push the texel value before the operands
 #ifdef AMD_EXTENSIONS
-            } else if (cracked.lod) {
+            if (sampler.ms || cracked.lod) {
+#else
+            if (sampler.ms) {
+#endif
+                spv::IdImmediate texel = { true, *(opIt + 1) };
+                operands.push_back(texel);
+            } else {
+                spv::IdImmediate texel = { true, *opIt };
+                operands.push_back(texel);
+            }
+
+            spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
+            if (sampler.ms) {
+                mask = mask | spv::ImageOperandsSampleMask;
+            }
+#ifdef AMD_EXTENSIONS
+            if (cracked.lod) {
                 builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);
                 builder.addCapability(spv::CapabilityImageReadWriteLodAMD);
-
-                operands.push_back(*(opIt + 1));
-                operands.push_back(spv::ImageOperandsLodMask);
-                operands.push_back(*opIt);
+                mask = mask | spv::ImageOperandsLodMask;
+            }
 #endif
-            } else
-                operands.push_back(*opIt);
+            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
+            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelVisibleKHRMask);
+            if (mask) {
+                spv::IdImmediate imageOperands = { false, (unsigned int)mask };
+                operands.push_back(imageOperands);
+            }
+            if (mask & spv::ImageOperandsSampleMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#ifdef AMD_EXTENSIONS
+            if (mask & spv::ImageOperandsLodMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#endif
+            if (mask & spv::ImageOperandsMakeTexelAvailableKHRMask) {
+                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
+                operands.push_back(imageOperand);
+            }
+
             builder.createNoResultOp(spv::OpImageWrite, operands);
-            if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown)
+            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormatUnknown)
                 builder.addCapability(spv::CapabilityStorageImageWriteWithoutFormat);
             return spv::NoResult;
 #ifdef AMD_EXTENSIONS
@@ -3704,20 +4097,40 @@
         } else if (node->getOp() == glslang::EOpSparseImageLoad) {
 #endif
             builder.addCapability(spv::CapabilitySparseResidency);
-            if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown)
+            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormatUnknown)
                 builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat);
 
+            spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
             if (sampler.ms) {
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*opIt++);
+                mask = mask | spv::ImageOperandsSampleMask;
+            }
 #ifdef AMD_EXTENSIONS
-            } else if (cracked.lod) {
+            if (cracked.lod) {
                 builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);
                 builder.addCapability(spv::CapabilityImageReadWriteLodAMD);
 
-                operands.push_back(spv::ImageOperandsLodMask);
-                operands.push_back(*opIt++);
+                mask = mask | spv::ImageOperandsLodMask;
+            }
 #endif
+            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
+            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
+            if (mask) {
+                spv::IdImmediate imageOperands = { false, (unsigned int)mask };
+                operands.push_back(imageOperands);
+            }
+            if (mask & spv::ImageOperandsSampleMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#ifdef AMD_EXTENSIONS
+            if (mask & spv::ImageOperandsLodMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#endif
+            if (mask & spv::ImageOperandsMakeTexelVisibleKHRMask) {
+                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
+                operands.push_back(imageOperand);
             }
 
             // Create the return type that was a special structure
@@ -3736,9 +4149,18 @@
 
             // GLSL "IMAGE_PARAMS" will involve in constructing an image texel pointer and this pointer,
             // as the first source operand, is required by SPIR-V atomic operations.
-            operands.push_back(sampler.ms ? *(opIt++) : builder.makeUintConstant(0)); // For non-MS, the value should be 0
+            // For non-MS, the sample value should be 0
+            spv::IdImmediate sample = { true, sampler.ms ? *(opIt++) : builder.makeUintConstant(0) };
+            operands.push_back(sample);
 
-            spv::Id resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
+            spv::Id resultTypeId;
+            // imageAtomicStore has a void return type so base the pointer type on
+            // the type of the value operand.
+            if (node->getOp() == glslang::EOpImageAtomicStore) {
+                resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(operands[2].word));                
+            } else {
+                resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
+            }
             spv::Id pointer = builder.createOp(spv::OpImageTexelPointer, resultTypeId, operands);
 
             std::vector<spv::Id> operands;
@@ -3791,6 +4213,10 @@
 
     // Check for texture functions other than queries
     bool sparse = node->isSparseTexture();
+#ifdef NV_EXTENSIONS
+    bool imageFootprint = node->isImageFootprint();
+#endif
+
     bool cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;
 
     // check for bias argument
@@ -3820,7 +4246,12 @@
             ++nonBiasArgCount;
         if (sparse)
             ++nonBiasArgCount;
-
+#ifdef NV_EXTENSIONS
+        if (imageFootprint)
+            //Following three extra arguments
+            // int granularity, bool coarse, out gl_TextureFootprint2DNV footprint
+            nonBiasArgCount += 3;
+#endif
         if ((int)arguments.size() > nonBiasArgCount)
             bias = true;
     }
@@ -3875,7 +4306,13 @@
     if (cracked.lod) {
         params.lod = arguments[2 + extraArgs];
         ++extraArgs;
-    } else if (glslangIntermediate->getStage() != EShLangFragment) {
+    } else if (glslangIntermediate->getStage() != EShLangFragment
+#ifdef NV_EXTENSIONS
+        // NV_compute_shader_derivatives layout qualifiers allow for implicit LODs
+           && !(glslangIntermediate->getStage() == EShLangCompute &&
+                (glslangIntermediate->getLayoutDerivativeModeNone() != glslang::LayoutDerivativeNone))
+#endif
+        ) {
         // we need to invent the default lod for an explicit lod instruction for a non-fragment stage
         noImplicitLod = true;
     }
@@ -3907,7 +4344,6 @@
         params.lodClamp = arguments[2 + extraArgs];
         ++extraArgs;
     }
-
     // sparse
     if (sparse) {
         params.texelOut = arguments[2 + extraArgs];
@@ -3923,13 +4359,81 @@
         } else
             params.component = builder.makeIntConstant(0);
     }
-
+#ifdef NV_EXTENSIONS
+    spv::Id  resultStruct = spv::NoResult;
+    if (imageFootprint) {
+        //Following three extra arguments
+        // int granularity, bool coarse, out gl_TextureFootprint2DNV footprint
+        params.granularity = arguments[2 + extraArgs];
+        params.coarse = arguments[3 + extraArgs];
+        resultStruct = arguments[4 + extraArgs];
+        extraArgs += 3;
+    }
+#endif
     // bias
     if (bias) {
         params.bias = arguments[2 + extraArgs];
         ++extraArgs;
     }
 
+#ifdef NV_EXTENSIONS
+    if (imageFootprint) {
+        builder.addExtension(spv::E_SPV_NV_shader_image_footprint);
+        builder.addCapability(spv::CapabilityImageFootprintNV);
+
+
+        //resultStructType(OpenGL type) contains 5 elements:
+        //struct gl_TextureFootprint2DNV {
+        //    uvec2 anchor;
+        //    uvec2 offset;
+        //    uvec2 mask;
+        //    uint  lod;
+        //    uint  granularity;
+        //};
+        //or
+        //struct gl_TextureFootprint3DNV {
+        //    uvec3 anchor;
+        //    uvec3 offset;
+        //    uvec2 mask;
+        //    uint  lod;
+        //    uint  granularity;
+        //};
+        spv::Id resultStructType = builder.getContainedTypeId(builder.getTypeId(resultStruct));
+        assert(builder.isStructType(resultStructType));
+
+        //resType (SPIR-V type) contains 6 elements:
+        //Member 0 must be a Boolean type scalar(LOD), 
+        //Member 1 must be a vector of integer type, whose Signedness operand is 0(anchor),  
+        //Member 2 must be a vector of integer type, whose Signedness operand is 0(offset), 
+        //Member 3 must be a vector of integer type, whose Signedness operand is 0(mask), 
+        //Member 4 must be a scalar of integer type, whose Signedness operand is 0(lod),
+        //Member 5 must be a scalar of integer type, whose Signedness operand is 0(granularity).
+        std::vector<spv::Id> members;
+        members.push_back(resultType());
+        for (int i = 0; i < 5; i++) {
+            members.push_back(builder.getContainedTypeId(resultStructType, i));
+        }
+        spv::Id resType = builder.makeStructType(members, "ResType");
+
+        //call ImageFootprintNV
+        spv::Id res = builder.createTextureCall(precision, resType, sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params);
+        
+        //copy resType (SPIR-V type) to resultStructType(OpenGL type)
+        for (int i = 0; i < 5; i++) {
+            builder.clearAccessChain();
+            builder.setAccessChainLValue(resultStruct);
+
+            //Accessing to a struct we created, no coherent flag is set
+            spv::Builder::AccessChain::CoherentFlags flags;
+            flags.clear();
+
+            builder.accessChainPush(builder.makeIntConstant(i), flags);
+            builder.accessChainStore(builder.createCompositeExtract(res, builder.getContainedTypeId(resType, i+1), i+1));
+        }
+        return builder.createCompositeExtract(res, resultType(), 0);
+    }
+#endif
+
     // projective component (might not to move)
     // GLSL: "The texture coordinates consumed from P, not including the last component of P,
     //       are divided by the last component of P."
@@ -3954,6 +4458,16 @@
         }
     }
 
+    // nonprivate
+    if (imageType.getQualifier().nonprivate) {
+        params.nonprivate = true;
+    }
+
+    // volatile
+    if (imageType.getQualifier().volatil) {
+        params.volatil = true;
+    }
+
     std::vector<spv::Id> result( 1, 
         builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params)
     );
@@ -4622,27 +5136,21 @@
         unaryOp = spv::OpFwidth;
         break;
     case glslang::EOpDPdxFine:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdxFine;
         break;
     case glslang::EOpDPdyFine:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdyFine;
         break;
     case glslang::EOpFwidthFine:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpFwidthFine;
         break;
     case glslang::EOpDPdxCoarse:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdxCoarse;
         break;
     case glslang::EOpDPdyCoarse:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdyCoarse;
         break;
     case glslang::EOpFwidthCoarse:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpFwidthCoarse;
         break;
     case glslang::EOpInterpolateAtCentroid:
@@ -4650,7 +5158,6 @@
         if (typeProxy == glslang::EbtFloat16)
             builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
 #endif
-        builder.addCapability(spv::CapabilityInterpolationFunction);
         libCall = spv::GLSLstd450InterpolateAtCentroid;
         break;
     case glslang::EOpAny:
@@ -4786,8 +5293,6 @@
 #endif
 #ifdef NV_EXTENSIONS
     case glslang::EOpSubgroupPartition:
-        builder.addExtension(spv::E_SPV_NV_shader_subgroup_partitioned);
-        builder.addCapability(spv::CapabilityGroupNonUniformPartitionedNV);
         unaryOp = spv::OpGroupNonUniformPartitionNV;
         break;
 #endif
@@ -5331,8 +5836,14 @@
         opCode = spv::OpAtomicIDecrement;
         break;
     case glslang::EOpAtomicCounter:
+    case glslang::EOpImageAtomicLoad:
+    case glslang::EOpAtomicLoad:
         opCode = spv::OpAtomicLoad;
         break;
+    case glslang::EOpAtomicStore:
+    case glslang::EOpImageAtomicStore:
+        opCode = spv::OpAtomicStore;
+        break;
     default:
         assert(0);
         break;
@@ -5343,46 +5854,94 @@
 
     // Sort out the operands
     //  - mapping from glslang -> SPV
-    //  - there are extra SPV operands with no glslang source
+    //  - there are extra SPV operands that are optional in glslang
     //  - compare-exchange swaps the value and comparator
     //  - compare-exchange has an extra memory semantics
     //  - EOpAtomicCounterDecrement needs a post decrement
-    std::vector<spv::Id> spvAtomicOperands;  // hold the spv operands
-    auto opIt = operands.begin();            // walk the glslang operands
-    spvAtomicOperands.push_back(*(opIt++));
-    spvAtomicOperands.push_back(builder.makeUintConstant(spv::ScopeDevice));     // TBD: what is the correct scope?
-    spvAtomicOperands.push_back(builder.makeUintConstant(spv::MemorySemanticsMaskNone)); // TBD: what are the correct memory semantics?
-    if (opCode == spv::OpAtomicCompareExchange) {
-        // There are 2 memory semantics for compare-exchange. And the operand order of "comparator" and "new value" in GLSL
-        // differs from that in SPIR-V. Hence, special processing is required.
-        spvAtomicOperands.push_back(builder.makeUintConstant(spv::MemorySemanticsMaskNone));
-        spvAtomicOperands.push_back(*(opIt + 1));
-        spvAtomicOperands.push_back(*opIt);
-        opIt += 2;
+    spv::Id pointerId = 0, compareId = 0, valueId = 0;
+    // scope defaults to Device in the old model, QueueFamilyKHR in the new model
+    spv::Id scopeId;
+    if (glslangIntermediate->usingVulkanMemoryModel()) {
+        scopeId = builder.makeUintConstant(spv::ScopeQueueFamilyKHR);
+    } else {
+        scopeId = builder.makeUintConstant(spv::ScopeDevice);
+    }
+    // semantics default to relaxed 
+    spv::Id semanticsId = builder.makeUintConstant(spv::MemorySemanticsMaskNone);
+    spv::Id semanticsId2 = semanticsId;
+
+    pointerId = operands[0];
+    if (opCode == spv::OpAtomicIIncrement || opCode == spv::OpAtomicIDecrement) {
+        // no additional operands
+    } else if (opCode == spv::OpAtomicCompareExchange) {
+        compareId = operands[1];
+        valueId = operands[2];
+        if (operands.size() > 3) {
+            scopeId = operands[3];
+            semanticsId = builder.makeUintConstant(builder.getConstantScalar(operands[4]) | builder.getConstantScalar(operands[5]));
+            semanticsId2 = builder.makeUintConstant(builder.getConstantScalar(operands[6]) | builder.getConstantScalar(operands[7]));
+        }
+    } else if (opCode == spv::OpAtomicLoad) {
+        if (operands.size() > 1) {
+            scopeId = operands[1];
+            semanticsId = builder.makeUintConstant(builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]));
+        }
+    } else {
+        // atomic store or RMW
+        valueId = operands[1];
+        if (operands.size() > 2) {
+            scopeId = operands[2];
+            semanticsId = builder.makeUintConstant(builder.getConstantScalar(operands[3]) | builder.getConstantScalar(operands[4]));
+        }
     }
 
-    // Add the rest of the operands, skipping any that were dealt with above.
-    for (; opIt != operands.end(); ++opIt)
-        spvAtomicOperands.push_back(*opIt);
+    // Check for capabilities
+    unsigned semanticsImmediate = builder.getConstantScalar(semanticsId) | builder.getConstantScalar(semanticsId2);
+    if (semanticsImmediate & (spv::MemorySemanticsMakeAvailableKHRMask | spv::MemorySemanticsMakeVisibleKHRMask | spv::MemorySemanticsOutputMemoryKHRMask)) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
 
-    spv::Id resultId = builder.createOp(opCode, typeId, spvAtomicOperands);
+    if (glslangIntermediate->usingVulkanMemoryModel() && builder.getConstantScalar(scopeId) == spv::ScopeDevice) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+    }
 
-    // GLSL and HLSL atomic-counter decrement return post-decrement value,
-    // while SPIR-V returns pre-decrement value. Translate between these semantics.
-    if (op == glslang::EOpAtomicCounterDecrement)
-        resultId = builder.createBinOp(spv::OpISub, typeId, resultId, builder.makeIntConstant(1));
+    std::vector<spv::Id> spvAtomicOperands;  // hold the spv operands
+    spvAtomicOperands.push_back(pointerId);
+    spvAtomicOperands.push_back(scopeId);
+    spvAtomicOperands.push_back(semanticsId);
+    if (opCode == spv::OpAtomicCompareExchange) {
+        spvAtomicOperands.push_back(semanticsId2);
+        spvAtomicOperands.push_back(valueId);
+        spvAtomicOperands.push_back(compareId);
+    } else if (opCode != spv::OpAtomicLoad && opCode != spv::OpAtomicIIncrement && opCode != spv::OpAtomicIDecrement) {
+        spvAtomicOperands.push_back(valueId);
+    }
 
-    return resultId;
+    if (opCode == spv::OpAtomicStore) {
+        builder.createNoResultOp(opCode, spvAtomicOperands);
+        return 0;
+    } else {
+        spv::Id resultId = builder.createOp(opCode, typeId, spvAtomicOperands);
+
+        // GLSL and HLSL atomic-counter decrement return post-decrement value,
+        // while SPIR-V returns pre-decrement value. Translate between these semantics.
+        if (op == glslang::EOpAtomicCounterDecrement)
+            resultId = builder.createBinOp(spv::OpISub, typeId, resultId, builder.makeIntConstant(1));
+
+        return resultId;
+    }
 }
 
 // Create group invocation operations.
 spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
 {
+#ifdef AMD_EXTENSIONS
     bool isUnsigned = isTypeUnsignedInt(typeProxy);
     bool isFloat = isTypeFloat(typeProxy);
+#endif
 
     spv::Op opCode = spv::OpNop;
-    std::vector<spv::Id> spvGroupOperands;
+    std::vector<spv::IdImmediate> spvGroupOperands;
     spv::GroupOperation groupOperation = spv::GroupOperationMax;
 
     if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation ||
@@ -5409,7 +5968,6 @@
             builder.addExtension(spv::E_SPV_AMD_shader_ballot);
 #endif
 
-        spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
 #ifdef AMD_EXTENSIONS
         switch (op) {
         case glslang::EOpMinInvocations:
@@ -5419,7 +5977,6 @@
         case glslang::EOpMaxInvocationsNonUniform:
         case glslang::EOpAddInvocationsNonUniform:
             groupOperation = spv::GroupOperationReduce;
-            spvGroupOperands.push_back(groupOperation);
             break;
         case glslang::EOpMinInvocationsInclusiveScan:
         case glslang::EOpMaxInvocationsInclusiveScan:
@@ -5428,7 +5985,6 @@
         case glslang::EOpMaxInvocationsInclusiveScanNonUniform:
         case glslang::EOpAddInvocationsInclusiveScanNonUniform:
             groupOperation = spv::GroupOperationInclusiveScan;
-            spvGroupOperands.push_back(groupOperation);
             break;
         case glslang::EOpMinInvocationsExclusiveScan:
         case glslang::EOpMaxInvocationsExclusiveScan:
@@ -5437,16 +5993,23 @@
         case glslang::EOpMaxInvocationsExclusiveScanNonUniform:
         case glslang::EOpAddInvocationsExclusiveScanNonUniform:
             groupOperation = spv::GroupOperationExclusiveScan;
-            spvGroupOperands.push_back(groupOperation);
             break;
         default:
             break;
         }
+        spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+        spvGroupOperands.push_back(scope);
+        if (groupOperation != spv::GroupOperationMax) {
+            spv::IdImmediate groupOp = { false, (unsigned)groupOperation };
+            spvGroupOperands.push_back(groupOp);
+        }
 #endif
     }
 
-    for (auto opIt = operands.begin(); opIt != operands.end(); ++opIt)
-        spvGroupOperands.push_back(*opIt);
+    for (auto opIt = operands.begin(); opIt != operands.end(); ++opIt) {
+        spv::IdImmediate op = { true, *opIt };
+        spvGroupOperands.push_back(op);
+    }
 
     switch (op) {
     case glslang::EOpAnyInvocation:
@@ -5585,7 +6148,8 @@
 }
 
 // Create group invocation operations on a vector
-spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation, spv::Id typeId, std::vector<spv::Id>& operands)
+spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation,
+    spv::Id typeId, std::vector<spv::Id>& operands)
 {
 #ifdef AMD_EXTENSIONS
     assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin ||
@@ -5618,18 +6182,23 @@
     for (int comp = 0; comp < numComponents; ++comp) {
         std::vector<unsigned int> indexes;
         indexes.push_back(comp);
-        spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes);
-        std::vector<spv::Id> spvGroupOperands;
+        spv::IdImmediate scalar = { true, builder.createCompositeExtract(operands[0], scalarType, indexes) };
+        std::vector<spv::IdImmediate> spvGroupOperands;
         if (op == spv::OpSubgroupReadInvocationKHR) {
             spvGroupOperands.push_back(scalar);
-            spvGroupOperands.push_back(operands[1]);
+            spv::IdImmediate operand = { true, operands[1] };
+            spvGroupOperands.push_back(operand);
         } else if (op == spv::OpGroupBroadcast) {
-            spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
+            spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+            spvGroupOperands.push_back(scope);
             spvGroupOperands.push_back(scalar);
-            spvGroupOperands.push_back(operands[1]);
+            spv::IdImmediate operand = { true, operands[1] };
+            spvGroupOperands.push_back(operand);
         } else {
-            spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
-            spvGroupOperands.push_back(groupOperation);
+            spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+            spvGroupOperands.push_back(scope);
+            spv::IdImmediate groupOp = { false, (unsigned)groupOperation };
+            spvGroupOperands.push_back(groupOp);
             spvGroupOperands.push_back(scalar);
         }
 
@@ -5641,7 +6210,8 @@
 }
 
 // Create subgroup invocation operations.
-spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
+spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, spv::Id typeId,
+    std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
 {
     // Add the required capabilities.
     switch (op) {
@@ -5889,14 +6459,11 @@
     default: assert(0 && "Unhandled subgroup operation!");
     }
 
-    std::vector<spv::Id> spvGroupOperands;
-
-    // Every operation begins with the Execution Scope operand.
-    spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
-
-    // Next, for all operations that use a Group Operation, push that as an operand.
+    // get the right Group Operation
+    spv::GroupOperation groupOperation = spv::GroupOperationMax;
     switch (op) {
-    default: break;
+    default:
+        break;
     case glslang::EOpSubgroupBallotBitCount:
     case glslang::EOpSubgroupAdd:
     case glslang::EOpSubgroupMul:
@@ -5905,7 +6472,7 @@
     case glslang::EOpSubgroupAnd:
     case glslang::EOpSubgroupOr:
     case glslang::EOpSubgroupXor:
-        spvGroupOperands.push_back(spv::GroupOperationReduce);
+        groupOperation = spv::GroupOperationReduce;
         break;
     case glslang::EOpSubgroupBallotInclusiveBitCount:
     case glslang::EOpSubgroupInclusiveAdd:
@@ -5915,7 +6482,7 @@
     case glslang::EOpSubgroupInclusiveAnd:
     case glslang::EOpSubgroupInclusiveOr:
     case glslang::EOpSubgroupInclusiveXor:
-        spvGroupOperands.push_back(spv::GroupOperationInclusiveScan);
+        groupOperation = spv::GroupOperationInclusiveScan;
         break;
     case glslang::EOpSubgroupBallotExclusiveBitCount:
     case glslang::EOpSubgroupExclusiveAdd:
@@ -5925,7 +6492,7 @@
     case glslang::EOpSubgroupExclusiveAnd:
     case glslang::EOpSubgroupExclusiveOr:
     case glslang::EOpSubgroupExclusiveXor:
-        spvGroupOperands.push_back(spv::GroupOperationExclusiveScan);
+        groupOperation = spv::GroupOperationExclusiveScan;
         break;
     case glslang::EOpSubgroupClusteredAdd:
     case glslang::EOpSubgroupClusteredMul:
@@ -5934,7 +6501,7 @@
     case glslang::EOpSubgroupClusteredAnd:
     case glslang::EOpSubgroupClusteredOr:
     case glslang::EOpSubgroupClusteredXor:
-        spvGroupOperands.push_back(spv::GroupOperationClusteredReduce);
+        groupOperation = spv::GroupOperationClusteredReduce;
         break;
 #ifdef NV_EXTENSIONS
     case glslang::EOpSubgroupPartitionedAdd:
@@ -5944,7 +6511,7 @@
     case glslang::EOpSubgroupPartitionedAnd:
     case glslang::EOpSubgroupPartitionedOr:
     case glslang::EOpSubgroupPartitionedXor:
-        spvGroupOperands.push_back(spv::GroupOperationPartitionedReduceNV);
+        groupOperation = spv::GroupOperationPartitionedReduceNV;
         break;
     case glslang::EOpSubgroupPartitionedInclusiveAdd:
     case glslang::EOpSubgroupPartitionedInclusiveMul:
@@ -5953,7 +6520,7 @@
     case glslang::EOpSubgroupPartitionedInclusiveAnd:
     case glslang::EOpSubgroupPartitionedInclusiveOr:
     case glslang::EOpSubgroupPartitionedInclusiveXor:
-        spvGroupOperands.push_back(spv::GroupOperationPartitionedInclusiveScanNV);
+        groupOperation = spv::GroupOperationPartitionedInclusiveScanNV;
         break;
     case glslang::EOpSubgroupPartitionedExclusiveAdd:
     case glslang::EOpSubgroupPartitionedExclusiveMul:
@@ -5962,22 +6529,41 @@
     case glslang::EOpSubgroupPartitionedExclusiveAnd:
     case glslang::EOpSubgroupPartitionedExclusiveOr:
     case glslang::EOpSubgroupPartitionedExclusiveXor:
-        spvGroupOperands.push_back(spv::GroupOperationPartitionedExclusiveScanNV);
+        groupOperation = spv::GroupOperationPartitionedExclusiveScanNV;
         break;
 #endif
     }
 
+    // build the instruction
+    std::vector<spv::IdImmediate> spvGroupOperands;
+
+    // Every operation begins with the Execution Scope operand.
+    spv::IdImmediate executionScope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+    spvGroupOperands.push_back(executionScope);
+
+    // Next, for all operations that use a Group Operation, push that as an operand.
+    if (groupOperation != spv::GroupOperationMax) {
+        spv::IdImmediate groupOperand = { false, (unsigned)groupOperation };
+        spvGroupOperands.push_back(groupOperand);
+    }
+
     // Push back the operands next.
-    for (auto opIt : operands) {
-        spvGroupOperands.push_back(opIt);
+    for (auto opIt = operands.cbegin(); opIt != operands.cend(); ++opIt) {
+        spv::IdImmediate operand = { true, *opIt };
+        spvGroupOperands.push_back(operand);
     }
 
     // Some opcodes have additional operands.
+    spv::Id directionId = spv::NoResult;
     switch (op) {
     default: break;
-    case glslang::EOpSubgroupQuadSwapHorizontal: spvGroupOperands.push_back(builder.makeUintConstant(0)); break;
-    case glslang::EOpSubgroupQuadSwapVertical:   spvGroupOperands.push_back(builder.makeUintConstant(1)); break;
-    case glslang::EOpSubgroupQuadSwapDiagonal:   spvGroupOperands.push_back(builder.makeUintConstant(2)); break;
+    case glslang::EOpSubgroupQuadSwapHorizontal: directionId = builder.makeUintConstant(0); break;
+    case glslang::EOpSubgroupQuadSwapVertical:   directionId = builder.makeUintConstant(1); break;
+    case glslang::EOpSubgroupQuadSwapDiagonal:   directionId = builder.makeUintConstant(2); break;
+    }
+    if (directionId != spv::NoResult) {
+        spv::IdImmediate direction = { true, directionId };
+        spvGroupOperands.push_back(direction);
     }
 
     return builder.createOp(opCode, typeId, spvGroupOperands);
@@ -6082,7 +6668,6 @@
         if (typeProxy == glslang::EbtFloat16)
             builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
 #endif
-        builder.addCapability(spv::CapabilityInterpolationFunction);
         libCall = spv::GLSLstd450InterpolateAtSample;
         break;
     case glslang::EOpInterpolateAtOffset:
@@ -6090,7 +6675,6 @@
         if (typeProxy == glslang::EbtFloat16)
             builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
 #endif
-        builder.addCapability(spv::CapabilityInterpolationFunction);
         libCall = spv::GLSLstd450InterpolateAtOffset;
         break;
     case glslang::EOpAddCarry:
@@ -6246,7 +6830,59 @@
         libCall = spv::InterpolateAtVertexAMD;
         break;
 #endif
+    case glslang::EOpBarrier:
+        {
+            // This is for the extended controlBarrier function, with four operands.
+            // The unextended barrier() goes through createNoArgOperation.
+            assert(operands.size() == 4);
+            unsigned int executionScope = builder.getConstantScalar(operands[0]);
+            unsigned int memoryScope = builder.getConstantScalar(operands[1]);
+            unsigned int semantics = builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]);
+            builder.createControlBarrier((spv::Scope)executionScope, (spv::Scope)memoryScope, (spv::MemorySemanticsMask)semantics);
+            if (semantics & (spv::MemorySemanticsMakeAvailableKHRMask | spv::MemorySemanticsMakeVisibleKHRMask | spv::MemorySemanticsOutputMemoryKHRMask)) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+            }
+            if (glslangIntermediate->usingVulkanMemoryModel() && (executionScope == spv::ScopeDevice || memoryScope == spv::ScopeDevice)) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+            }
+            return 0;
+        }
+        break;
+    case glslang::EOpMemoryBarrier:
+        {
+            // This is for the extended memoryBarrier function, with three operands.
+            // The unextended memoryBarrier() goes through createNoArgOperation.
+            assert(operands.size() == 3);
+            unsigned int memoryScope = builder.getConstantScalar(operands[0]);
+            unsigned int semantics = builder.getConstantScalar(operands[1]) | builder.getConstantScalar(operands[2]);
+            builder.createMemoryBarrier((spv::Scope)memoryScope, (spv::MemorySemanticsMask)semantics);
+            if (semantics & (spv::MemorySemanticsMakeAvailableKHRMask | spv::MemorySemanticsMakeVisibleKHRMask | spv::MemorySemanticsOutputMemoryKHRMask)) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+            }
+            if (glslangIntermediate->usingVulkanMemoryModel() && memoryScope == spv::ScopeDevice) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+            }
+            return 0;
+        }
+        break;
 
+#ifdef NV_EXTENSIONS
+    case glslang::EOpReportIntersectionNV:
+    {
+        typeId = builder.makeBoolType();
+        opCode = spv::OpReportIntersectionNVX;
+    }
+    break;
+    case glslang::EOpTraceNV:
+    {
+        builder.createNoResultOp(spv::OpTraceNVX, operands);
+        return 0;
+    }
+    break;
+    case glslang::EOpWritePackedPrimitiveIndices4x8NV:
+        builder.createNoResultOp(spv::OpWritePackedPrimitiveIndices4x8NV, operands);
+        return 0;
+#endif
     default:
         return 0;
     }
@@ -6315,7 +6951,8 @@
 // Intrinsics with no arguments (or no return value, and no precision).
 spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId)
 {
-    // TODO: get the barrier operands correct
+    // GLSL memory barriers use queuefamily scope in new model, device scope in old model
+    spv::Scope memoryBarrierScope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice;
 
     switch (op) {
     case glslang::EOpEmitVertex:
@@ -6326,11 +6963,14 @@
         return 0;
     case glslang::EOpBarrier:
         if (glslangIntermediate->getStage() == EShLangTessControl) {
-            builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeInvocation, spv::MemorySemanticsMaskNone);
-            // TODO: prefer the following, when available:
-            // builder.createControlBarrier(spv::ScopePatch, spv::ScopePatch,
-            //                                 spv::MemorySemanticsPatchMask |
-            //                                 spv::MemorySemanticsAcquireReleaseMask);
+            if (glslangIntermediate->usingVulkanMemoryModel()) {
+                builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup,
+                                             spv::MemorySemanticsOutputMemoryKHRMask |
+                                             spv::MemorySemanticsAcquireReleaseMask);
+                builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+            } else {
+                builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeInvocation, spv::MemorySemanticsMaskNone);
+            }
         } else {
             builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup,
                                             spv::MemorySemanticsWorkgroupMemoryMask |
@@ -6338,24 +6978,24 @@
         }
         return 0;
     case glslang::EOpMemoryBarrier:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsAllMemory |
-                                                      spv::MemorySemanticsAcquireReleaseMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAllMemory |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierAtomicCounter:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsAtomicCounterMemoryMask |
-                                                      spv::MemorySemanticsAcquireReleaseMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAtomicCounterMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierBuffer:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsUniformMemoryMask |
-                                                      spv::MemorySemanticsAcquireReleaseMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsUniformMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierImage:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsImageMemoryMask |
-                                                      spv::MemorySemanticsAcquireReleaseMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsImageMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierShared:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsWorkgroupMemoryMask |
-                                                      spv::MemorySemanticsAcquireReleaseMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsWorkgroupMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpGroupMemoryBarrier:
         builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsAllMemory |
@@ -6417,6 +7057,14 @@
         return builder.setPrecision(id, precision);
     }
 #endif
+#ifdef NV_EXTENSIONS
+    case glslang::EOpIgnoreIntersectionNV:
+        builder.createNoResultOp(spv::OpIgnoreIntersectionNVX);
+        return 0;
+    case glslang::EOpTerminateRayNV:
+        builder.createNoResultOp(spv::OpTerminateRayNVX);
+        return 0;
+#endif
     default:
         logger->missingFunctionality("unknown operation with no arguments");
         return 0;
@@ -6440,6 +7088,9 @@
         builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));
         builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier()));
         builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier()));
+#ifdef NV_EXTENSIONS
+        addMeshNVDecoration(id, /*member*/ -1, symbol->getType().getQualifier());
+#endif
         if (symbol->getType().getQualifier().hasSpecConstantId())
             builder.addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId);
         if (symbol->getQualifier().hasIndex())
@@ -6484,7 +7135,7 @@
 
     if (symbol->getType().isImage()) {
         std::vector<spv::Decoration> memory;
-        TranslateMemoryDecoration(symbol->getType().getQualifier(), memory);
+        TranslateMemoryDecoration(symbol->getType().getQualifier(), memory, glslangIntermediate->usingVulkanMemoryModel());
         for (unsigned int i = 0; i < memory.size(); ++i)
             builder.addDecoration(id, memory[i]);
     }
@@ -6530,6 +7181,11 @@
         builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
         builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
     }
+    if (symbol->getQualifier().pervertexNV) {
+        builder.addDecoration(id, spv::DecorationPerVertexNV);
+        builder.addCapability(spv::CapabilityFragmentBarycentricNV);
+        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);
+    }
 #endif
 
     if (glslangIntermediate->getHlslFunctionality1() && symbol->getType().getQualifier().semanticName != nullptr) {
@@ -6541,6 +7197,28 @@
     return id;
 }
 
+#ifdef NV_EXTENSIONS
+// add per-primitive, per-view. per-task decorations to a struct member (member >= 0) or an object
+void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier& qualifier)
+{
+    if (member >= 0) {
+        if (qualifier.perPrimitiveNV)
+            builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerPrimitiveNV);
+        if (qualifier.perViewNV)
+            builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerViewNV);
+        if (qualifier.perTaskNV)
+            builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerTaskNV);
+    } else {
+        if (qualifier.perPrimitiveNV)
+            builder.addDecoration(id, spv::DecorationPerPrimitiveNV);
+        if (qualifier.perViewNV)
+            builder.addDecoration(id, spv::DecorationPerViewNV);
+        if (qualifier.perTaskNV)
+            builder.addDecoration(id, spv::DecorationPerTaskNV);
+    }
+}
+#endif
+
 // Make a full tree of instructions to build a SPIR-V specialization constant,
 // or regular constant if possible.
 //
@@ -6926,7 +7604,7 @@
     if (out.fail())
         printf("ERROR: Failed to open file: %s\n", baseName);
     out << "\t// " << 
-        glslang::GetSpirvGeneratorVersion() << "." << GLSLANG_MINOR_VERSION << "." << GLSLANG_PATCH_LEVEL <<
+        GetSpirvGeneratorVersion() << "." << GLSLANG_MINOR_VERSION << "." << GLSLANG_PATCH_LEVEL <<
         std::endl;
     if (varName != nullptr) {
         out << "\t #pragma once" << std::endl;
@@ -6953,13 +7631,13 @@
 //
 // Set up the glslang traversal
 //
-void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, SpvOptions* options)
+void GlslangToSpv(const TIntermediate& intermediate, std::vector<unsigned int>& spirv, SpvOptions* options)
 {
     spv::SpvBuildLogger logger;
     GlslangToSpv(intermediate, spirv, &logger, options);
 }
 
-void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+void GlslangToSpv(const TIntermediate& intermediate, std::vector<unsigned int>& spirv,
                   spv::SpvBuildLogger* logger, SpvOptions* options)
 {
     TIntermNode* root = intermediate.getTreeRoot();
@@ -6967,11 +7645,11 @@
     if (root == 0)
         return;
 
-    glslang::SpvOptions defaultOptions;
+    SpvOptions defaultOptions;
     if (options == nullptr)
         options = &defaultOptions;
 
-    glslang::GetThreadPoolAllocator().push();
+    GetThreadPoolAllocator().push();
 
     TGlslangToSpvTraverser it(intermediate.getSpv().spv, &intermediate, logger, *options);
     root->traverse(&it);
@@ -6981,54 +7659,18 @@
 #if ENABLE_OPT
     // If from HLSL, run spirv-opt to "legalize" the SPIR-V for Vulkan
     // eg. forward and remove memory writes of opaque types.
-    if ((intermediate.getSource() == EShSourceHlsl ||
-                options->optimizeSize) &&
-            !options->disableOptimizer) {
-        spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+    if ((intermediate.getSource() == EShSourceHlsl || options->optimizeSize) && !options->disableOptimizer)
+        SpirvToolsLegalize(intermediate, spirv, logger, options);
 
-        spvtools::Optimizer optimizer(target_env);
-        optimizer.SetMessageConsumer([](spv_message_level_t level,
-                                         const char* source,
-                                         const spv_position_t& position,
-                                         const char* message) {
-            std::cerr << StringifyMessage(level, source, position, message)
-                      << std::endl;
-        });
+    if (options->validate)
+        SpirvToolsValidate(intermediate, spirv, logger);
 
-        optimizer.RegisterPass(CreateMergeReturnPass());
-        optimizer.RegisterPass(CreateInlineExhaustivePass());
-        optimizer.RegisterPass(CreateEliminateDeadFunctionsPass());
-        optimizer.RegisterPass(CreateScalarReplacementPass());
-        optimizer.RegisterPass(CreateLocalAccessChainConvertPass());
-        optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass());
-        optimizer.RegisterPass(CreateLocalSingleStoreElimPass());
-        optimizer.RegisterPass(CreateSimplificationPass());
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateVectorDCEPass());
-        optimizer.RegisterPass(CreateDeadInsertElimPass());
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateDeadBranchElimPass());
-        optimizer.RegisterPass(CreateBlockMergePass());
-        optimizer.RegisterPass(CreateLocalMultiStoreElimPass());
-        optimizer.RegisterPass(CreateIfConversionPass());
-        optimizer.RegisterPass(CreateSimplificationPass());
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateVectorDCEPass());
-        optimizer.RegisterPass(CreateDeadInsertElimPass());
-        if (options->optimizeSize) {
-            optimizer.RegisterPass(CreateRedundancyEliminationPass());
-            // TODO(greg-lunarg): Add this when AMD driver issues are resolved
-            // optimizer.RegisterPass(CreateCommonUniformElimPass());
-        }
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateCFGCleanupPass());
+    if (options->disassemble)
+        SpirvToolsDisassemble(std::cout, spirv);
 
-        if (!optimizer.Run(spirv.data(), spirv.size(), &spirv))
-            return;
-    }
 #endif
 
-    glslang::GetThreadPoolAllocator().pop();
+    GetThreadPoolAllocator().pop();
 }
 
 }; // end namespace glslang
diff --git a/SPIRV/GlslangToSpv.h b/SPIRV/GlslangToSpv.h
old mode 100644
new mode 100755
index f7f7cff..4169c12
--- a/SPIRV/GlslangToSpv.h
+++ b/SPIRV/GlslangToSpv.h
@@ -38,6 +38,7 @@
     #pragma warning(disable : 4464) // relative include path contains '..'
 #endif
 
+#include "SpvTools.h"
 #include "../glslang/Include/intermediate.h"
 
 #include <string>
@@ -47,14 +48,6 @@
 
 namespace glslang {
 
-struct SpvOptions {
-    SpvOptions() : generateDebugInfo(false), disableOptimizer(true),
-        optimizeSize(false) { }
-    bool generateDebugInfo;
-    bool disableOptimizer;
-    bool optimizeSize;
-};
-
 void GetSpirvVersion(std::string&);
 int GetSpirvGeneratorVersion();
 void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
diff --git a/SPIRV/SPVRemapper.cpp b/SPIRV/SPVRemapper.cpp
old mode 100755
new mode 100644
diff --git a/SPIRV/SPVRemapper.h b/SPIRV/SPVRemapper.h
old mode 100755
new mode 100644
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
old mode 100755
new mode 100644
index 10d655b..7d77934
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -81,6 +81,7 @@
 {
     Instruction* import = new Instruction(getUniqueId(), NoType, OpExtInstImport);
     import->addStringOperand(name);
+    module.mapInstruction(import);
 
     imports.push_back(std::unique_ptr<Instruction>(import));
     return import->getResultId();
@@ -193,10 +194,8 @@
     // deal with capabilities
     switch (width) {
     case 8:
-        addCapability(CapabilityInt8);
-        break;
     case 16:
-        addCapability(CapabilityInt16);
+        // these are currently handled by storage-type declarations and post processing
         break;
     case 64:
         addCapability(CapabilityInt64);
@@ -228,7 +227,7 @@
     // deal with capabilities
     switch (width) {
     case 16:
-        addCapability(CapabilityFloat16);
+        // currently handled by storage-type declarations and post processing
         break;
     case 64:
         addCapability(CapabilityFloat64);
@@ -504,12 +503,27 @@
     return type->getResultId();
 }
 
+#ifdef NV_EXTENSIONS
+Id Builder::makeAccelerationStructureNVType()
+{
+    Instruction *type;
+    if (groupedTypes[OpTypeAccelerationStructureNVX].size() == 0) {
+        type = new Instruction(getUniqueId(), NoType, OpTypeAccelerationStructureNVX);
+        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
+        module.mapInstruction(type);
+    } else {
+        type = groupedTypes[OpTypeAccelerationStructureNVX].back();
+    }
+
+    return type->getResultId();
+}
+#endif
 Id Builder::getDerefTypeId(Id resultId) const
 {
     Id typeId = getTypeId(resultId);
     assert(isPointerType(typeId));
 
-    return module.getInstruction(typeId)->getImmediateOperand(1);
+    return module.getInstruction(typeId)->getIdOperand(1);
 }
 
 Op Builder::getMostBasicTypeClass(Id typeId) const
@@ -519,12 +533,6 @@
     Op typeClass = instr->getOpCode();
     switch (typeClass)
     {
-    case OpTypeVoid:
-    case OpTypeBool:
-    case OpTypeInt:
-    case OpTypeFloat:
-    case OpTypeStruct:
-        return typeClass;
     case OpTypeVector:
     case OpTypeMatrix:
     case OpTypeArray:
@@ -533,8 +541,7 @@
     case OpTypePointer:
         return getMostBasicTypeClass(instr->getIdOperand(1));
     default:
-        assert(0);
-        return OpTypeFloat;
+        return typeClass;
     }
 }
 
@@ -553,7 +560,7 @@
         return instr->getImmediateOperand(1);
     case OpTypeArray:
     {
-        Id lengthId = instr->getImmediateOperand(1);
+        Id lengthId = instr->getIdOperand(1);
         return module.getInstruction(lengthId)->getImmediateOperand(0);
     }
     case OpTypeStruct:
@@ -621,6 +628,36 @@
     return getContainedTypeId(typeId, 0);
 }
 
+// Returns true if 'typeId' is or contains a scalar type declared with 'typeOp'
+// of width 'width'. The 'width' is only consumed for int and float types.
+// Returns false otherwise.
+bool Builder::containsType(Id typeId, spv::Op typeOp, unsigned int width) const
+{
+    const Instruction& instr = *module.getInstruction(typeId);
+
+    Op typeClass = instr.getOpCode();
+    switch (typeClass)
+    {
+    case OpTypeInt:
+    case OpTypeFloat:
+        return typeClass == typeOp && instr.getImmediateOperand(0) == width;
+    case OpTypeStruct:
+        for (int m = 0; m < instr.getNumOperands(); ++m) {
+            if (containsType(instr.getIdOperand(m), typeOp, width))
+                return true;
+        }
+        return false;
+    case OpTypeVector:
+    case OpTypeMatrix:
+    case OpTypeArray:
+    case OpTypeRuntimeArray:
+    case OpTypePointer:
+        return containsType(getContainedTypeId(typeId), typeOp, width);
+    default:
+        return typeClass == typeOp;
+    }
+}
+
 // See if a scalar constant of this type has already been created, so it
 // can be reused rather than duplicated.  (Required by the specification).
 Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value)
@@ -1194,19 +1231,35 @@
 }
 
 // Comments in header
-void Builder::createStore(Id rValue, Id lValue)
+void Builder::createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     Instruction* store = new Instruction(OpStore);
     store->addIdOperand(lValue);
     store->addIdOperand(rValue);
+
+    if (memoryAccess != MemoryAccessMaskNone) {
+        store->addImmediateOperand(memoryAccess);
+        if (memoryAccess & spv::MemoryAccessMakePointerAvailableKHRMask) {
+            store->addIdOperand(makeUintConstant(scope));
+        }
+    }
+
     buildPoint->addInstruction(std::unique_ptr<Instruction>(store));
 }
 
 // Comments in header
-Id Builder::createLoad(Id lValue)
+Id Builder::createLoad(Id lValue, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     Instruction* load = new Instruction(getUniqueId(), getDerefTypeId(lValue), OpLoad);
     load->addIdOperand(lValue);
+
+    if (memoryAccess != MemoryAccessMaskNone) {
+        load->addImmediateOperand(memoryAccess);
+        if (memoryAccess & spv::MemoryAccessMakePointerVisibleKHRMask) {
+            load->addIdOperand(makeUintConstant(scope));
+        }
+    }
+
     buildPoint->addInstruction(std::unique_ptr<Instruction>(load));
 
     return load->getResultId();
@@ -1331,7 +1384,7 @@
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
-// An opcode that has one operand, no result id, and no type
+// An opcode that has one id operand, no result id, and no type
 void Builder::createNoResultOp(Op opCode, Id operand)
 {
     Instruction* op = new Instruction(opCode);
@@ -1339,29 +1392,43 @@
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
-// An opcode that has one operand, no result id, and no type
+// An opcode that has one or more operands, no result id, and no type
 void Builder::createNoResultOp(Op opCode, const std::vector<Id>& operands)
 {
     Instruction* op = new Instruction(opCode);
-    for (auto it = operands.cbegin(); it != operands.cend(); ++it)
+    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {
         op->addIdOperand(*it);
+    }
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
+}
+
+// An opcode that has multiple operands, no result id, and no type
+void Builder::createNoResultOp(Op opCode, const std::vector<IdImmediate>& operands)
+{
+    Instruction* op = new Instruction(opCode);
+    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {
+        if (it->isId)
+            op->addIdOperand(it->word);
+        else
+            op->addImmediateOperand(it->word);
+    }
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
 void Builder::createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask semantics)
 {
     Instruction* op = new Instruction(OpControlBarrier);
-    op->addImmediateOperand(makeUintConstant(execution));
-    op->addImmediateOperand(makeUintConstant(memory));
-    op->addImmediateOperand(makeUintConstant(semantics));
+    op->addIdOperand(makeUintConstant(execution));
+    op->addIdOperand(makeUintConstant(memory));
+    op->addIdOperand(makeUintConstant(semantics));
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
 void Builder::createMemoryBarrier(unsigned executionScope, unsigned memorySemantics)
 {
     Instruction* op = new Instruction(OpMemoryBarrier);
-    op->addImmediateOperand(makeUintConstant(executionScope));
-    op->addImmediateOperand(makeUintConstant(memorySemantics));
+    op->addIdOperand(makeUintConstant(executionScope));
+    op->addIdOperand(makeUintConstant(memorySemantics));
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
@@ -1428,6 +1495,20 @@
     return op->getResultId();
 }
 
+Id Builder::createOp(Op opCode, Id typeId, const std::vector<IdImmediate>& operands)
+{
+    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);
+    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {
+        if (it->isId)
+            op->addIdOperand(it->word);
+        else
+            op->addImmediateOperand(it->word);
+    }
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
+
+    return op->getResultId();
+}
+
 Id Builder::createSpecConstantOp(Op opCode, Id typeId, const std::vector<Id>& operands, const std::vector<unsigned>& literals)
 {
     Instruction* op = new Instruction(getUniqueId(), typeId, OpSpecConstantOp);
@@ -1588,6 +1669,13 @@
     if (parameters.component != NoResult)
         texArgs[numArgs++] = parameters.component;
 
+#ifdef NV_EXTENSIONS
+    if (parameters.granularity != NoResult)
+        texArgs[numArgs++] = parameters.granularity;
+    if (parameters.coarse != NoResult)
+        texArgs[numArgs++] = parameters.coarse;
+#endif 
+
     //
     // Set up the optional arguments
     //
@@ -1639,6 +1727,12 @@
         mask = (ImageOperandsMask)(mask | ImageOperandsMinLodMask);
         texArgs[numArgs++] = parameters.lodClamp;
     }
+    if (parameters.nonprivate) {
+        mask = mask | ImageOperandsNonPrivateTexelKHRMask;
+    }
+    if (parameters.volatil) {
+        mask = mask | ImageOperandsVolatileTexelKHRMask;
+    }
     if (mask == ImageOperandsMaskNone)
         --numArgs;  // undo speculative reservation for the mask argument
     else
@@ -1653,6 +1747,10 @@
             opCode = OpImageSparseFetch;
         else
             opCode = OpImageFetch;
+#ifdef NV_EXTENSIONS
+    } else if (parameters.granularity && parameters.coarse) {
+        opCode = OpImageSampleFootprintNV;
+#endif
     } else if (gather) {
         if (parameters.Dref)
             if (sparse)
@@ -1774,9 +1872,6 @@
 // Comments in header
 Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameters, bool isUnsignedResult)
 {
-    // All these need a capability
-    addCapability(CapabilityImageQuery);
-
     // Figure out the result type
     Id resultType = 0;
     switch (opCode) {
@@ -2029,9 +2124,39 @@
     int numRows = getTypeNumRows(resultTypeId);
 
     Instruction* instr = module.getInstruction(componentTypeId);
-    Id bitCount = instr->getIdOperand(0);
+    unsigned bitCount = instr->getImmediateOperand(0);
 
-    // Will use a two step process
+    // Optimize matrix constructed from a bigger matrix
+    if (isMatrix(sources[0]) && getNumColumns(sources[0]) >= numCols && getNumRows(sources[0]) >= numRows) {
+        // To truncate the matrix to a smaller number of rows/columns, we need to:
+        // 1. For each column, extract the column and truncate it to the required size using shuffle
+        // 2. Assemble the resulting matrix from all columns
+        Id matrix = sources[0];
+        Id columnTypeId = getContainedTypeId(resultTypeId);
+        Id sourceColumnTypeId = getContainedTypeId(getTypeId(matrix));
+
+        std::vector<unsigned> channels;
+        for (int row = 0; row < numRows; ++row)
+            channels.push_back(row);
+
+        std::vector<Id> matrixColumns;
+        for (int col = 0; col < numCols; ++col) {
+            std::vector<unsigned> indexes;
+            indexes.push_back(col);
+            Id colv = createCompositeExtract(matrix, sourceColumnTypeId, indexes);
+            setPrecision(colv, precision);
+
+            if (numRows != getNumRows(matrix)) {
+                matrixColumns.push_back(createRvalueSwizzle(precision, columnTypeId, colv, channels));
+            } else {
+                matrixColumns.push_back(colv);
+            }
+        }
+
+        return setPrecision(createCompositeConstruct(resultTypeId, matrixColumns), precision);
+    }
+
+    // Otherwise, will use a two step process
     // 1. make a compile-time 2D array of values
     // 2. construct a matrix from that array
 
@@ -2285,6 +2410,7 @@
     accessChain.component = NoResult;
     accessChain.preSwizzleBaseType = NoType;
     accessChain.isRValue = false;
+    accessChain.coherentFlags.clear();
 }
 
 // Comments in header
@@ -2311,7 +2437,7 @@
 }
 
 // Comments in header
-void Builder::accessChainStore(Id rvalue)
+void Builder::accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     assert(accessChain.isRValue == false);
 
@@ -2329,11 +2455,11 @@
         source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle);
     }
 
-    createStore(source, base);
+    createStore(source, base, memoryAccess, scope);
 }
 
 // Comments in header
-Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType)
+Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     Id id;
 
@@ -2377,7 +2503,7 @@
     } else {
         transferAccessChainSwizzle(true);
         // load through the access chain
-        id = createLoad(collapseAccessChain());
+        id = createLoad(collapseAccessChain(), memoryAccess, scope);
         setPrecision(id, precision);
         addDecoration(id, nonUniform);
     }
@@ -2453,42 +2579,6 @@
     return type;
 }
 
-// comment in header
-void Builder::eliminateDeadDecorations() {
-    std::unordered_set<const Block*> reachable_blocks;
-    std::unordered_set<Id> unreachable_definitions;
-    // Collect IDs defined in unreachable blocks. For each function, label the
-    // reachable blocks first. Then for each unreachable block, collect the
-    // result IDs of the instructions in it.
-    for (std::vector<Function*>::const_iterator fi = module.getFunctions().cbegin();
-        fi != module.getFunctions().cend(); fi++) {
-        Function* f = *fi;
-        Block* entry = f->getEntryBlock();
-        inReadableOrder(entry, [&reachable_blocks](const Block* b) {
-            reachable_blocks.insert(b);
-        });
-        for (std::vector<Block*>::const_iterator bi = f->getBlocks().cbegin();
-            bi != f->getBlocks().cend(); bi++) {
-            Block* b = *bi;
-            if (!reachable_blocks.count(b)) {
-                for (std::vector<std::unique_ptr<Instruction> >::const_iterator
-                         ii = b->getInstructions().cbegin();
-                    ii != b->getInstructions().cend(); ii++) {
-                    Instruction* i = ii->get();
-                    unreachable_definitions.insert(i->getResultId());
-                }
-            }
-        }
-    }
-    decorations.erase(std::remove_if(decorations.begin(), decorations.end(),
-        [&unreachable_definitions](std::unique_ptr<Instruction>& I) -> bool {
-            Instruction* inst = I.get();
-            Id decoration_id = inst->getIdOperand(0);
-            return unreachable_definitions.count(decoration_id) != 0;
-        }),
-        decorations.end());
-}
-
 void Builder::dump(std::vector<unsigned int>& out) const
 {
     // Header, before first instructions:
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
old mode 100755
new mode 100644
index 099b1d9..7c1d421
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -131,6 +131,9 @@
     Id makeSamplerType();
     Id makeSampledImageType(Id imageType);
 
+    // accelerationStructureNV type
+    Id makeAccelerationStructureNVType();
+
     // For querying about types.
     Id getTypeId(Id resultId) const { return module.getTypeId(resultId); }
     Id getDerefTypeId(Id resultId) const;
@@ -167,6 +170,7 @@
     bool isImageType(Id typeId)        const { return getTypeClass(typeId) == OpTypeImage; }
     bool isSamplerType(Id typeId)      const { return getTypeClass(typeId) == OpTypeSampler; }
     bool isSampledImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampledImage; }
+    bool containsType(Id typeId, Op typeOp, unsigned int width) const;
 
     bool isConstantOpCode(Op opcode) const;
     bool isSpecConstantOpCode(Op opcode) const;
@@ -273,10 +277,10 @@
     Id createUndefined(Id type);
 
     // Store into an Id and return the l-value
-    void createStore(Id rValue, Id lValue);
+    void createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // Load from an Id and return it
-    Id createLoad(Id lValue);
+    Id createLoad(Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // Create an OpAccessChain instruction
     Id createAccessChain(StorageClass, Id base, const std::vector<Id>& offsets);
@@ -296,12 +300,14 @@
     void createNoResultOp(Op);
     void createNoResultOp(Op, Id operand);
     void createNoResultOp(Op, const std::vector<Id>& operands);
+    void createNoResultOp(Op, const std::vector<IdImmediate>& operands);
     void createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask);
     void createMemoryBarrier(unsigned executionScope, unsigned memorySemantics);
     Id createUnaryOp(Op, Id typeId, Id operand);
     Id createBinOp(Op, Id typeId, Id operand1, Id operand2);
     Id createTriOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);
     Id createOp(Op, Id typeId, const std::vector<Id>& operands);
+    Id createOp(Op, Id typeId, const std::vector<IdImmediate>& operands);
     Id createFunctionCall(spv::Function*, const std::vector<spv::Id>&);
     Id createSpecConstantOp(Op, Id typeId, const std::vector<spv::Id>& operands, const std::vector<unsigned>& literals);
 
@@ -363,6 +369,10 @@
         Id component;
         Id texelOut;
         Id lodClamp;
+        Id granularity;
+        Id coarse;
+        bool nonprivate;
+        bool volatil;
     };
 
     // Select the correct texture operation based on all inputs, and emit the correct instruction
@@ -502,6 +512,43 @@
         Id component;                  // a dynamic component index, can coexist with a swizzle, done after the swizzle, NoResult if not present
         Id preSwizzleBaseType;         // dereferenced type, before swizzle or component is applied; NoType unless a swizzle or component is present
         bool isRValue;                 // true if 'base' is an r-value, otherwise, base is an l-value
+
+        // Accumulate whether anything in the chain of structures has coherent decorations.
+        struct CoherentFlags {
+            unsigned coherent : 1;
+            unsigned devicecoherent : 1;
+            unsigned queuefamilycoherent : 1;
+            unsigned workgroupcoherent : 1;
+            unsigned subgroupcoherent : 1;
+            unsigned nonprivate : 1;
+            unsigned volatil : 1;
+            unsigned isImage : 1;
+
+            void clear() {
+                coherent = 0;
+                devicecoherent = 0;
+                queuefamilycoherent = 0;
+                workgroupcoherent = 0;
+                subgroupcoherent = 0;
+                nonprivate = 0;
+                volatil = 0;
+                isImage = 0;
+            }
+
+            CoherentFlags() { clear(); }
+            CoherentFlags operator |=(const CoherentFlags &other) {
+                coherent |= other.coherent;
+                devicecoherent |= other.devicecoherent;
+                queuefamilycoherent |= other.queuefamilycoherent;
+                workgroupcoherent |= other.workgroupcoherent;
+                subgroupcoherent |= other.subgroupcoherent;
+                nonprivate |= other.nonprivate;
+                volatil |= other.volatil;
+                isImage |= other.isImage;
+                return *this;
+            }
+        };
+        CoherentFlags coherentFlags;
     };
 
     //
@@ -531,9 +578,10 @@
     }
 
     // push offset onto the end of the chain
-    void accessChainPush(Id offset)
+    void accessChainPush(Id offset, AccessChain::CoherentFlags coherentFlags)
     {
         accessChain.indexChain.push_back(offset);
+        accessChain.coherentFlags |= coherentFlags;
     }
 
     // push new swizzle onto the end of any existing swizzle, merging into a single swizzle
@@ -551,10 +599,10 @@
     }
 
     // use accessChain and swizzle to store value
-    void accessChainStore(Id rvalue);
+    void accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // use accessChain and swizzle to load an r-value
-    Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType);
+    Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // get the direct pointer for an l-value
     Id accessChainGetLValue();
@@ -563,9 +611,17 @@
     // based on the type of the base and the chain of dereferences.
     Id accessChainGetInferredType();
 
-    // Remove OpDecorate instructions whose operands are defined in unreachable
-    // blocks.
-    void eliminateDeadDecorations();
+    // Add capabilities, extensions, remove unneeded decorations, etc., 
+    // based on the resulting SPIR-V.
+    void postProcess();
+
+    // Hook to visit each instruction in a block in a function
+    void postProcess(const Instruction&);
+    // Hook to visit each instruction in a reachable block in a function.
+    void postProcessReachable(const Instruction&);
+    // Hook to visit each non-32-bit sized float/int operation in a block.
+    void postProcessType(const Instruction&, spv::Id typeId);
+
     void dump(std::vector<unsigned int>&) const;
 
     void createBranch(Block* block);
diff --git a/SPIRV/SpvPostProcess.cpp b/SPIRV/SpvPostProcess.cpp
new file mode 100755
index 0000000..27f145d
--- /dev/null
+++ b/SPIRV/SpvPostProcess.cpp
@@ -0,0 +1,265 @@
+//
+// Copyright (C) 2016-2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+//
+// Post-processing for SPIR-V IR, in internal form, not standard binary form.
+//
+
+#include <cassert>
+#include <cstdlib>
+
+#include <unordered_set>
+#include <algorithm>
+
+#include "SpvBuilder.h"
+
+#include "spirv.hpp"
+#include "GlslangToSpv.h"
+#include "SpvBuilder.h"
+namespace spv {
+    #include "GLSL.std.450.h"
+    #include "GLSL.ext.KHR.h"
+    #include "GLSL.ext.EXT.h"
+#ifdef AMD_EXTENSIONS
+    #include "GLSL.ext.AMD.h"
+#endif
+#ifdef NV_EXTENSIONS
+    #include "GLSL.ext.NV.h"
+#endif
+}
+
+namespace spv {
+
+// Hook to visit each operand type and result type of an instruction.
+// Will be called multiple times for one instruction, once for each typed
+// operand and the result.
+void Builder::postProcessType(const Instruction& inst, Id typeId)
+{
+    // Characterize the type being questioned
+    Id basicTypeOp = getMostBasicTypeClass(typeId);
+    int width = 0;
+    if (basicTypeOp == OpTypeFloat || basicTypeOp == OpTypeInt)
+        width = getScalarTypeWidth(typeId);
+
+    // Do opcode-specific checks
+    switch (inst.getOpCode()) {
+    case OpLoad:
+    case OpStore:
+        if (basicTypeOp == OpTypeStruct) {
+            if (containsType(typeId, OpTypeInt, 8))
+                addCapability(CapabilityInt8);
+            if (containsType(typeId, OpTypeInt, 16))
+                addCapability(CapabilityInt16);
+            if (containsType(typeId, OpTypeFloat, 16))
+                addCapability(CapabilityFloat16);
+        } else {
+            StorageClass storageClass = getStorageClass(inst.getIdOperand(0));
+            if (width == 8) {
+                switch (storageClass) {
+                case StorageClassUniform:
+                case StorageClassStorageBuffer:
+                case StorageClassPushConstant:
+                    break;
+                default:
+                    addCapability(CapabilityInt8);
+                    break;
+                }
+            } else if (width == 16) {
+                switch (storageClass) {
+                case StorageClassUniform:
+                case StorageClassStorageBuffer:
+                case StorageClassPushConstant:
+                case StorageClassInput:
+                case StorageClassOutput:
+                    break;
+                default:
+                    if (basicTypeOp == OpTypeInt)
+                        addCapability(CapabilityInt16);
+                    if (basicTypeOp == OpTypeFloat)
+                        addCapability(CapabilityFloat16);
+                    break;
+                }
+            }
+        }
+        break;
+    case OpAccessChain:
+    case OpPtrAccessChain:
+    case OpCopyObject:
+    case OpFConvert:
+    case OpSConvert:
+    case OpUConvert:
+        break;
+    case OpExtInst:
+        switch (inst.getImmediateOperand(1)) {
+#if AMD_EXTENSIONS
+        case GLSLstd450Frexp:
+        case GLSLstd450FrexpStruct:
+            if (getSpvVersion() < glslang::EShTargetSpv_1_3 && containsType(typeId, OpTypeInt, 16))
+                addExtension(spv::E_SPV_AMD_gpu_shader_int16);
+            break;
+        case GLSLstd450InterpolateAtCentroid:
+        case GLSLstd450InterpolateAtSample:
+        case GLSLstd450InterpolateAtOffset:
+            if (getSpvVersion() < glslang::EShTargetSpv_1_3 && containsType(typeId, OpTypeFloat, 16))
+                addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
+            break;
+#endif
+        default:
+            break;
+        }
+        break;
+    default:
+        if (basicTypeOp == OpTypeFloat && width == 16)
+            addCapability(CapabilityFloat16);
+        if (basicTypeOp == OpTypeInt && width == 16)
+            addCapability(CapabilityInt16);
+        if (basicTypeOp == OpTypeInt && width == 8)
+            addCapability(CapabilityInt8);
+        break;
+    }
+}
+
+// Called for each instruction that resides in a block.
+void Builder::postProcess(const Instruction& inst)
+{
+    // Add capabilities based simply on the opcode.
+    switch (inst.getOpCode()) {
+    case OpExtInst:
+        switch (inst.getImmediateOperand(1)) {
+        case GLSLstd450InterpolateAtCentroid:
+        case GLSLstd450InterpolateAtSample:
+        case GLSLstd450InterpolateAtOffset:
+            addCapability(CapabilityInterpolationFunction);
+            break;
+        default:
+            break;
+        }
+        break;
+    case OpDPdxFine:
+    case OpDPdyFine:
+    case OpFwidthFine:
+    case OpDPdxCoarse:
+    case OpDPdyCoarse:
+    case OpFwidthCoarse:
+        addCapability(CapabilityDerivativeControl);
+        break;
+
+    case OpImageQueryLod:
+    case OpImageQuerySize:
+    case OpImageQuerySizeLod:
+    case OpImageQuerySamples:
+    case OpImageQueryLevels:
+        addCapability(CapabilityImageQuery);
+        break;
+
+#ifdef NV_EXTENSIONS
+    case OpGroupNonUniformPartitionNV:
+        addExtension(E_SPV_NV_shader_subgroup_partitioned);
+        addCapability(CapabilityGroupNonUniformPartitionedNV);
+        break;
+#endif
+
+    default:
+        break;
+    }
+
+    // Checks based on type
+    if (inst.getTypeId() != NoType)
+        postProcessType(inst, inst.getTypeId());
+    for (int op = 0; op < inst.getNumOperands(); ++op) {
+        if (inst.isIdOperand(op)) {
+            // In blocks, these are always result ids, but we are relying on
+            // getTypeId() to return NoType for things like OpLabel.
+            if (getTypeId(inst.getIdOperand(op)) != NoType)
+                postProcessType(inst, getTypeId(inst.getIdOperand(op)));
+        }
+    }
+}
+
+// Called for each instruction in a reachable block.
+void Builder::postProcessReachable(const Instruction& inst)
+{
+    // did have code here, but questionable to do so without deleting the instructions
+}
+
+// comment in header
+void Builder::postProcess()
+{
+    std::unordered_set<const Block*> reachableBlocks;
+    std::unordered_set<Id> unreachableDefinitions;
+    // Collect IDs defined in unreachable blocks. For each function, label the
+    // reachable blocks first. Then for each unreachable block, collect the
+    // result IDs of the instructions in it.
+    for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {
+        Function* f = *fi;
+        Block* entry = f->getEntryBlock();
+        inReadableOrder(entry, [&reachableBlocks](const Block* b) { reachableBlocks.insert(b); });
+        for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {
+            Block* b = *bi;
+            if (reachableBlocks.count(b) == 0) {
+                for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ii++)
+                    unreachableDefinitions.insert(ii->get()->getResultId());
+            }
+        }
+    }
+
+    // Remove unneeded decorations, for unreachable instructions
+    decorations.erase(std::remove_if(decorations.begin(), decorations.end(),
+        [&unreachableDefinitions](std::unique_ptr<Instruction>& I) -> bool {
+            Id decoration_id = I.get()->getIdOperand(0);
+            return unreachableDefinitions.count(decoration_id) != 0;
+        }),
+        decorations.end());
+
+    // Add per-instruction capabilities, extensions, etc.,
+
+    // process all reachable instructions...
+    for (auto bi = reachableBlocks.cbegin(); bi != reachableBlocks.cend(); ++bi) {
+        const Block* block = *bi;
+        const auto function = [this](const std::unique_ptr<Instruction>& inst) { postProcessReachable(*inst.get()); };
+        std::for_each(block->getInstructions().begin(), block->getInstructions().end(), function);
+    }
+
+    // process all block-contained instructions
+    for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {
+        Function* f = *fi;
+        for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {
+            Block* b = *bi;
+            for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ii++)
+                postProcess(*ii->get());
+        }
+    }
+}
+
+}; // end spv namespace
diff --git a/SPIRV/SpvTools.cpp b/SPIRV/SpvTools.cpp
new file mode 100755
index 0000000..4807b42
--- /dev/null
+++ b/SPIRV/SpvTools.cpp
@@ -0,0 +1,188 @@
+//
+// Copyright (C) 2014-2016 LunarG, Inc.
+// Copyright (C) 2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+//
+// Call into SPIRV-Tools to disassemble, validate, and optimize.
+//
+
+#if ENABLE_OPT
+
+#include <cstdio>
+#include <iostream>
+
+#include "SpvTools.h"
+#include "spirv-tools/optimizer.hpp"
+#include "spirv-tools/libspirv.h"
+
+namespace glslang {
+
+// Translate glslang's view of target versioning to what SPIRV-Tools uses.
+spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger)
+{
+    switch (spvVersion.vulkan) {
+    case glslang::EShTargetVulkan_1_0: return spv_target_env::SPV_ENV_VULKAN_1_0;
+    case glslang::EShTargetVulkan_1_1: return spv_target_env::SPV_ENV_VULKAN_1_1;
+    default:
+        break;
+    }
+
+    if (spvVersion.openGl > 0)
+        return spv_target_env::SPV_ENV_OPENGL_4_5;
+
+    logger->missingFunctionality("Target version for SPIRV-Tools validator");
+    return spv_target_env::SPV_ENV_UNIVERSAL_1_0;
+}
+
+
+// Use the SPIRV-Tools disassembler to print SPIR-V.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv)
+{
+    // disassemble
+    spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3);
+    spv_text text;
+    spv_diagnostic diagnostic = nullptr;
+    spvBinaryToText(context, spirv.data(), spirv.size(),
+        SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES | SPV_BINARY_TO_TEXT_OPTION_INDENT,
+        &text, &diagnostic);
+
+    // dump
+    if (diagnostic == nullptr)
+        out << text->str;
+    else
+        spvDiagnosticPrint(diagnostic);
+
+    // teardown
+    spvDiagnosticDestroy(diagnostic);
+    spvContextDestroy(context);
+}
+
+// Apply the SPIRV-Tools validator to generated SPIR-V.
+void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger* logger)
+{
+    // validate
+    spv_context context = spvContextCreate(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
+    spv_const_binary_t binary = { spirv.data(), spirv.size() };
+    spv_diagnostic diagnostic = nullptr;
+    spv_validator_options options = spvValidatorOptionsCreate();
+    spvValidatorOptionsSetRelaxBlockLayout(options, intermediate.usingHlslOffsets());
+    spvValidateWithOptions(context, options, &binary, &diagnostic);
+
+    // report
+    if (diagnostic != nullptr) {
+        logger->error("SPIRV-Tools Validation Errors");
+        logger->error(diagnostic->error);
+    }
+
+    // tear down
+    spvValidatorOptionsDestroy(options);
+    spvDiagnosticDestroy(diagnostic);
+    spvContextDestroy(context);
+}
+
+// Apply the SPIRV-Tools optimizer to generated SPIR-V, for the purpose of
+// legalizing HLSL SPIR-V.
+void SpirvToolsLegalize(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger* logger, const SpvOptions* options)
+{
+    spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+
+    spvtools::Optimizer optimizer(target_env);
+    optimizer.SetMessageConsumer(
+        [](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) {
+            auto &out = std::cerr;
+            switch (level)
+            {
+            case SPV_MSG_FATAL:
+            case SPV_MSG_INTERNAL_ERROR:
+            case SPV_MSG_ERROR:
+                out << "error: ";
+                break;
+            case SPV_MSG_WARNING:
+                out << "warning: ";
+                break;
+            case SPV_MSG_INFO:
+            case SPV_MSG_DEBUG:
+                out << "info: ";
+                break;
+            default:
+                break;
+            }
+            if (source)
+            {
+                out << source << ":";
+            }
+            out << position.line << ":" << position.column << ":" << position.index << ":";
+            if (message)
+            {
+                out << " " << message;
+            }
+            out << std::endl;
+        });
+
+    optimizer.RegisterPass(spvtools::CreateMergeReturnPass());
+    optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass());
+    optimizer.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass());
+    optimizer.RegisterPass(spvtools::CreateScalarReplacementPass());
+    optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass());
+    optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass());
+    optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass());
+    optimizer.RegisterPass(spvtools::CreateSimplificationPass());
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
+    optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
+    optimizer.RegisterPass(spvtools::CreateBlockMergePass());
+    optimizer.RegisterPass(spvtools::CreateLocalMultiStoreElimPass());
+    optimizer.RegisterPass(spvtools::CreateIfConversionPass());
+    optimizer.RegisterPass(spvtools::CreateSimplificationPass());
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
+    optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
+    if (options->optimizeSize) {
+        optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
+        // TODO(greg-lunarg): Add this when AMD driver issues are resolved
+        // optimizer.RegisterPass(CreateCommonUniformElimPass());
+    }
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
+
+    optimizer.Run(spirv.data(), spirv.size(), &spirv, spvtools::ValidatorOptions(), true);
+}
+
+}; // end namespace glslang
+
+#endif
diff --git a/SPIRV/SpvTools.h b/SPIRV/SpvTools.h
new file mode 100755
index 0000000..08bcf3a
--- /dev/null
+++ b/SPIRV/SpvTools.h
@@ -0,0 +1,80 @@
+//
+// Copyright (C) 2014-2016 LunarG, Inc.
+// Copyright (C) 2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+//
+// Call into SPIRV-Tools to disassemble, validate, and optimize.
+//
+
+#pragma once
+#ifndef GLSLANG_SPV_TOOLS_H
+#define GLSLANG_SPV_TOOLS_H
+
+#include <vector>
+#include <ostream>
+
+#include "../glslang/MachineIndependent/localintermediate.h"
+#include "Logger.h"
+
+namespace glslang {
+
+struct SpvOptions {
+    SpvOptions() : generateDebugInfo(false), disableOptimizer(true),
+        optimizeSize(false), disassemble(false), validate(false) { }
+    bool generateDebugInfo;
+    bool disableOptimizer;
+    bool optimizeSize;
+    bool disassemble;
+    bool validate;
+};
+
+#if ENABLE_OPT
+
+// Use the SPIRV-Tools disassembler to print SPIR-V.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv);
+
+// Apply the SPIRV-Tools validator to generated SPIR-V.
+void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger*);
+
+// Apply the SPIRV-Tools optimizer to generated SPIR-V, for the purpose of
+// legalizing HLSL SPIR-V.
+void SpirvToolsLegalize(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger*, const SpvOptions*);
+
+#endif
+
+}; // end namespace glslang
+
+#endif // GLSLANG_SPV_TOOLS_H
\ No newline at end of file
diff --git a/SPIRV/bitutils.h b/SPIRV/bitutils.h
index 31288ab..22e44ce 100644
--- a/SPIRV/bitutils.h
+++ b/SPIRV/bitutils.h
@@ -26,7 +26,7 @@
   Dest dest;
   static_assert(sizeof(source) == sizeof(dest),
                 "BitwiseCast: Source and destination must have the same size");
-  std::memcpy(&dest, &source, sizeof(dest));
+  std::memcpy(static_cast<void*>(&dest), &source, sizeof(dest));
   return dest;
 }
 
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
old mode 100755
new mode 100644
index a8efd69..22c83ea
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -46,6 +46,7 @@
 
 #include "disassemble.h"
 #include "doc.h"
+#include "SpvTools.h"
 
 namespace spv {
     extern "C" {
@@ -509,7 +510,9 @@
                 }else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||
                           strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||
                           strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 ||
-                          strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
+                          strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 || 
+                          strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 ||
+                          strcmp(spv::E_SPV_NV_mesh_shader, name) == 0) {
                     extInstSet = GLSLextNVInst;
 #endif
                 }
@@ -534,6 +537,11 @@
         case OperandLiteralString:
             numOperands -= disassembleString();
             break;
+        case OperandMemoryAccess:
+            outputMask(OperandMemoryAccess, stream[word++]);
+            --numOperands;
+            disassembleIds(numOperands);
+            return;
         default:
             assert(operandClass >= OperandSource && operandClass < OperandOpcode);
 
@@ -685,21 +693,45 @@
         strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||
         strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||
         strcmp(name, spv::E_SPV_NV_viewport_array2) == 0 ||
-        strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
+        strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 ||
+        strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 ||
+        strcmp(name, spv::E_SPV_NV_mesh_shader) == 0) {
         switch (entrypoint) {
-        case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
-        case DecorationPassthroughNV:               return "PassthroughNV";
-        case CapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV";
-        case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
+        // NV builtins
         case BuiltInViewportMaskNV:                 return "ViewportMaskNV";
-        case CapabilityShaderViewportMaskNV:        return "ShaderViewportMaskNV";
-        case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
         case BuiltInSecondaryPositionNV:            return "SecondaryPositionNV";
         case BuiltInSecondaryViewportMaskNV:        return "SecondaryViewportMaskNV";
-        case CapabilityShaderStereoViewNV:          return "ShaderStereoViewNV";
         case BuiltInPositionPerViewNV:              return "PositionPerViewNV";
         case BuiltInViewportMaskPerViewNV:          return "ViewportMaskPerViewNV";
+        case BuiltInBaryCoordNV:                    return "BaryCoordNV";
+        case BuiltInBaryCoordNoPerspNV:             return "BaryCoordNoPerspNV";
+        case BuiltInTaskCountNV:                    return "TaskCountNV";
+        case BuiltInPrimitiveCountNV:               return "PrimitiveCountNV";
+        case BuiltInPrimitiveIndicesNV:             return "PrimitiveIndicesNV";
+        case BuiltInClipDistancePerViewNV:          return "ClipDistancePerViewNV";
+        case BuiltInCullDistancePerViewNV:          return "CullDistancePerViewNV";
+        case BuiltInLayerPerViewNV:                 return "LayerPerViewNV";
+        case BuiltInMeshViewCountNV:                return "MeshViewCountNV";
+        case BuiltInMeshViewIndicesNV:              return "MeshViewIndicesNV";
+
+        // NV Capabilities
+        case CapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV";
+        case CapabilityShaderViewportMaskNV:        return "ShaderViewportMaskNV";
+        case CapabilityShaderStereoViewNV:          return "ShaderStereoViewNV";
         case CapabilityPerViewAttributesNV:         return "PerViewAttributesNV";
+        case CapabilityFragmentBarycentricNV:       return "FragmentBarycentricNV";
+        case CapabilityMeshShadingNV:               return "MeshShadingNV";
+
+        // NV Decorations
+        case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
+        case DecorationPassthroughNV:               return "PassthroughNV";
+        case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
+        case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
+        case DecorationPerVertexNV:                 return "PerVertexNV";
+        case DecorationPerPrimitiveNV:              return "PerPrimitiveNV";
+        case DecorationPerViewNV:                   return "PerViewNV";
+        case DecorationPerTaskNV:                   return "PerTaskNV";
+
         default:                                    return "Bad";
         }
     }
@@ -716,25 +748,4 @@
     SpirvStream.processInstructions();
 }
 
-#if ENABLE_OPT
-
-#include "spirv-tools/libspirv.h"
-
-// Use the SPIRV-Tools disassembler to print SPIR-V.
-void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv)
-{
-    spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3);
-    spv_text text;
-    spv_diagnostic diagnostic = nullptr;
-    spvBinaryToText(context, &spirv.front(), spirv.size(),
-        SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES | SPV_BINARY_TO_TEXT_OPTION_INDENT,
-        &text, &diagnostic);
-    if (diagnostic == nullptr)
-        out << text->str;
-    else
-        spvDiagnosticPrint(diagnostic);
-}
-
-#endif
-
 }; // end namespace spv
diff --git a/SPIRV/disassemble.h b/SPIRV/disassemble.h
old mode 100755
new mode 100644
index bdde5cb..2a9a89b
--- a/SPIRV/disassemble.h
+++ b/SPIRV/disassemble.h
@@ -48,9 +48,6 @@
     // disassemble with glslang custom disassembler
     void Disassemble(std::ostream& out, const std::vector<unsigned int>&);
 
-    // disassemble with SPIRV-Tools disassembler
-    void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& stream);
-
 };  // end namespace spv
 
 #endif // disassembler_H
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
old mode 100755
new mode 100644
index ae32efe..dbbe97d
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -98,8 +98,22 @@
     case 4:  return "Fragment";
     case 5:  return "GLCompute";
     case 6:  return "Kernel";
+#ifdef NV_EXTENSIONS
+    case ExecutionModelTaskNV: return "TaskNV";
+    case ExecutionModelMeshNV: return "MeshNV";
+#endif
 
     default: return "Bad";
+
+#ifdef NV_EXTENSIONS
+    case ExecutionModelRayGenerationNVX: return "RayGenerationNVX";
+    case ExecutionModelIntersectionNVX:  return "IntersectionNVX";
+    case ExecutionModelAnyHitNVX:        return "AnyHitNVX";
+    case ExecutionModelClosestHitNVX:    return "ClosestHitNVX";
+    case ExecutionModelMissNVX:          return "MissNVX";
+    case ExecutionModelCallableNVX:      return "CallableNVX";
+#endif
+
     }
 }
 
@@ -117,9 +131,10 @@
 const char* MemoryString(int mem)
 {
     switch (mem) {
-    case 0:  return "Simple";
-    case 1:  return "GLSL450";
-    case 2:  return "OpenCL";
+    case MemoryModelSimple:     return "Simple";
+    case MemoryModelGLSL450:    return "GLSL450";
+    case MemoryModelOpenCL:     return "OpenCL";
+    case MemoryModelVulkanKHR:  return "VulkanKHR";
 
     default: return "Bad";
     }
@@ -165,6 +180,15 @@
     case 32: return "Bad";
 
     case 4446:  return "PostDepthCoverage";
+
+#ifdef NV_EXTENSIONS
+    case ExecutionModeOutputLinesNV:            return "OutputLinesNV";
+    case ExecutionModeOutputPrimitivesNV:       return "OutputPrimitivesNV";
+    case ExecutionModeOutputTrianglesNV:        return "OutputTrianglesNV";
+    case ExecutionModeDerivativeGroupQuadsNV:   return "DerivativeGroupQuadsNV";
+    case ExecutionModeDerivativeGroupLinearNV:  return "DerivativeGroupLinearNV";
+#endif
+
     case ExecutionModeCeiling:
     default: return "Bad";
     }
@@ -187,6 +211,13 @@
     case 11: return "Image";
     case 12: return "StorageBuffer";
 
+#ifdef NV_EXTENSIONS
+    case StorageClassRayPayloadNVX:         return "RayPayloadNVX";
+    case StorageClassHitAttributeNVX:       return "HitAttributeNVX";
+    case StorageClassIncomingRayPayloadNVX: return "IncomingRayPayloadNVX";
+    case StorageClassShaderRecordBufferNVX: return "ShaderRecordBufferNVX";
+#endif
+
     default: return "Bad";
     }
 }
@@ -253,6 +284,10 @@
     case DecorationPassthroughNV:               return "PassthroughNV";
     case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
     case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
+    case DecorationPerPrimitiveNV:              return "PerPrimitiveNV";
+    case DecorationPerViewNV:                   return "PerViewNV";
+    case DecorationPerTaskNV:                   return "PerTaskNV";
+    case DecorationPerVertexNV:                 return "PerVertexNV";
 #endif
 
     case DecorationNonUniformEXT:           return "DecorationNonUniformEXT";
@@ -332,15 +367,44 @@
 #endif
 
 #ifdef NV_EXTENSIONS
-    case 5253: return "ViewportMaskNV";
-    case 5257: return "SecondaryPositionNV";
-    case 5258: return "SecondaryViewportMaskNV";
-    case 5261: return "PositionPerViewNV";
-    case 5262: return "ViewportMaskPerViewNV";
+    case BuiltInLaunchIdNVX:                return "LaunchIdNVX";
+    case BuiltInLaunchSizeNVX:              return "LaunchSizeNVX";
+    case BuiltInWorldRayOriginNVX:          return "WorldRayOriginNVX";
+    case BuiltInWorldRayDirectionNVX:       return "WorldRayDirectionNVX";
+    case BuiltInObjectRayOriginNVX:         return "ObjectRayOriginNVX";
+    case BuiltInObjectRayDirectionNVX:      return "ObjectRayDirectionNVX";
+    case BuiltInRayTminNVX:                 return "RayTminNVX";
+    case BuiltInRayTmaxNVX:                 return "RayTmaxNVX";
+    case BuiltInInstanceCustomIndexNVX:     return "InstanceCustomIndexNVX";
+    case BuiltInObjectToWorldNVX:           return "ObjectToWorldNVX";
+    case BuiltInWorldToObjectNVX:           return "WorldToObjectNVX";
+    case BuiltInHitTNVX:                    return "HitTNVX";
+    case BuiltInHitKindNVX:                 return "HitKindNVX";
+    case BuiltInViewportMaskNV:             return "ViewportMaskNV";
+    case BuiltInSecondaryPositionNV:        return "SecondaryPositionNV";
+    case BuiltInSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
+    case BuiltInPositionPerViewNV:          return "PositionPerViewNV";
+    case BuiltInViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
+    case BuiltInFragmentSizeNV:             return "FragmentSizeNV";
+    case BuiltInInvocationsPerPixelNV:      return "InvocationsPerPixelNV";
+    case BuiltInBaryCoordNV:                return "BaryCoordNV";
+    case BuiltInBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
 #endif
 
     case 5264: return "FullyCoveredEXT";
 
+
+#ifdef NV_EXTENSIONS
+    case BuiltInTaskCountNV:           return "TaskCountNV";
+    case BuiltInPrimitiveCountNV:      return "PrimitiveCountNV";
+    case BuiltInPrimitiveIndicesNV:    return "PrimitiveIndicesNV";
+    case BuiltInClipDistancePerViewNV: return "ClipDistancePerViewNV";
+    case BuiltInCullDistancePerViewNV: return "CullDistancePerViewNV";
+    case BuiltInLayerPerViewNV:        return "LayerPerViewNV";
+    case BuiltInMeshViewCountNV:       return "MeshViewCountNV";
+    case BuiltInMeshViewIndicesNV:     return "MeshViewIndicesNV";
+#endif
+
     default: return "Bad";
     }
 }
@@ -499,19 +563,23 @@
     }
 }
 
-const int ImageOperandsCeiling = 8;
+const int ImageOperandsCeiling = 12;
 
 const char* ImageOperandsString(int format)
 {
     switch (format) {
-    case 0: return "Bias";
-    case 1: return "Lod";
-    case 2: return "Grad";
-    case 3: return "ConstOffset";
-    case 4: return "Offset";
-    case 5: return "ConstOffsets";
-    case 6: return "Sample";
-    case 7: return "MinLod";
+    case ImageOperandsBiasShift:                    return "Bias";
+    case ImageOperandsLodShift:                     return "Lod";
+    case ImageOperandsGradShift:                    return "Grad";
+    case ImageOperandsConstOffsetShift:             return "ConstOffset";
+    case ImageOperandsOffsetShift:                  return "Offset";
+    case ImageOperandsConstOffsetsShift:            return "ConstOffsets";
+    case ImageOperandsSampleShift:                  return "Sample";
+    case ImageOperandsMinLodShift:                  return "MinLod";
+    case ImageOperandsMakeTexelAvailableKHRShift:   return "MakeTexelAvailableKHR";
+    case ImageOperandsMakeTexelVisibleKHRShift:     return "MakeTexelVisibleKHR";
+    case ImageOperandsNonPrivateTexelKHRShift:      return "NonPrivateTexelKHR";
+    case ImageOperandsVolatileTexelKHRShift:        return "VolatileTexelKHR";
 
     case ImageOperandsCeiling:
     default:
@@ -645,12 +713,17 @@
     }
 }
 
+const int MemoryAccessCeiling = 6;
+
 const char* MemoryAccessString(int mem)
 {
     switch (mem) {
-    case 0:  return "Volatile";
-    case 1:  return "Aligned";
-    case 2:  return "Nontemporal";
+    case MemoryAccessVolatileShift:                 return "Volatile";
+    case MemoryAccessAlignedShift:                  return "Aligned";
+    case MemoryAccessNontemporalShift:              return "Nontemporal";
+    case MemoryAccessMakePointerAvailableKHRShift:  return "MakePointerAvailableKHR";
+    case MemoryAccessMakePointerVisibleKHRShift:    return "MakePointerVisibleKHR";
+    case MemoryAccessNonPrivatePointerKHRShift:     return "NonPrivatePointerKHR";
 
     default: return "Bad";
     }
@@ -810,12 +883,18 @@
 
     case CapabilitySampleMaskPostDepthCoverage:  return "SampleMaskPostDepthCoverage";
 #ifdef NV_EXTENSIONS
-    case CapabilityGeometryShaderPassthroughNV:  return "GeometryShaderPassthroughNV";
-    case CapabilityShaderViewportIndexLayerNV:   return "ShaderViewportIndexLayerNV";
-    case CapabilityShaderViewportMaskNV:         return "ShaderViewportMaskNV";
-    case CapabilityShaderStereoViewNV:           return "ShaderStereoViewNV";
-    case CapabilityPerViewAttributesNV:          return "PerViewAttributesNV";
-    case CapabilityGroupNonUniformPartitionedNV: return "GroupNonUniformPartitionedNV";
+    case CapabilityGeometryShaderPassthroughNV:     return "GeometryShaderPassthroughNV";
+    case CapabilityShaderViewportIndexLayerNV:      return "ShaderViewportIndexLayerNV";
+    case CapabilityShaderViewportMaskNV:            return "ShaderViewportMaskNV";
+    case CapabilityShaderStereoViewNV:              return "ShaderStereoViewNV";
+    case CapabilityPerViewAttributesNV:             return "PerViewAttributesNV";
+    case CapabilityGroupNonUniformPartitionedNV:    return "GroupNonUniformPartitionedNV";
+    case CapabilityRaytracingNVX:                   return "RaytracingNVX";
+    case CapabilityComputeDerivativeGroupQuadsNV:   return "ComputeDerivativeGroupQuadsNV";
+    case CapabilityComputeDerivativeGroupLinearNV:  return "ComputeDerivativeGroupLinearNV";
+    case CapabilityFragmentBarycentricNV:           return "FragmentBarycentricNV";
+    case CapabilityMeshShadingNV:                   return "MeshShadingNV";
+    case CapabilityShadingRateNV:                   return "ShadingRateNV";
 #endif
 
     case CapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT";
@@ -833,6 +912,9 @@
     case CapabilityUniformTexelBufferArrayNonUniformIndexingEXT: return "CapabilityUniformTexelBufferArrayNonUniformIndexingEXT";
     case CapabilityStorageTexelBufferArrayNonUniformIndexingEXT: return "CapabilityStorageTexelBufferArrayNonUniformIndexingEXT";
 
+    case CapabilityVulkanMemoryModelKHR:                return "CapabilityVulkanMemoryModelKHR";
+    case CapabilityVulkanMemoryModelDeviceScopeKHR:     return "CapabilityVulkanMemoryModelDeviceScopeKHR";
+
     default: return "Bad";
     }
 }
@@ -1225,8 +1307,16 @@
     case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
 
 #ifdef NV_EXTENSIONS
-    case OpGroupNonUniformPartitionNV: return "OpGroupNonUniformPartitionNV";
+    case OpGroupNonUniformPartitionNV:       return "OpGroupNonUniformPartitionNV";
+    case OpReportIntersectionNVX:            return "OpReportIntersectionNVX";
+    case OpIgnoreIntersectionNVX:            return "OpIgnoreIntersectionNVX";
+    case OpTerminateRayNVX:                  return "OpTerminateRayNVX";
+    case OpTraceNVX:                         return "OpTraceNVX";
+    case OpTypeAccelerationStructureNVX:     return "OpTypeAccelerationStructureNVX";
+    case OpImageSampleFootprintNV:           return "OpImageSampleFootprintNV";
+    case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV";
 #endif
+
     default:
         return "Bad";
     }
@@ -1245,6 +1335,7 @@
 EnumParameters LoopControlParams[FunctionControlCeiling];
 EnumParameters SelectionControlParams[SelectControlCeiling];
 EnumParameters FunctionControlParams[FunctionControlCeiling];
+EnumParameters MemoryAccessParams[MemoryAccessCeiling];
 
 // Set up all the parameterizing descriptions of the opcodes, operands, etc.
 void Parameterize()
@@ -1400,7 +1491,7 @@
     OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true);
     OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true);
     OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true);
-    OperandClassParams[OperandMemoryAccess].set(0, MemoryAccessString, nullptr, true);
+    OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true);
     OperandClassParams[OperandScope].set(0, ScopeString, nullptr);
     OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr);
     OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr);
@@ -1522,10 +1613,14 @@
 
     InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpLoad].operands.push(OperandMemoryAccess, "", true);
+    InstructionDesc[OpLoad].operands.push(OperandLiteralNumber, "", true);
+    InstructionDesc[OpLoad].operands.push(OperandId, "", true);
 
     InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpStore].operands.push(OperandId, "'Object'");
     InstructionDesc[OpStore].operands.push(OperandMemoryAccess, "", true);
+    InstructionDesc[OpStore].operands.push(OperandLiteralNumber, "", true);
+    InstructionDesc[OpStore].operands.push(OperandId, "", true);
 
     InstructionDesc[OpPhi].operands.push(OperandVariableIds, "'Variable, Parent, ...'");
 
@@ -2566,6 +2661,38 @@
 
 #ifdef NV_EXTENSIONS
     InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X");
+
+    InstructionDesc[OpTypeAccelerationStructureNVX].setResultAndType(true, false);
+
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'NV Acceleration Structure'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'Ray Flags'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'Cull Mask'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'SBT Record Offset'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'SBT Record Stride'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'Miss Index'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'Ray Origin'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'TMin'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'Ray Direction'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'TMax'");
+    InstructionDesc[OpTraceNVX].operands.push(OperandId, "'Payload'");
+    InstructionDesc[OpTraceNVX].setResultAndType(false, false);
+
+    InstructionDesc[OpReportIntersectionNVX].operands.push(OperandId, "'Hit Parameter'");
+    InstructionDesc[OpReportIntersectionNVX].operands.push(OperandId, "'Hit Kind'");
+
+    InstructionDesc[OpIgnoreIntersectionNVX].setResultAndType(false, false);
+
+    InstructionDesc[OpTerminateRayNVX].setResultAndType(false, false);
+    
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coarse'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandImageOperands, "", true);
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandVariableIds, "", true);
+    
+    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'");
+    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'");
 #endif
 }
 
diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp
old mode 100755
new mode 100644
index f16c296..14605b8
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -73,6 +73,14 @@
     ExecutionModelFragment = 4,
     ExecutionModelGLCompute = 5,
     ExecutionModelKernel = 6,
+    ExecutionModelTaskNV = 5267,
+    ExecutionModelMeshNV = 5268,
+    ExecutionModelRayGenerationNVX = 5313,
+    ExecutionModelIntersectionNVX = 5314,
+    ExecutionModelAnyHitNVX = 5315,
+    ExecutionModelClosestHitNVX = 5316,
+    ExecutionModelMissNVX = 5317,
+    ExecutionModelCallableNVX = 5318,
     ExecutionModelMax = 0x7fffffff,
 };
 
@@ -87,6 +95,7 @@
     MemoryModelSimple = 0,
     MemoryModelGLSL450 = 1,
     MemoryModelOpenCL = 2,
+    MemoryModelVulkanKHR = 3,
     MemoryModelMax = 0x7fffffff,
 };
 
@@ -131,6 +140,11 @@
     ExecutionModeLocalSizeHintId = 39,
     ExecutionModePostDepthCoverage = 4446,
     ExecutionModeStencilRefReplacingEXT = 5027,
+    ExecutionModeOutputLinesNV = 5269,
+    ExecutionModeOutputPrimitivesNV = 5270,
+    ExecutionModeDerivativeGroupQuadsNV = 5289,
+    ExecutionModeDerivativeGroupLinearNV = 5290,
+    ExecutionModeOutputTrianglesNV = 5298,
     ExecutionModeMax = 0x7fffffff,
 };
 
@@ -148,6 +162,10 @@
     StorageClassAtomicCounter = 10,
     StorageClassImage = 11,
     StorageClassStorageBuffer = 12,
+    StorageClassRayPayloadNVX = 5338,
+    StorageClassHitAttributeNVX = 5339,
+    StorageClassIncomingRayPayloadNVX = 5342,
+    StorageClassShaderRecordBufferNVX = 5343,
     StorageClassMax = 0x7fffffff,
 };
 
@@ -275,6 +293,10 @@
     ImageOperandsConstOffsetsShift = 5,
     ImageOperandsSampleShift = 6,
     ImageOperandsMinLodShift = 7,
+    ImageOperandsMakeTexelAvailableKHRShift = 8,
+    ImageOperandsMakeTexelVisibleKHRShift = 9,
+    ImageOperandsNonPrivateTexelKHRShift = 10,
+    ImageOperandsVolatileTexelKHRShift = 11,
     ImageOperandsMax = 0x7fffffff,
 };
 
@@ -288,6 +310,10 @@
     ImageOperandsConstOffsetsMask = 0x00000020,
     ImageOperandsSampleMask = 0x00000040,
     ImageOperandsMinLodMask = 0x00000080,
+    ImageOperandsMakeTexelAvailableKHRMask = 0x00000100,
+    ImageOperandsMakeTexelVisibleKHRMask = 0x00000200,
+    ImageOperandsNonPrivateTexelKHRMask = 0x00000400,
+    ImageOperandsVolatileTexelKHRMask = 0x00000800,
 };
 
 enum FPFastMathModeShift {
@@ -393,6 +419,10 @@
     DecorationPassthroughNV = 5250,
     DecorationViewportRelativeNV = 5252,
     DecorationSecondaryViewportRelativeNV = 5256,
+    DecorationPerPrimitiveNV = 5271,
+    DecorationPerViewNV = 5272,
+    DecorationPerTaskNV = 5273,
+    DecorationPerVertexNV = 5285,
     DecorationNonUniformEXT = 5300,
     DecorationHlslCounterBufferGOOGLE = 5634,
     DecorationHlslSemanticGOOGLE = 5635,
@@ -470,6 +500,31 @@
     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,
+    BuiltInFragmentSizeNV = 5292,
+    BuiltInInvocationsPerPixelNV = 5293,
+    BuiltInLaunchIdNVX = 5319,
+    BuiltInLaunchSizeNVX = 5320,
+    BuiltInWorldRayOriginNVX = 5321,
+    BuiltInWorldRayDirectionNVX = 5322,
+    BuiltInObjectRayOriginNVX = 5323,
+    BuiltInObjectRayDirectionNVX = 5324,
+    BuiltInRayTminNVX = 5325,
+    BuiltInRayTmaxNVX = 5326,
+    BuiltInInstanceCustomIndexNVX = 5327,
+    BuiltInObjectToWorldNVX = 5330,
+    BuiltInWorldToObjectNVX = 5331,
+    BuiltInHitTNVX = 5332,
+    BuiltInHitKindNVX = 5333,
     BuiltInMax = 0x7fffffff,
 };
 
@@ -528,6 +583,9 @@
     MemorySemanticsCrossWorkgroupMemoryShift = 9,
     MemorySemanticsAtomicCounterMemoryShift = 10,
     MemorySemanticsImageMemoryShift = 11,
+    MemorySemanticsOutputMemoryKHRShift = 12,
+    MemorySemanticsMakeAvailableKHRShift = 13,
+    MemorySemanticsMakeVisibleKHRShift = 14,
     MemorySemanticsMax = 0x7fffffff,
 };
 
@@ -543,12 +601,18 @@
     MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,
     MemorySemanticsAtomicCounterMemoryMask = 0x00000400,
     MemorySemanticsImageMemoryMask = 0x00000800,
+    MemorySemanticsOutputMemoryKHRMask = 0x00001000,
+    MemorySemanticsMakeAvailableKHRMask = 0x00002000,
+    MemorySemanticsMakeVisibleKHRMask = 0x00004000,
 };
 
 enum MemoryAccessShift {
     MemoryAccessVolatileShift = 0,
     MemoryAccessAlignedShift = 1,
     MemoryAccessNontemporalShift = 2,
+    MemoryAccessMakePointerAvailableKHRShift = 3,
+    MemoryAccessMakePointerVisibleKHRShift = 4,
+    MemoryAccessNonPrivatePointerKHRShift = 5,
     MemoryAccessMax = 0x7fffffff,
 };
 
@@ -557,6 +621,9 @@
     MemoryAccessVolatileMask = 0x00000001,
     MemoryAccessAlignedMask = 0x00000002,
     MemoryAccessNontemporalMask = 0x00000004,
+    MemoryAccessMakePointerAvailableKHRMask = 0x00000008,
+    MemoryAccessMakePointerVisibleKHRMask = 0x00000010,
+    MemoryAccessNonPrivatePointerKHRMask = 0x00000020,
 };
 
 enum Scope {
@@ -565,6 +632,7 @@
     ScopeWorkgroup = 2,
     ScopeSubgroup = 3,
     ScopeInvocation = 4,
+    ScopeQueueFamilyKHR = 5,
     ScopeMax = 0x7fffffff,
 };
 
@@ -695,6 +763,11 @@
     CapabilityShaderStereoViewNV = 5259,
     CapabilityPerViewAttributesNV = 5260,
     CapabilityFragmentFullyCoveredEXT = 5265,
+    CapabilityMeshShadingNV = 5266,
+    CapabilityImageFootprintNV = 5282,
+    CapabilityFragmentBarycentricNV = 5284,
+    CapabilityComputeDerivativeGroupQuadsNV = 5288,
+    CapabilityShadingRateNV = 5291,
     CapabilityGroupNonUniformPartitionedNV = 5297,
     CapabilityShaderNonUniformEXT = 5301,
     CapabilityRuntimeDescriptorArrayEXT = 5302,
@@ -708,6 +781,10 @@
     CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,
     CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,
     CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
+    CapabilityRaytracingNVX = 5340,
+    CapabilityVulkanMemoryModelKHR = 5345,
+    CapabilityVulkanMemoryModelDeviceScopeKHR = 5346,
+    CapabilityComputeDerivativeGroupLinearNV = 5350,
     CapabilitySubgroupShuffleINTEL = 5568,
     CapabilitySubgroupBufferBlockIOINTEL = 5569,
     CapabilitySubgroupImageBlockIOINTEL = 5570,
@@ -1071,7 +1148,14 @@
     OpGroupSMaxNonUniformAMD = 5007,
     OpFragmentMaskFetchAMD = 5011,
     OpFragmentFetchAMD = 5012,
+    OpImageSampleFootprintNV = 5283,
     OpGroupNonUniformPartitionNV = 5296,
+    OpWritePackedPrimitiveIndices4x8NV = 5299,
+    OpReportIntersectionNVX = 5334,
+    OpIgnoreIntersectionNVX = 5335,
+    OpTerminateRayNVX = 5336,
+    OpTraceNVX = 5337,
+    OpTypeAccelerationStructureNVX = 5341,
     OpSubgroupShuffleINTEL = 5571,
     OpSubgroupShuffleDownINTEL = 5572,
     OpSubgroupShuffleUpINTEL = 5573,
diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
old mode 100755
new mode 100644
index 8b6c644..2532b17
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -79,6 +79,11 @@
                                       MemorySemanticsAtomicCounterMemoryMask |
                                       MemorySemanticsImageMemoryMask);
 
+struct IdImmediate {
+    bool isId;      // true if word is an Id, false if word is an immediate
+    unsigned word;
+};
+
 //
 // SPIR-V IR instruction.
 //
@@ -88,8 +93,14 @@
     Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { }
     explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { }
     virtual ~Instruction() {}
-    void addIdOperand(Id id) { operands.push_back(id); }
-    void addImmediateOperand(unsigned int immediate) { operands.push_back(immediate); }
+    void addIdOperand(Id id) {
+        operands.push_back(id);
+        idOperand.push_back(true);
+    }
+    void addImmediateOperand(unsigned int immediate) {
+        operands.push_back(immediate);
+        idOperand.push_back(false);
+    }
     void addStringOperand(const char* str)
     {
         unsigned int word;
@@ -116,14 +127,25 @@
             addImmediateOperand(word);
         }
     }
+    bool isIdOperand(int op) const { return idOperand[op]; }
     void setBlock(Block* b) { block = b; }
     Block* getBlock() const { return block; }
     Op getOpCode() const { return opCode; }
-    int getNumOperands() const { return (int)operands.size(); }
+    int getNumOperands() const
+    {
+        assert(operands.size() == idOperand.size());
+        return (int)operands.size();
+    }
     Id getResultId() const { return resultId; }
     Id getTypeId() const { return typeId; }
-    Id getIdOperand(int op) const { return operands[op]; }
-    unsigned int getImmediateOperand(int op) const { return operands[op]; }
+    Id getIdOperand(int op) const {
+        assert(idOperand[op]);
+        return operands[op];
+    }
+    unsigned int getImmediateOperand(int op) const {
+        assert(!idOperand[op]);
+        return operands[op];
+    }
 
     // Write out the binary form.
     void dump(std::vector<unsigned int>& out) const
@@ -153,7 +175,8 @@
     Id resultId;
     Id typeId;
     Op opCode;
-    std::vector<Id> operands;
+    std::vector<Id> operands;     // operands, both <id> and immediates (both are unsigned int)
+    std::vector<bool> idOperand;  // true for operands that are <id>, false for immediates
     Block* block;
 };
 
@@ -331,7 +354,9 @@
 
     Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
     const std::vector<Function*>& getFunctions() const { return functions; }
-    spv::Id getTypeId(Id resultId) const { return idToInstruction[resultId]->getTypeId(); }
+    spv::Id getTypeId(Id resultId) const {
+        return idToInstruction[resultId] == nullptr ? NoType : idToInstruction[resultId]->getTypeId();
+    }
     StorageClass getStorageClass(Id typeId) const
     {
         assert(idToInstruction[typeId]->getOpCode() == spv::OpTypePointer);
diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt
old mode 100755
new mode 100644
diff --git a/StandAlone/ResourceLimits.cpp b/StandAlone/ResourceLimits.cpp
index e22ec80..66e79af 100644
--- a/StandAlone/ResourceLimits.cpp
+++ b/StandAlone/ResourceLimits.cpp
@@ -125,6 +125,16 @@
     /* .MaxCullDistances = */ 8,
     /* .MaxCombinedClipAndCullDistances = */ 8,
     /* .MaxSamples = */ 4,
+    /* .maxMeshOutputVerticesNV = */ 256,
+    /* .maxMeshOutputPrimitivesNV = */ 512,
+    /* .maxMeshWorkGroupSizeX_NV = */ 32,
+    /* .maxMeshWorkGroupSizeY_NV = */ 1,
+    /* .maxMeshWorkGroupSizeZ_NV = */ 1,
+    /* .maxTaskWorkGroupSizeX_NV = */ 32,
+    /* .maxTaskWorkGroupSizeY_NV = */ 1,
+    /* .maxTaskWorkGroupSizeZ_NV = */ 1,
+    /* .maxMeshViewCountNV = */ 4,
+
     /* .limits = */ {
         /* .nonInductiveForLoops = */ 1,
         /* .whileLoops = */ 1,
@@ -224,7 +234,17 @@
             << "MaxCullDistances "                          << DefaultTBuiltInResource.maxCullDistances << "\n"
             << "MaxCombinedClipAndCullDistances "           << DefaultTBuiltInResource.maxCombinedClipAndCullDistances << "\n"
             << "MaxSamples "                                << DefaultTBuiltInResource.maxSamples << "\n"
-
+#ifdef NV_EXTENSIONS
+            << "MaxMeshOutputVerticesNV "                   << DefaultTBuiltInResource.maxMeshOutputVerticesNV << "\n"
+            << "MaxMeshOutputPrimitivesNV "                 << DefaultTBuiltInResource.maxMeshOutputPrimitivesNV << "\n"
+            << "MaxMeshWorkGroupSizeX_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_NV << "\n"
+            << "MaxMeshWorkGroupSizeY_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_NV << "\n"
+            << "MaxMeshWorkGroupSizeZ_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_NV << "\n"
+            << "MaxTaskWorkGroupSizeX_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_NV << "\n"
+            << "MaxTaskWorkGroupSizeY_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_NV << "\n"
+            << "MaxTaskWorkGroupSizeZ_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_NV << "\n"
+            << "MaxMeshViewCountNV "                        << DefaultTBuiltInResource.maxMeshViewCountNV << "\n"
+#endif
             << "nonInductiveForLoops "                      << DefaultTBuiltInResource.limits.nonInductiveForLoops << "\n"
             << "whileLoops "                                << DefaultTBuiltInResource.limits.whileLoops << "\n"
             << "doWhileLoops "                              << DefaultTBuiltInResource.limits.doWhileLoops << "\n"
@@ -431,6 +451,26 @@
             resources->maxCombinedClipAndCullDistances = value;
         else if (tokenStr == "MaxSamples")
             resources->maxSamples = value;
+#ifdef NV_EXTENSIONS
+        else if (tokenStr == "MaxMeshOutputVerticesNV")
+            resources->maxMeshOutputVerticesNV = value;
+        else if (tokenStr == "MaxMeshOutputPrimitivesNV")
+            resources->maxMeshOutputPrimitivesNV = value;
+        else if (tokenStr == "MaxMeshWorkGroupSizeX_NV")
+            resources->maxMeshWorkGroupSizeX_NV = value;
+        else if (tokenStr == "MaxMeshWorkGroupSizeY_NV")
+            resources->maxMeshWorkGroupSizeY_NV = value;
+        else if (tokenStr == "MaxMeshWorkGroupSizeZ_NV")
+            resources->maxMeshWorkGroupSizeZ_NV = value;
+        else if (tokenStr == "MaxTaskWorkGroupSizeX_NV")
+            resources->maxTaskWorkGroupSizeX_NV = value;
+        else if (tokenStr == "MaxTaskWorkGroupSizeY_NV")
+            resources->maxTaskWorkGroupSizeY_NV = value;
+        else if (tokenStr == "MaxTaskWorkGroupSizeZ_NV")
+            resources->maxTaskWorkGroupSizeZ_NV = value;
+        else if (tokenStr == "MaxMeshViewCountNV")
+            resources->maxMeshViewCountNV = value;
+#endif
         else if (tokenStr == "nonInductiveForLoops")
             resources->limits.nonInductiveForLoops = (value != 0);
         else if (tokenStr == "whileLoops")
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
old mode 100755
new mode 100644
index a159bc8..fd14476
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -103,6 +103,7 @@
 };
 bool targetHlslFunctionality1 = false;
 bool SpvToolsDisassembler = false;
+bool SpvToolsValidate = false;
 
 //
 // Return codes from main/exit().
@@ -243,6 +244,16 @@
         case EShLangGeometry:        name = "geom.spv";    break;
         case EShLangFragment:        name = "frag.spv";    break;
         case EShLangCompute:         name = "comp.spv";    break;
+#ifdef NV_EXTENSIONS
+        case EShLangRayGenNV:        name = "rgen.spv";    break;
+        case EShLangIntersectNV:     name = "rint.spv";    break;
+        case EShLangAnyHitNV:        name = "rahit.spv";   break;
+        case EShLangClosestHitNV:    name = "rchit.spv";   break;
+        case EShLangMissNV:          name = "rmiss.spv";   break;
+        case EShLangCallableNV:      name = "rcall.spv";   break;
+        case EShLangMeshNV:          name = "mesh.spv";    break;
+        case EShLangTaskNV:          name = "task.spv";    break;
+#endif
         default:                     name = "unknown";     break;
         }
     } else
@@ -322,7 +333,7 @@
 
     for (int lang = langMin; lang < langMax; ++lang) {
         if (!perSetBase.empty())
-            baseBindingForSet[res][lang] = perSetBase;
+            baseBindingForSet[res][lang].insert(perSetBase.begin(), perSetBase.end());
         else
             baseBinding[res][lang] = singleBase;
     }
@@ -446,6 +457,11 @@
                                 Error("--client expects vulkan100 or opengl100");
                         }
                         bumpArg();
+                    } else if (lowerword == "entry-point") {
+                        entryPointName = argv[1];
+                        if (argc <= 1)
+                            Error("no <name> provided for --entry-point");
+                        bumpArg();
                     } else if (lowerword == "flatten-uniform-arrays" || // synonyms
                                lowerword == "flatten-uniform-array"  ||
                                lowerword == "fua") {
@@ -478,8 +494,8 @@
                                lowerword == "sib") {
                         ProcessBindingBase(argc, argv, glslang::EResImage);
                     } else if (lowerword == "shift-sampler-bindings" || // synonyms
-                        lowerword == "shift-sampler-binding"  ||
-                        lowerword == "ssb") {
+                               lowerword == "shift-sampler-binding"  ||
+                               lowerword == "ssb") {
                         ProcessBindingBase(argc, argv, glslang::EResSampler);
                     } else if (lowerword == "shift-uav-bindings" ||  // synonyms
                                lowerword == "shift-uav-binding"  ||
@@ -509,6 +525,8 @@
                         break;
                     } else if (lowerword == "spirv-dis") {
                         SpvToolsDisassembler = true;
+                    } else if (lowerword == "spirv-val") {
+                        SpvToolsValidate = true;
                     } else if (lowerword == "stdin") {
                         Options |= EOptionStdin;
                         shaderStageName = argv[1];
@@ -610,8 +628,6 @@
                     Options |= EOptionDefaultDesktop;
                 break;
             case 'e':
-                // HLSL todo: entry point handle needs much more sophistication.
-                // This is okay for one compilation unit with one entry point.
                 entryPointName = argv[1];
                 if (argc <= 1)
                     Error("no <name> provided for -e");
@@ -840,7 +856,7 @@
         const auto &compUnit = *it;
         glslang::TShader* shader = new glslang::TShader(compUnit.stage);
         shader->setStringsWithLengthsAndNames(compUnit.text, NULL, compUnit.fileNameList, compUnit.count);
-        if (entryPointName) // HLSL todo: this needs to be tracked per compUnits
+        if (entryPointName)
             shader->setEntryPoint(entryPointName);
         if (sourceEntryPointName) {
             if (entryPointName == nullptr)
@@ -975,6 +991,8 @@
                         spvOptions.generateDebugInfo = true;
                     spvOptions.disableOptimizer = (Options & EOptionOptimizeDisable) != 0;
                     spvOptions.optimizeSize = (Options & EOptionOptimizeSize) != 0;
+                    spvOptions.disassemble = SpvToolsDisassembler;
+                    spvOptions.validate = SpvToolsValidate;
                     glslang::GlslangToSpv(*program.getIntermediate((EShLanguage)stage), spirv, &logger, &spvOptions);
 
                     // Dump the spv to a file or stdout, etc., but only if not doing
@@ -986,13 +1004,6 @@
                         } else {
                             glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage));
                         }
-#if ENABLE_OPT
-                        if (SpvToolsDisassembler)
-                            spv::SpirvToolsDisassemble(std::cout, spirv);
-#else
-                        if (SpvToolsDisassembler)
-                            printf("SPIRV-Tools is not enabled; use -H for human readable SPIR-V\n");
-#endif
                         if (!SpvToolsDisassembler && (Options & EOptionHumanReadableSpv))
                             spv::Disassemble(std::cout, spirv);
                     }
@@ -1205,7 +1216,12 @@
 //   .geom = geometry
 //   .frag = fragment
 //   .comp = compute
-//
+//   .rgen = ray generation
+//   .rint = ray intersection
+//   .rahit = ray any hit
+//   .rchit = ray closest hit
+//   .rmiss = ray miss
+//   .rcall = ray callable
 //   Additionally, the file names may end in .<stage>.glsl and .<stage>.hlsl
 //   where <stage> is one of the stages listed above.
 //
@@ -1249,6 +1265,24 @@
         return EShLangFragment;
     else if (stageName == "comp")
         return EShLangCompute;
+#ifdef NV_EXTENSIONS
+    else if (stageName == "rgen")
+        return EShLangRayGenNV;
+    else if (stageName == "rint")
+        return EShLangIntersectNV;
+    else if (stageName == "rahit")
+        return EShLangAnyHitNV;
+    else if (stageName == "rchit")
+        return EShLangClosestHitNV;
+    else if (stageName == "rmiss")
+        return EShLangMissNV;
+    else if (stageName == "rcall")
+        return EShLangCallableNV;
+    else if (stageName == "mesh")
+        return EShLangMeshNV;
+    else if (stageName == "task")
+        return EShLangTaskNV;
+#endif
 
     usage();
     return EShLangVertex;
@@ -1318,27 +1352,37 @@
            "    .geom   for a geometry shader\n"
            "    .frag   for a fragment shader\n"
            "    .comp   for a compute shader\n"
+#ifdef NV_EXTENSIONS
+           "    .mesh   for a mesh shader\n"
+           "    .task   for a task shader\n"
+           "    .rgen    for a ray generation shader\n"
+           "    .rint    for a ray intersection shader\n"
+           "    .rahit   for a ray any hit shader\n"
+           "    .rchit   for a ray closest hit shader\n"
+           "    .rmiss   for a ray miss shader\n"
+           "    .rcall   for a ray callable shader"
+#endif
            "    .glsl   for .vert.glsl, .tesc.glsl, ..., .comp.glsl compound suffixes\n"
            "    .hlsl   for .vert.hlsl, .tesc.hlsl, ..., .comp.hlsl compound suffixes\n"
            "\n"
            "Options:\n"
            "  -C          cascading errors; risk crash from accumulation of error recoveries\n"
-           "  -D          input is HLSL (default when any suffix is .hlsl)\n"
+           "  -D          input is HLSL (this is the default when any suffix is .hlsl)\n"
            "  -D<macro=def>\n"
            "  -D<macro>   define a pre-processor macro\n"
            "  -E          print pre-processed GLSL; cannot be used with -l;\n"
-           "              errors will appear on stderr.\n"
+           "              errors will appear on stderr\n"
            "  -G[ver]     create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
-           "              default file name is <stage>.spv (-o overrides this)\n"
+           "              default file name is <stage>.spv (-o overrides this);\n"
            "              'ver', when present, is the version of the input semantics,\n"
-           "              which will appear in #define GL_SPIRV ver\n"
-           "              '--client opengl100' is the same as -G100\n"
+           "              which will appear in #define GL_SPIRV ver;\n"
+           "              '--client opengl100' is the same as -G100;\n"
            "              a '--target-env' for OpenGL will also imply '-G'\n"
            "  -H          print human readable form of SPIR-V; turns on -V\n"
            "  -I<dir>     add dir to the include search path; includer's directory\n"
            "              is searched first, followed by left-to-right order of -I\n"
-           "  -Od         disables optimization. May cause illegal SPIR-V for HLSL.\n"
-           "  -Os         optimizes SPIR-V to minimize size.\n"
+           "  -Od         disables optimization; may cause illegal SPIR-V for HLSL\n"
+           "  -Os         optimizes SPIR-V to minimize size\n"
            "  -S <stage>  uses specified stage rather than parsing the file extension\n"
            "              choices for <stage> are vert, tesc, tese, geom, frag, or comp\n"
            "  -U<macro>   undefine a pre-processor macro\n"
@@ -1352,10 +1396,11 @@
            "              creates the default configuration file (redirect to a .conf file)\n"
            "  -d          default to desktop (#version 110) when there is no shader #version\n"
            "              (default is ES version 100)\n"
-           "  -e <name>   specify <name> as the entry-point name\n"
+           "  -e <name> | --entry-point <name>\n"
+           "              specify <name> as the entry-point function name\n"
            "  -f{hlsl_functionality1}\n"
            "              'hlsl_functionality1' enables use of the\n"
-           "                  SPV_GOOGLE_hlsl_functionality1 extension\n"
+           "              SPV_GOOGLE_hlsl_functionality1 extension\n"
            "  -g          generate debug information\n"
            "  -h          print this usage message\n"
            "  -i          intermediate tree (glslang AST) is printed out\n"
@@ -1363,80 +1408,82 @@
            "  -m          memory leak mode\n"
            "  -o <file>   save binary to <file>, requires a binary option (e.g., -V)\n"
            "  -q          dump reflection query database\n"
-           "  -r          synonym for --relaxed-errors\n"
+           "  -r | --relaxed-errors"
+           "              relaxed GLSL semantic error-checking mode\n"
            "  -s          silence syntax and semantic error reporting\n"
            "  -t          multi-threaded mode\n"
-           "  -v          print version strings\n"
-           "  -w          synonym for --suppress-warnings\n"
+           "  -v | --version\n"
+           "              print version strings\n"
+           "  -w | --suppress-warnings\n"
+           "              suppress GLSL warnings, except as required by \"#extension : warn\"\n"
            "  -x          save binary output as text-based 32-bit hexadecimal numbers\n"
-           "  --auto-map-bindings                  automatically bind uniform variables\n"
-           "                                       without explicit bindings.\n"
-           "  --amb                                synonym for --auto-map-bindings\n"
-           "  --auto-map-locations                 automatically locate input/output lacking\n"
-           "                                       'location' (fragile, not cross stage)\n"
-           "  --aml                                synonym for --auto-map-locations\n"
-           "  --client {vulkan<ver>|opengl<ver>}   see -V and -G\n"
-           "  -dumpfullversion                     print bare major.minor.patchlevel\n"
-           "  -dumpversion                         same as -dumpfullversion\n"
-           "  --flatten-uniform-arrays             flatten uniform texture/sampler arrays to\n"
-           "                                       scalars\n"
-           "  --fua                                synonym for --flatten-uniform-arrays\n"
-           "  --hlsl-offsets                       Allow block offsets to follow HLSL rules\n"
-           "                                       Works independently of source language\n"
-           "  --hlsl-iomap                         Perform IO mapping in HLSL register space\n"
-           "  --hlsl-enable-16bit-types            Allow use of 16-bit types in SPIR-V for HLSL\n"
-           "  --invert-y | --iy                    invert position.Y output in vertex shader\n"
-           "  --keep-uncalled                      don't eliminate uncalled functions\n"
-           "  --ku                                 synonym for --keep-uncalled\n"
-           "  --no-storage-format                  use Unknown image format\n"
-           "  --nsf                                synonym for --no-storage-format\n"
-           "  --relaxed-errors                     relaxed GLSL semantic error-checking mode\n"
+           "  --auto-map-bindings | --amb       automatically bind uniform variables\n"
+           "                                    without explicit bindings\n"
+           "  --auto-map-locations | --aml      automatically locate input/output lacking\n"
+           "                                    'location' (fragile, not cross stage)\n"
+           "  --client {vulkan<ver>|opengl<ver>} see -V and -G\n"
+           "  -dumpfullversion | -dumpversion   print bare major.minor.patchlevel\n"
+           "  --flatten-uniform-arrays | --fua  flatten uniform texture/sampler arrays to\n"
+           "                                    scalars\n"
+           "  --hlsl-offsets                    allow block offsets to follow HLSL rules\n"
+           "                                    works independently of source language\n"
+           "  --hlsl-iomap                      perform IO mapping in HLSL register space\n"
+           "  --hlsl-enable-16bit-types         allow 16-bit types in SPIR-V for HLSL\n"
+           "  --invert-y | --iy                 invert position.Y output in vertex shader\n"
+           "  --keep-uncalled | --ku            don't eliminate uncalled functions\n"
+           "  --no-storage-format | --nsf       use Unknown image format\n"
            "  --resource-set-binding [stage] name set binding\n"
-           "              Set descriptor set and binding for individual resources\n"
+           "                                    set descriptor set and binding for\n"
+           "                                    individual resources\n"
            "  --resource-set-binding [stage] set\n"
-           "              Set descriptor set for all resources\n"
-           "  --rsb [stage] type set binding       synonym for --resource-set-binding\n"
-           "  --shift-image-binding [stage] num    base binding number for images (uav)\n"
-           "  --shift-image-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --sib [stage] num                    synonym for --shift-image-binding\n"
-           "  --shift-sampler-binding [stage] num  base binding number for samplers\n"
-           "  --shift-sampler-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --ssb [stage] num                    synonym for --shift-sampler-binding\n"
-           "  --shift-ssbo-binding [stage] num     base binding number for SSBOs\n"
-           "  --shift-ssbo-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --sbb [stage] num                    synonym for --shift-ssbo-binding\n"
-           "  --shift-texture-binding [stage] num  base binding number for textures\n"
-           "  --shift-texture-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --stb [stage] num                    synonym for --shift-texture-binding\n"
-           "  --shift-uav-binding [stage] num      base binding number for UAVs\n"
-           "  --shift-uav-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --suavb [stage] num                  synonym for --shift-uav-binding\n"
-           "  --shift-UBO-binding [stage] num      base binding number for UBOs\n"
-           "  --shift-UBO-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --shift-cbuffer-binding [stage] num  synonym for --shift-UBO-binding\n"
-           "  --shift-cbuffer-binding [stage] [num set]... per-descriptor-set shift values\n"
-           "  --spirv-dis                          output standard form disassembly; works only\n"
-           "                                       when a SPIR-V generation option is also used\n"
-           "  --sub [stage] num                    synonym for --shift-UBO-binding\n"
-           "  --source-entrypoint <name>           the given shader source function is\n"
-           "                                       renamed to be the <name> given in -e\n"
-           "  --sep                                synonym for --source-entrypoint\n"
-           "  --stdin                              Read from stdin instead of from a file.\n"
-           "                                       You'll have to provide the shader stage\n"
-           "                                       using -S.\n"
-           "  --suppress-warnings                  suppress GLSL warnings\n"
-           "                                       (except as required by #extension : warn)\n"
+           "                                    set descriptor set for all resources\n"
+           "  --rsb                             synonym for --resource-set-binding\n"
+           "  --shift-image-binding [stage] num\n"
+           "                                    base binding number for images (uav)\n"
+           "  --shift-image-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --sib                             synonym for --shift-image-binding\n"
+           "  --shift-sampler-binding [stage] num\n"
+           "                                    base binding number for samplers\n"
+           "  --shift-sampler-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --ssb                             synonym for --shift-sampler-binding\n"
+           "  --shift-ssbo-binding [stage] num  base binding number for SSBOs\n"
+           "  --shift-ssbo-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --sbb                             synonym for --shift-ssbo-binding\n"
+           "  --shift-texture-binding [stage] num\n"
+           "                                    base binding number for textures\n"
+           "  --shift-texture-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --stb                             synonym for --shift-texture-binding\n"
+           "  --shift-uav-binding [stage] num   base binding number for UAVs\n"
+           "  --shift-uav-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --suavb                           synonym for --shift-uav-binding\n"
+           "  --shift-UBO-binding [stage] num   base binding number for UBOs\n"
+           "  --shift-UBO-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --sub                             synonym for --shift-UBO-binding\n"
+           "  --shift-cbuffer-binding | --scb   synonyms for --shift-UBO-binding\n"
+           "  --spirv-dis                       output standard-form disassembly; works only\n"
+           "                                    when a SPIR-V generation option is also used\n"
+           "  --spirv-val                       execute the SPIRV-Tools validator\n"
+           "  --source-entrypoint <name>        the given shader source function is\n"
+           "                                    renamed to be the <name> given in -e\n"
+           "  --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 | opengl} \n"
-           "                                       set execution environment that emitted code\n"
-           "                                       will execute in (as opposed to the language\n"
-           "                                       semantics selected by --client) defaults:\n"
-           "                                          'vulkan1.0' under '--client vulkan<ver>'\n"
-           "                                          'opengl' under '--client opengl<ver>'\n"
-           "  --variable-name <name>               Creates a C header file that contains a\n"
-           "                                       uint32_t array named <name>\n"
-           "                                       initialized with the shader binary code.\n"
-           "  --version                            synonym for -v\n"
-           "  --vn <name>                          synonym for --variable-name <name>\n"
+           "                                    set execution environment that emitted code\n"
+           "                                    will execute in (as opposed to the language\n"
+           "                                    semantics selected by --client) defaults:\n"
+           "                                     * 'vulkan1.0' under '--client vulkan<ver>'\n"
+           "                                     * 'opengl' under '--client opengl<ver>'\n"
+           "  --variable-name <name>\n"
+           "  --vn <name>                       creates a C header file that contains a\n"
+           "                                    uint32_t array named <name>\n"
+           "                                    initialized with the shader binary code\n"
            );
 
     exit(EFailUsage);
diff --git a/Test/110scope.vert b/Test/110scope.vert
old mode 100755
new mode 100644
diff --git a/Test/400.geom b/Test/400.geom
old mode 100755
new mode 100644
diff --git a/Test/420.comp b/Test/420.comp
old mode 100755
new mode 100644
diff --git a/Test/badMacroArgs.frag b/Test/badMacroArgs.frag
old mode 100755
new mode 100644
diff --git a/Test/baseLegalResults/hlsl.flattenSubset.frag.out b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseLegalResults/hlsl.flattenSubset2.frag.out b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out b/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out b/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/310runtimeArray.vert.out b/Test/baseResults/310runtimeArray.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/320.comp.out b/Test/baseResults/320.comp.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/320.frag.out b/Test/baseResults/320.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/320.geom.out b/Test/baseResults/320.geom.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/320.tesc.out b/Test/baseResults/320.tesc.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/320.tese.out b/Test/baseResults/320.tese.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/320.vert.out b/Test/baseResults/320.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/400.vert.out b/Test/baseResults/400.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/410.vert.out b/Test/baseResults/410.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/420.comp.out b/Test/baseResults/420.comp.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/435.vert.out b/Test/baseResults/435.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/460.frag.out b/Test/baseResults/460.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/460.vert.out b/Test/baseResults/460.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppBad.vert.out b/Test/baseResults/cppBad.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppBad2.vert.out b/Test/baseResults/cppBad2.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppDeepNest.frag.out b/Test/baseResults/cppDeepNest.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppPassMacroName.frag.out b/Test/baseResults/cppPassMacroName.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppRelaxSkipTokensErrors.vert.out b/Test/baseResults/cppRelaxSkipTokensErrors.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glspv.esversion.vert.out b/Test/baseResults/glspv.esversion.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glspv.frag.out b/Test/baseResults/glspv.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glspv.version.frag.out b/Test/baseResults/glspv.version.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glspv.version.vert.out b/Test/baseResults/glspv.version.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glspv.vert.out b/Test/baseResults/glspv.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.PointSize.geom.out b/Test/baseResults/hlsl.PointSize.geom.out
old mode 100755
new mode 100644
index 0d18f1f..c21008d
--- a/Test/baseResults/hlsl.PointSize.geom.out
+++ b/Test/baseResults/hlsl.PointSize.geom.out
@@ -69,6 +69,10 @@
 0:?     'ps' ( in 3-element array of uint PointSize)
 0:?     'OutputStream.ps' ( out float PointSize)
 
+error: SPIRV-Tools Validation Errors
+error: According to the Vulkan spec BuiltIn PointSize variable needs to be a 32-bit float scalar. ID <28> (OpVariable) is not a float scalar.
+  %29 = OpLoad %_arr_uint_uint_3 %ps_1
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 36
diff --git a/Test/baseResults/hlsl.PointSize.vert.out b/Test/baseResults/hlsl.PointSize.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.aliasOpaque.frag.out b/Test/baseResults/hlsl.aliasOpaque.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.amend.frag.out b/Test/baseResults/hlsl.amend.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.array.frag.out b/Test/baseResults/hlsl.array.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.assoc.frag.out b/Test/baseResults/hlsl.assoc.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.attribute.frag.out b/Test/baseResults/hlsl.attribute.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.attributeC11.frag.out b/Test/baseResults/hlsl.attributeC11.frag.out
old mode 100755
new mode 100644
index becb500..afc7466
--- a/Test/baseResults/hlsl.attributeC11.frag.out
+++ b/Test/baseResults/hlsl.attributeC11.frag.out
@@ -93,6 +93,10 @@
 0:?     '@entryPointOutput' (layout( location=7) out 4-component vector of float)
 0:?     'input' (layout( location=8) in 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: Operand 2 of Decorate requires one of these capabilities: InputAttachment 
+  OpDecorate %attach InputAttachmentIndex 4
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 51
diff --git a/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out b/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.basic.comp.out b/Test/baseResults/hlsl.basic.comp.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.boolConv.vert.out b/Test/baseResults/hlsl.boolConv.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out
old mode 100755
new mode 100644
index 8d2c514..4528d98
--- a/Test/baseResults/hlsl.buffer.frag.out
+++ b/Test/baseResults/hlsl.buffer.frag.out
@@ -145,6 +145,10 @@
 0:?     '@entryPointOutput.a' (layout( location=0) out 4-component vector of float)
 0:?     'input' ( in 4-component vector of float FragCoord)
 
+error: SPIRV-Tools Validation Errors
+error: Structure id 50 decorated as BufferBlock for variable in Uniform storage class must follow standard storage buffer layout rules: member 7 at offset 128 overlaps previous member ending at offset 171
+  %tbufName = OpTypeStruct %v4float %int %float %float %float %float %float %float %mat3v4float %mat3v4float %mat3v4float %mat3v4float
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 73
diff --git a/Test/baseResults/hlsl.cast.frag.out b/Test/baseResults/hlsl.cast.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.cbuffer-identifier.vert.out b/Test/baseResults/hlsl.cbuffer-identifier.vert.out
index 6142ca0..f7225f8 100644
--- a/Test/baseResults/hlsl.cbuffer-identifier.vert.out
+++ b/Test/baseResults/hlsl.cbuffer-identifier.vert.out
@@ -251,12 +251,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 106
+// Id's are bound by 93
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 87 91 99 103
+                              EntryPoint Vertex 4  "main" 74 78 86 90
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "VS_INPUT"
@@ -274,13 +274,13 @@
                               MemberName 28(C) 1  "View"
                               MemberName 28(C) 2  "Projection"
                               Name 30  ""
-                              Name 85  "input"
-                              Name 87  "input.Pos"
-                              Name 91  "input.Norm"
-                              Name 94  "flattenTemp"
-                              Name 95  "param"
-                              Name 99  "@entryPointOutput.Pos"
-                              Name 103  "@entryPointOutput.Norm"
+                              Name 72  "input"
+                              Name 74  "input.Pos"
+                              Name 78  "input.Norm"
+                              Name 81  "flattenTemp"
+                              Name 82  "param"
+                              Name 86  "@entryPointOutput.Pos"
+                              Name 90  "@entryPointOutput.Norm"
                               MemberDecorate 28(C) 0 RowMajor
                               MemberDecorate 28(C) 0 Offset 0
                               MemberDecorate 28(C) 0 MatrixStride 16
@@ -293,10 +293,10 @@
                               Decorate 28(C) Block
                               Decorate 30 DescriptorSet 0
                               Decorate 30 Binding 0
-                              Decorate 87(input.Pos) Location 0
-                              Decorate 91(input.Norm) Location 1
-                              Decorate 99(@entryPointOutput.Pos) BuiltIn Position
-                              Decorate 103(@entryPointOutput.Norm) Location 0
+                              Decorate 74(input.Pos) Location 0
+                              Decorate 78(input.Norm) Location 1
+                              Decorate 86(@entryPointOutput.Pos) BuiltIn Position
+                              Decorate 90(@entryPointOutput.Norm) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -324,37 +324,36 @@
               39:     16(int) Constant 1
               46:     16(int) Constant 2
               55:             TypeMatrix 7(fvec4) 3
-              56:    6(float) Constant 1065353216
-              73:             TypePointer Function 8(fvec3)
-              86:             TypePointer Input 7(fvec4)
-   87(input.Pos):     86(ptr) Variable Input
-              90:             TypePointer Input 8(fvec3)
-  91(input.Norm):     90(ptr) Variable Input
-              98:             TypePointer Output 7(fvec4)
-99(@entryPointOutput.Pos):     98(ptr) Variable Output
-             102:             TypePointer Output 8(fvec3)
-103(@entryPointOutput.Norm):    102(ptr) Variable Output
+              60:             TypePointer Function 8(fvec3)
+              73:             TypePointer Input 7(fvec4)
+   74(input.Pos):     73(ptr) Variable Input
+              77:             TypePointer Input 8(fvec3)
+  78(input.Norm):     77(ptr) Variable Input
+              85:             TypePointer Output 7(fvec4)
+86(@entryPointOutput.Pos):     85(ptr) Variable Output
+              89:             TypePointer Output 8(fvec3)
+90(@entryPointOutput.Norm):     89(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-       85(input):     10(ptr) Variable Function
- 94(flattenTemp):     20(ptr) Variable Function
-       95(param):     10(ptr) Variable Function
-              88:    7(fvec4) Load 87(input.Pos)
-              89:     34(ptr) AccessChain 85(input) 26
-                              Store 89 88
-              92:    8(fvec3) Load 91(input.Norm)
-              93:     73(ptr) AccessChain 85(input) 39
-                              Store 93 92
-              96: 9(VS_INPUT) Load 85(input)
-                              Store 95(param) 96
-              97:11(PS_INPUT) FunctionCall 14(@main(struct-VS_INPUT-vf4-vf31;) 95(param)
-                              Store 94(flattenTemp) 97
-             100:     34(ptr) AccessChain 94(flattenTemp) 26
-             101:    7(fvec4) Load 100
-                              Store 99(@entryPointOutput.Pos) 101
-             104:     73(ptr) AccessChain 94(flattenTemp) 39
-             105:    8(fvec3) Load 104
-                              Store 103(@entryPointOutput.Norm) 105
+       72(input):     10(ptr) Variable Function
+ 81(flattenTemp):     20(ptr) Variable Function
+       82(param):     10(ptr) Variable Function
+              75:    7(fvec4) Load 74(input.Pos)
+              76:     34(ptr) AccessChain 72(input) 26
+                              Store 76 75
+              79:    8(fvec3) Load 78(input.Norm)
+              80:     60(ptr) AccessChain 72(input) 39
+                              Store 80 79
+              83: 9(VS_INPUT) Load 72(input)
+                              Store 82(param) 83
+              84:11(PS_INPUT) FunctionCall 14(@main(struct-VS_INPUT-vf4-vf31;) 82(param)
+                              Store 81(flattenTemp) 84
+              87:     34(ptr) AccessChain 81(flattenTemp) 26
+              88:    7(fvec4) Load 87
+                              Store 86(@entryPointOutput.Pos) 88
+              91:     60(ptr) AccessChain 81(flattenTemp) 39
+              92:    8(fvec3) Load 91
+                              Store 90(@entryPointOutput.Norm) 92
                               Return
                               FunctionEnd
 14(@main(struct-VS_INPUT-vf4-vf31;):11(PS_INPUT) Function None 12
@@ -387,31 +386,19 @@
                               Store 52 51
               53:     31(ptr) AccessChain 30 26
               54:          27 Load 53
-              57:    6(float) CompositeExtract 54 0 0
-              58:    6(float) CompositeExtract 54 0 1
-              59:    6(float) CompositeExtract 54 0 2
-              60:    6(float) CompositeExtract 54 0 3
-              61:    6(float) CompositeExtract 54 1 0
-              62:    6(float) CompositeExtract 54 1 1
-              63:    6(float) CompositeExtract 54 1 2
-              64:    6(float) CompositeExtract 54 1 3
-              65:    6(float) CompositeExtract 54 2 0
-              66:    6(float) CompositeExtract 54 2 1
-              67:    6(float) CompositeExtract 54 2 2
-              68:    6(float) CompositeExtract 54 2 3
-              69:    7(fvec4) CompositeConstruct 57 58 59 60
-              70:    7(fvec4) CompositeConstruct 61 62 63 64
-              71:    7(fvec4) CompositeConstruct 65 66 67 68
-              72:          55 CompositeConstruct 69 70 71
-              74:     73(ptr) AccessChain 13(input) 39
-              75:    8(fvec3) Load 74
-              76:    7(fvec4) MatrixTimesVector 72 75
-              77:    6(float) CompositeExtract 76 0
-              78:    6(float) CompositeExtract 76 1
-              79:    6(float) CompositeExtract 76 2
-              80:    8(fvec3) CompositeConstruct 77 78 79
-              81:     73(ptr) AccessChain 21(output) 39
-                              Store 81 80
-              82:11(PS_INPUT) Load 21(output)
-                              ReturnValue 82
+              56:    7(fvec4) CompositeExtract 54 0
+              57:    7(fvec4) CompositeExtract 54 1
+              58:    7(fvec4) CompositeExtract 54 2
+              59:          55 CompositeConstruct 56 57 58
+              61:     60(ptr) AccessChain 13(input) 39
+              62:    8(fvec3) Load 61
+              63:    7(fvec4) MatrixTimesVector 59 62
+              64:    6(float) CompositeExtract 63 0
+              65:    6(float) CompositeExtract 63 1
+              66:    6(float) CompositeExtract 63 2
+              67:    8(fvec3) CompositeConstruct 64 65 66
+              68:     60(ptr) AccessChain 21(output) 39
+                              Store 68 67
+              69:11(PS_INPUT) Load 21(output)
+                              ReturnValue 69
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.charLit.vert.out b/Test/baseResults/hlsl.charLit.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.conditional.frag.out b/Test/baseResults/hlsl.conditional.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.constantbuffer.frag.out b/Test/baseResults/hlsl.constantbuffer.frag.out
index 4b5c6b1..4185ea9 100644
--- a/Test/baseResults/hlsl.constantbuffer.frag.out
+++ b/Test/baseResults/hlsl.constantbuffer.frag.out
@@ -131,6 +131,10 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform int c1})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: Only a single level of array is allowed for descriptor set variables
+  %cb3_0 = OpVariable %_ptr_Uniform__arr__arr_cb3_uint_4_uint_2 Uniform
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 66
diff --git a/Test/baseResults/hlsl.constructArray.vert.out b/Test/baseResults/hlsl.constructArray.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.constructimat.frag.out b/Test/baseResults/hlsl.constructimat.frag.out
index c36ff6d..e88c3d8 100644
--- a/Test/baseResults/hlsl.constructimat.frag.out
+++ b/Test/baseResults/hlsl.constructimat.frag.out
@@ -543,6 +543,10 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out int)
 
+error: SPIRV-Tools Validation Errors
+error: Matrix types can only be parameterized with floating-point types.
+  %mat4v4int = OpTypeMatrix %v4int 4
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 98
diff --git a/Test/baseResults/hlsl.coverage.frag.out b/Test/baseResults/hlsl.coverage.frag.out
index 8afc59a..bea2fc0 100644
--- a/Test/baseResults/hlsl.coverage.frag.out
+++ b/Test/baseResults/hlsl.coverage.frag.out
@@ -117,6 +117,10 @@
 0:?     '@entryPointOutput.nCoverageMask' ( out 1-element array of uint SampleMaskIn)
 0:?     '@entryPointOutput.vColor' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: Input variable id <34> is used by entry point 'main' id <4>, but is not listed as an interface
+  %i_1 = OpVariable %_ptr_Input_PS_INPUT Input
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 52
diff --git a/Test/baseResults/hlsl.depthGreater.frag.out b/Test/baseResults/hlsl.depthGreater.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.depthLess.frag.out b/Test/baseResults/hlsl.depthLess.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.discard.frag.out b/Test/baseResults/hlsl.discard.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.doLoop.frag.out b/Test/baseResults/hlsl.doLoop.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.emptystructreturn.frag.out b/Test/baseResults/hlsl.emptystructreturn.frag.out
index 8c8b62b..34a635c 100644
--- a/Test/baseResults/hlsl.emptystructreturn.frag.out
+++ b/Test/baseResults/hlsl.emptystructreturn.frag.out
@@ -49,6 +49,10 @@
 0:?             'i' ( temp structure{})
 0:?   Linker Objects
 
+error: SPIRV-Tools Validation Errors
+error: Input variable id <20> is used by entry point 'main' id <4>, but is not listed as an interface
+  %i_1 = OpVariable %_ptr_Input_ps_in Input
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 27
diff --git a/Test/baseResults/hlsl.emptystructreturn.vert.out b/Test/baseResults/hlsl.emptystructreturn.vert.out
index b2aaf5e..6170458 100644
--- a/Test/baseResults/hlsl.emptystructreturn.vert.out
+++ b/Test/baseResults/hlsl.emptystructreturn.vert.out
@@ -47,6 +47,10 @@
 0:?             'i' ( temp structure{})
 0:?   Linker Objects
 
+error: SPIRV-Tools Validation Errors
+error: Input variable id <20> is used by entry point 'main' id <4>, but is not listed as an interface
+  %i_1 = OpVariable %_ptr_Input_vs_in Input
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 27
diff --git a/Test/baseResults/hlsl.entry-in.frag.out b/Test/baseResults/hlsl.entry-in.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.entry-out.frag.out b/Test/baseResults/hlsl.entry-out.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.flattenOpaque.frag.out b/Test/baseResults/hlsl.flattenOpaque.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.flattenOpaqueInit.vert.out b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out b/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.flattenSubset.frag.out b/Test/baseResults/hlsl.flattenSubset.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.flattenSubset2.frag.out b/Test/baseResults/hlsl.flattenSubset2.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.float1.frag.out b/Test/baseResults/hlsl.float1.frag.out
old mode 100755
new mode 100644
index 7862123..31febfd
--- a/Test/baseResults/hlsl.float1.frag.out
+++ b/Test/baseResults/hlsl.float1.frag.out
@@ -64,6 +64,10 @@
 0:?     'f1' ( global 1-component vector of float)
 0:?     'scalar' ( global float)
 
+error: SPIRV-Tools Validation Errors
+error: Expected int scalar or vector type as Result Type: IMul
+  %20 = OpIMul %float %18 %19
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 27
diff --git a/Test/baseResults/hlsl.float4.frag.out b/Test/baseResults/hlsl.float4.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.forLoop.frag.out b/Test/baseResults/hlsl.forLoop.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.function.frag.out b/Test/baseResults/hlsl.function.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
index 49fda31..33c9af4 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
@@ -1261,6 +1261,10 @@
 0:?     '@entryPointOutput.Depth' ( out float FragDepth)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: Expected Image Operand ConstOffsets to be a const object
+  %90 = OpImageGather %v4float %76 %78 %int_0 ConstOffsets %89
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 399
diff --git a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
index 9de1a97..22b02e7 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
@@ -1253,6 +1253,10 @@
 0:?     '@entryPointOutput.Depth' ( out float FragDepth)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: Expected Image Operand ConstOffsets to be a const object
+  %90 = OpImageGather %v4float %76 %78 %int_0 ConstOffsets %89
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 389
diff --git a/Test/baseResults/hlsl.hull.3.tesc.out b/Test/baseResults/hlsl.hull.3.tesc.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.if.frag.out b/Test/baseResults/hlsl.if.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.implicitBool.frag.out b/Test/baseResults/hlsl.implicitBool.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.include.vert.out b/Test/baseResults/hlsl.include.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.includeNegative.vert.out b/Test/baseResults/hlsl.includeNegative.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.inf.vert.out b/Test/baseResults/hlsl.inf.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.init.frag.out b/Test/baseResults/hlsl.init.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.intrinsics.comp.out b/Test/baseResults/hlsl.intrinsics.comp.out
index a5b543c..5058f23 100644
--- a/Test/baseResults/hlsl.intrinsics.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.comp.out
@@ -715,6 +715,10 @@
 0:?     'inU0' (layout( location=3) in 4-component vector of uint)
 0:?     'inU1' (layout( location=4) in 4-component vector of uint)
 
+error: SPIRV-Tools Validation Errors
+error: Expected operand to be vector bool: All
+  %64 = OpAll %bool %63
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 265
diff --git a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
index e786562..4fd1e7b 100644
--- a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
@@ -153,6 +153,10 @@
 0:?     'inF4' (layout( location=3) in 4-component vector of float)
 0:?     'inI2' (layout( location=4) flat in 2-component vector of int)
 
+error: SPIRV-Tools Validation Errors
+error: GLSL.std.450 InterpolateAtOffset: expected Interpolant storage class to be Input
+  %28 = OpExtInst %float %1 InterpolateAtOffset %inF1 %27
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 80
diff --git a/Test/baseResults/hlsl.intrinsics.frag.out b/Test/baseResults/hlsl.intrinsics.frag.out
index b7d7139..20d2bb0 100644
--- a/Test/baseResults/hlsl.intrinsics.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.frag.out
@@ -142,1110 +142,1104 @@
 0:44          'r023' ( temp float)
 0:44          degrees ( temp float)
 0:44            'inF0' ( in float)
-0:48      Sequence
-0:48        move second child to first child ( temp float)
-0:48          'r027' ( temp float)
-0:48          exp ( temp float)
-0:48            'inF0' ( in float)
+0:45      Sequence
+0:45        move second child to first child ( temp float)
+0:45          'r024' ( temp float)
+0:45          distance ( temp float)
+0:45            'inF0' ( in float)
+0:45            'inF1' ( in float)
 0:49      Sequence
 0:49        move second child to first child ( temp float)
-0:49          'r028' ( temp float)
-0:49          exp2 ( temp float)
+0:49          'r027' ( temp float)
+0:49          exp ( temp float)
 0:49            'inF0' ( in float)
 0:50      Sequence
-0:50        move second child to first child ( temp uint)
-0:50          'r029' ( temp uint)
-0:50          Convert int to uint ( temp uint)
-0:50            findMSB ( temp int)
-0:50              Constant:
-0:50                7 (const int)
+0:50        move second child to first child ( temp float)
+0:50          'r028' ( temp float)
+0:50          exp2 ( temp float)
+0:50            'inF0' ( in float)
 0:51      Sequence
 0:51        move second child to first child ( temp uint)
-0:51          'r030' ( temp uint)
+0:51          'r029' ( temp uint)
 0:51          Convert int to uint ( temp uint)
-0:51            findLSB ( temp int)
+0:51            findMSB ( temp int)
 0:51              Constant:
 0:51                7 (const int)
 0:52      Sequence
-0:52        move second child to first child ( temp float)
-0:52          'r031' ( temp float)
-0:52          Floor ( temp float)
-0:52            'inF0' ( in float)
-0:54      Sequence
-0:54        move second child to first child ( temp float)
-0:54          'r033' ( temp float)
-0:54          mod ( temp float)
-0:54            'inF0' ( in float)
-0:54            'inF1' ( in float)
+0:52        move second child to first child ( temp uint)
+0:52          'r030' ( temp uint)
+0:52          Convert int to uint ( temp uint)
+0:52            findLSB ( temp int)
+0:52              Constant:
+0:52                7 (const int)
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'r031' ( temp float)
+0:53          Floor ( temp float)
+0:53            'inF0' ( in float)
 0:55      Sequence
 0:55        move second child to first child ( temp float)
-0:55          'r034' ( temp float)
-0:55          Fraction ( temp float)
+0:55          'r033' ( temp float)
+0:55          mod ( temp float)
 0:55            'inF0' ( in float)
+0:55            'inF1' ( in float)
 0:56      Sequence
 0:56        move second child to first child ( temp float)
-0:56          'r036' ( temp float)
-0:56          fwidth ( temp float)
+0:56          'r034' ( temp float)
+0:56          Fraction ( temp float)
 0:56            'inF0' ( in float)
 0:57      Sequence
-0:57        move second child to first child ( temp bool)
-0:57          'r037' ( temp bool)
-0:57          isinf ( temp bool)
+0:57        move second child to first child ( temp float)
+0:57          'r036' ( temp float)
+0:57          fwidth ( temp float)
 0:57            'inF0' ( in float)
 0:58      Sequence
 0:58        move second child to first child ( temp bool)
-0:58          'r038' ( temp bool)
-0:58          isnan ( temp bool)
+0:58          'r037' ( temp bool)
+0:58          isinf ( temp bool)
 0:58            'inF0' ( in float)
 0:59      Sequence
-0:59        move second child to first child ( temp float)
-0:59          'r039' ( temp float)
-0:59          ldexp ( temp float)
+0:59        move second child to first child ( temp bool)
+0:59          'r038' ( temp bool)
+0:59          isnan ( temp bool)
 0:59            'inF0' ( in float)
-0:59            'inF1' ( in float)
 0:60      Sequence
 0:60        move second child to first child ( temp float)
-0:60          'r039a' ( temp float)
-0:60          mix ( temp float)
+0:60          'r039' ( temp float)
+0:60          ldexp ( temp float)
 0:60            'inF0' ( in float)
 0:60            'inF1' ( in float)
-0:60            'inF2' ( in float)
 0:61      Sequence
 0:61        move second child to first child ( temp float)
-0:61          'r040' ( temp float)
-0:61          log ( temp float)
+0:61          'r039a' ( temp float)
+0:61          mix ( temp float)
 0:61            'inF0' ( in float)
+0:61            'inF1' ( in float)
+0:61            'inF2' ( in float)
 0:62      Sequence
 0:62        move second child to first child ( temp float)
-0:62          'r041' ( temp float)
-0:62          component-wise multiply ( temp float)
-0:62            log2 ( temp float)
-0:62              'inF0' ( in float)
-0:62            Constant:
-0:62              0.301030
+0:62          'r040' ( temp float)
+0:62          log ( temp float)
+0:62            'inF0' ( in float)
 0:63      Sequence
 0:63        move second child to first child ( temp float)
-0:63          'r042' ( temp float)
-0:63          log2 ( temp float)
-0:63            'inF0' ( in float)
+0:63          'r041' ( temp float)
+0:63          component-wise multiply ( temp float)
+0:63            log2 ( temp float)
+0:63              'inF0' ( in float)
+0:63            Constant:
+0:63              0.301030
 0:64      Sequence
 0:64        move second child to first child ( temp float)
-0:64          'r043' ( temp float)
-0:64          max ( temp float)
+0:64          'r042' ( temp float)
+0:64          log2 ( temp float)
 0:64            'inF0' ( in float)
-0:64            'inF1' ( in float)
 0:65      Sequence
 0:65        move second child to first child ( temp float)
-0:65          'r044' ( temp float)
-0:65          min ( temp float)
+0:65          'r043' ( temp float)
+0:65          max ( temp float)
 0:65            'inF0' ( in float)
 0:65            'inF1' ( in float)
 0:66      Sequence
 0:66        move second child to first child ( temp float)
-0:66          'r045' ( temp float)
-0:66          pow ( temp float)
+0:66          'r044' ( temp float)
+0:66          min ( temp float)
 0:66            'inF0' ( in float)
 0:66            'inF1' ( in float)
 0:67      Sequence
 0:67        move second child to first child ( temp float)
-0:67          'r046' ( temp float)
-0:67          radians ( temp float)
+0:67          'r045' ( temp float)
+0:67          pow ( temp float)
 0:67            'inF0' ( in float)
+0:67            'inF1' ( in float)
 0:68      Sequence
 0:68        move second child to first child ( temp float)
-0:68          'r047' ( temp float)
-0:68          divide ( temp float)
-0:68            Constant:
-0:68              1.000000
+0:68          'r046' ( temp float)
+0:68          radians ( temp float)
 0:68            'inF0' ( in float)
 0:69      Sequence
-0:69        move second child to first child ( temp uint)
-0:69          'r048' ( temp uint)
-0:69          Convert int to uint ( temp uint)
-0:69            bitFieldReverse ( temp int)
-0:69              Constant:
-0:69                2 (const int)
+0:69        move second child to first child ( temp float)
+0:69          'r047' ( temp float)
+0:69          divide ( temp float)
+0:69            Constant:
+0:69              1.000000
+0:69            'inF0' ( in float)
 0:70      Sequence
-0:70        move second child to first child ( temp float)
-0:70          'r049' ( temp float)
-0:70          roundEven ( temp float)
-0:70            'inF0' ( in float)
+0:70        move second child to first child ( temp uint)
+0:70          'r048' ( temp uint)
+0:70          Convert int to uint ( temp uint)
+0:70            bitFieldReverse ( temp int)
+0:70              Constant:
+0:70                2 (const int)
 0:71      Sequence
 0:71        move second child to first child ( temp float)
-0:71          'r050' ( temp float)
-0:71          inverse sqrt ( temp float)
+0:71          'r049' ( temp float)
+0:71          roundEven ( temp float)
 0:71            'inF0' ( in float)
 0:72      Sequence
 0:72        move second child to first child ( temp float)
-0:72          'r051' ( temp float)
-0:72          clamp ( temp float)
+0:72          'r050' ( temp float)
+0:72          inverse sqrt ( temp float)
 0:72            'inF0' ( in float)
-0:72            Constant:
-0:72              0.000000
-0:72            Constant:
-0:72              1.000000
 0:73      Sequence
 0:73        move second child to first child ( temp float)
-0:73          'r052' ( temp float)
-0:73          Sign ( temp float)
+0:73          'r051' ( temp float)
+0:73          clamp ( temp float)
 0:73            'inF0' ( in float)
+0:73            Constant:
+0:73              0.000000
+0:73            Constant:
+0:73              1.000000
 0:74      Sequence
 0:74        move second child to first child ( temp float)
-0:74          'r053' ( temp float)
-0:74          sine ( temp float)
+0:74          'r052' ( temp float)
+0:74          Sign ( temp float)
 0:74            'inF0' ( in float)
 0:75      Sequence
 0:75        move second child to first child ( temp float)
-0:75          'inF1' ( in float)
+0:75          'r053' ( temp float)
 0:75          sine ( temp float)
 0:75            'inF0' ( in float)
-0:75        move second child to first child ( temp float)
-0:75          'inF2' ( in float)
-0:75          cosine ( temp float)
-0:75            'inF0' ( in float)
 0:76      Sequence
 0:76        move second child to first child ( temp float)
-0:76          'r055' ( temp float)
-0:76          hyp. sine ( temp float)
+0:76          'inF1' ( in float)
+0:76          sine ( temp float)
+0:76            'inF0' ( in float)
+0:76        move second child to first child ( temp float)
+0:76          'inF2' ( in float)
+0:76          cosine ( temp float)
 0:76            'inF0' ( in float)
 0:77      Sequence
 0:77        move second child to first child ( temp float)
-0:77          'r056' ( temp float)
-0:77          smoothstep ( temp float)
+0:77          'r055' ( temp float)
+0:77          hyp. sine ( temp float)
 0:77            'inF0' ( in float)
-0:77            'inF1' ( in float)
-0:77            'inF2' ( in float)
 0:78      Sequence
 0:78        move second child to first child ( temp float)
-0:78          'r057' ( temp float)
-0:78          sqrt ( temp float)
+0:78          'r056' ( temp float)
+0:78          smoothstep ( temp float)
 0:78            'inF0' ( in float)
+0:78            'inF1' ( in float)
+0:78            'inF2' ( in float)
 0:79      Sequence
 0:79        move second child to first child ( temp float)
-0:79          'r058' ( temp float)
-0:79          step ( temp float)
+0:79          'r057' ( temp float)
+0:79          sqrt ( temp float)
 0:79            'inF0' ( in float)
-0:79            'inF1' ( in float)
 0:80      Sequence
 0:80        move second child to first child ( temp float)
-0:80          'r059' ( temp float)
-0:80          tangent ( temp float)
+0:80          'r058' ( temp float)
+0:80          step ( temp float)
 0:80            'inF0' ( in float)
+0:80            'inF1' ( in float)
 0:81      Sequence
 0:81        move second child to first child ( temp float)
-0:81          'r060' ( temp float)
-0:81          hyp. tangent ( temp float)
+0:81          'r059' ( temp float)
+0:81          tangent ( temp float)
 0:81            'inF0' ( in float)
-0:83      Sequence
-0:83        move second child to first child ( temp float)
-0:83          'r061' ( temp float)
-0:83          trunc ( temp float)
-0:83            'inF0' ( in float)
-0:85      Branch: Return with expression
-0:85        Constant:
-0:85          0.000000
-0:89  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
-0:89    Function Parameters: 
-0:89      'inF0' ( in 1-component vector of float)
-0:89      'inF1' ( in 1-component vector of float)
-0:89      'inF2' ( in 1-component vector of float)
+0:82      Sequence
+0:82        move second child to first child ( temp float)
+0:82          'r060' ( temp float)
+0:82          hyp. tangent ( temp float)
+0:82            'inF0' ( in float)
+0:84      Sequence
+0:84        move second child to first child ( temp float)
+0:84          'r061' ( temp float)
+0:84          trunc ( temp float)
+0:84            'inF0' ( in float)
+0:86      Branch: Return with expression
+0:86        Constant:
+0:86          0.000000
+0:90  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
+0:90    Function Parameters: 
+0:90      'inF0' ( in 1-component vector of float)
+0:90      'inF1' ( in 1-component vector of float)
+0:90      'inF2' ( in 1-component vector of float)
 0:?     Sequence
-0:91      Branch: Return with expression
-0:91        Constant:
-0:91          0.000000
-0:95  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
-0:95    Function Parameters: 
-0:95      'inF0' ( in 2-component vector of float)
-0:95      'inF1' ( in 2-component vector of float)
-0:95      'inF2' ( in 2-component vector of float)
-0:95      'inU0' ( in 2-component vector of uint)
-0:95      'inU1' ( in 2-component vector of uint)
+0:92      Branch: Return with expression
+0:92        Constant:
+0:92          0.000000
+0:96  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
+0:96    Function Parameters: 
+0:96      'inF0' ( in 2-component vector of float)
+0:96      'inF1' ( in 2-component vector of float)
+0:96      'inF2' ( in 2-component vector of float)
+0:96      'inU0' ( in 2-component vector of uint)
+0:96      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
-0:98      Sequence
-0:98        move second child to first child ( temp bool)
-0:98          'r000' ( temp bool)
-0:98          all ( temp bool)
-0:98            Convert float to bool ( temp 2-component vector of bool)
-0:98              'inF0' ( in 2-component vector of float)
 0:99      Sequence
-0:99        move second child to first child ( temp 2-component vector of float)
-0:99          'r001' ( temp 2-component vector of float)
-0:99          Absolute value ( temp 2-component vector of float)
-0:99            'inF0' ( in 2-component vector of float)
+0:99        move second child to first child ( temp bool)
+0:99          'r000' ( temp bool)
+0:99          all ( temp bool)
+0:99            Convert float to bool ( temp 2-component vector of bool)
+0:99              'inF0' ( in 2-component vector of float)
 0:100      Sequence
 0:100        move second child to first child ( temp 2-component vector of float)
-0:100          'r002' ( temp 2-component vector of float)
-0:100          arc cosine ( temp 2-component vector of float)
+0:100          'r001' ( temp 2-component vector of float)
+0:100          Absolute value ( temp 2-component vector of float)
 0:100            'inF0' ( in 2-component vector of float)
 0:101      Sequence
-0:101        move second child to first child ( temp bool)
-0:101          'r003' ( temp bool)
-0:101          any ( temp bool)
-0:101            Convert float to bool ( temp 2-component vector of bool)
-0:101              'inF0' ( in 2-component vector of float)
+0:101        move second child to first child ( temp 2-component vector of float)
+0:101          'r002' ( temp 2-component vector of float)
+0:101          arc cosine ( temp 2-component vector of float)
+0:101            'inF0' ( in 2-component vector of float)
 0:102      Sequence
-0:102        move second child to first child ( temp 2-component vector of float)
-0:102          'r004' ( temp 2-component vector of float)
-0:102          arc sine ( temp 2-component vector of float)
-0:102            'inF0' ( in 2-component vector of float)
+0:102        move second child to first child ( temp bool)
+0:102          'r003' ( temp bool)
+0:102          any ( temp bool)
+0:102            Convert float to bool ( temp 2-component vector of bool)
+0:102              'inF0' ( in 2-component vector of float)
 0:103      Sequence
-0:103        move second child to first child ( temp 2-component vector of int)
-0:103          'r005' ( temp 2-component vector of int)
-0:103          floatBitsToInt ( temp 2-component vector of int)
+0:103        move second child to first child ( temp 2-component vector of float)
+0:103          'r004' ( temp 2-component vector of float)
+0:103          arc sine ( temp 2-component vector of float)
 0:103            'inF0' ( in 2-component vector of float)
 0:104      Sequence
-0:104        move second child to first child ( temp 2-component vector of uint)
-0:104          'r006' ( temp 2-component vector of uint)
-0:104          floatBitsToUint ( temp 2-component vector of uint)
+0:104        move second child to first child ( temp 2-component vector of int)
+0:104          'r005' ( temp 2-component vector of int)
+0:104          floatBitsToInt ( temp 2-component vector of int)
 0:104            'inF0' ( in 2-component vector of float)
 0:105      Sequence
-0:105        move second child to first child ( temp 2-component vector of float)
-0:105          'r007' ( temp 2-component vector of float)
-0:105          intBitsToFloat ( temp 2-component vector of float)
-0:105            'inU0' ( in 2-component vector of uint)
-0:107      Sequence
-0:107        move second child to first child ( temp 2-component vector of float)
-0:107          'r009' ( temp 2-component vector of float)
-0:107          arc tangent ( temp 2-component vector of float)
-0:107            'inF0' ( in 2-component vector of float)
+0:105        move second child to first child ( temp 2-component vector of uint)
+0:105          'r006' ( temp 2-component vector of uint)
+0:105          floatBitsToUint ( temp 2-component vector of uint)
+0:105            'inF0' ( in 2-component vector of float)
+0:106      Sequence
+0:106        move second child to first child ( temp 2-component vector of float)
+0:106          'r007' ( temp 2-component vector of float)
+0:106          intBitsToFloat ( temp 2-component vector of float)
+0:106            'inU0' ( in 2-component vector of uint)
 0:108      Sequence
 0:108        move second child to first child ( temp 2-component vector of float)
-0:108          'r010' ( temp 2-component vector of float)
+0:108          'r009' ( temp 2-component vector of float)
 0:108          arc tangent ( temp 2-component vector of float)
 0:108            'inF0' ( in 2-component vector of float)
-0:108            'inF1' ( in 2-component vector of float)
 0:109      Sequence
 0:109        move second child to first child ( temp 2-component vector of float)
-0:109          'r011' ( temp 2-component vector of float)
-0:109          Ceiling ( temp 2-component vector of float)
+0:109          'r010' ( temp 2-component vector of float)
+0:109          arc tangent ( temp 2-component vector of float)
 0:109            'inF0' ( in 2-component vector of float)
+0:109            'inF1' ( in 2-component vector of float)
 0:110      Sequence
 0:110        move second child to first child ( temp 2-component vector of float)
-0:110          'r012' ( temp 2-component vector of float)
-0:110          clamp ( temp 2-component vector of float)
+0:110          'r011' ( temp 2-component vector of float)
+0:110          Ceiling ( temp 2-component vector of float)
 0:110            'inF0' ( in 2-component vector of float)
-0:110            'inF1' ( in 2-component vector of float)
-0:110            'inF2' ( in 2-component vector of float)
-0:111      Test condition and select ( temp void)
-0:111        Condition
-0:111        any ( temp bool)
-0:111          Compare Less Than ( temp 2-component vector of bool)
+0:111      Sequence
+0:111        move second child to first child ( temp 2-component vector of float)
+0:111          'r012' ( temp 2-component vector of float)
+0:111          clamp ( temp 2-component vector of float)
 0:111            'inF0' ( in 2-component vector of float)
-0:111            Constant:
-0:111              0.000000
-0:111              0.000000
-0:111        true case
-0:111        Branch: Kill
+0:111            'inF1' ( in 2-component vector of float)
+0:111            'inF2' ( in 2-component vector of float)
 0:112      Test condition and select ( temp void)
 0:112        Condition
 0:112        any ( temp bool)
 0:112          Compare Less Than ( temp 2-component vector of bool)
-0:112            'inU0' ( in 2-component vector of uint)
+0:112            'inF0' ( in 2-component vector of float)
 0:112            Constant:
 0:112              0.000000
 0:112              0.000000
 0:112        true case
 0:112        Branch: Kill
-0:113      Sequence
-0:113        move second child to first child ( temp 2-component vector of float)
-0:113          'r013' ( temp 2-component vector of float)
-0:113          cosine ( temp 2-component vector of float)
-0:113            'inF0' ( in 2-component vector of float)
+0:113      Test condition and select ( temp void)
+0:113        Condition
+0:113        any ( temp bool)
+0:113          Compare Less Than ( temp 2-component vector of bool)
+0:113            'inU0' ( in 2-component vector of uint)
+0:113            Constant:
+0:113              0.000000
+0:113              0.000000
+0:113        true case
+0:113        Branch: Kill
 0:114      Sequence
 0:114        move second child to first child ( temp 2-component vector of float)
-0:114          'r015' ( temp 2-component vector of float)
-0:114          hyp. cosine ( temp 2-component vector of float)
+0:114          'r013' ( temp 2-component vector of float)
+0:114          cosine ( temp 2-component vector of float)
 0:114            'inF0' ( in 2-component vector of float)
 0:115      Sequence
-0:115        move second child to first child ( temp 2-component vector of int)
-0:115          'r016' ( temp 2-component vector of int)
+0:115        move second child to first child ( temp 2-component vector of float)
+0:115          'r015' ( temp 2-component vector of float)
+0:115          hyp. cosine ( temp 2-component vector of float)
+0:115            'inF0' ( in 2-component vector of float)
+0:116      Sequence
+0:116        move second child to first child ( temp 2-component vector of int)
+0:116          'r016' ( temp 2-component vector of int)
 0:?           bitCount ( temp 2-component vector of int)
 0:?             Constant:
 0:?               7 (const int)
 0:?               3 (const int)
-0:116      Sequence
-0:116        move second child to first child ( temp 2-component vector of float)
-0:116          'r017' ( temp 2-component vector of float)
-0:116          dPdx ( temp 2-component vector of float)
-0:116            'inF0' ( in 2-component vector of float)
 0:117      Sequence
 0:117        move second child to first child ( temp 2-component vector of float)
-0:117          'r018' ( temp 2-component vector of float)
-0:117          dPdxCoarse ( temp 2-component vector of float)
+0:117          'r017' ( temp 2-component vector of float)
+0:117          dPdx ( temp 2-component vector of float)
 0:117            'inF0' ( in 2-component vector of float)
 0:118      Sequence
 0:118        move second child to first child ( temp 2-component vector of float)
-0:118          'r019' ( temp 2-component vector of float)
-0:118          dPdxFine ( temp 2-component vector of float)
+0:118          'r018' ( temp 2-component vector of float)
+0:118          dPdxCoarse ( temp 2-component vector of float)
 0:118            'inF0' ( in 2-component vector of float)
 0:119      Sequence
 0:119        move second child to first child ( temp 2-component vector of float)
-0:119          'r020' ( temp 2-component vector of float)
-0:119          dPdy ( temp 2-component vector of float)
+0:119          'r019' ( temp 2-component vector of float)
+0:119          dPdxFine ( temp 2-component vector of float)
 0:119            'inF0' ( in 2-component vector of float)
 0:120      Sequence
 0:120        move second child to first child ( temp 2-component vector of float)
-0:120          'r021' ( temp 2-component vector of float)
-0:120          dPdyCoarse ( temp 2-component vector of float)
+0:120          'r020' ( temp 2-component vector of float)
+0:120          dPdy ( temp 2-component vector of float)
 0:120            'inF0' ( in 2-component vector of float)
 0:121      Sequence
 0:121        move second child to first child ( temp 2-component vector of float)
-0:121          'r022' ( temp 2-component vector of float)
-0:121          dPdyFine ( temp 2-component vector of float)
+0:121          'r021' ( temp 2-component vector of float)
+0:121          dPdyCoarse ( temp 2-component vector of float)
 0:121            'inF0' ( in 2-component vector of float)
 0:122      Sequence
 0:122        move second child to first child ( temp 2-component vector of float)
-0:122          'r023' ( temp 2-component vector of float)
-0:122          degrees ( temp 2-component vector of float)
+0:122          'r022' ( temp 2-component vector of float)
+0:122          dPdyFine ( temp 2-component vector of float)
 0:122            'inF0' ( in 2-component vector of float)
-0:126      Sequence
-0:126        move second child to first child ( temp float)
-0:126          'r026' ( temp float)
-0:126          distance ( temp float)
-0:126            'inF0' ( in 2-component vector of float)
-0:126            'inF1' ( in 2-component vector of float)
+0:123      Sequence
+0:123        move second child to first child ( temp 2-component vector of float)
+0:123          'r023' ( temp 2-component vector of float)
+0:123          degrees ( temp 2-component vector of float)
+0:123            'inF0' ( in 2-component vector of float)
 0:127      Sequence
 0:127        move second child to first child ( temp float)
-0:127          'r027' ( temp float)
-0:127          dot-product ( temp float)
+0:127          'r026' ( temp float)
+0:127          distance ( temp float)
 0:127            'inF0' ( in 2-component vector of float)
 0:127            'inF1' ( in 2-component vector of float)
-0:131      Sequence
-0:131        move second child to first child ( temp 2-component vector of float)
-0:131          'r028' ( temp 2-component vector of float)
-0:131          exp ( temp 2-component vector of float)
-0:131            'inF0' ( in 2-component vector of float)
+0:128      Sequence
+0:128        move second child to first child ( temp float)
+0:128          'r027' ( temp float)
+0:128          dot-product ( temp float)
+0:128            'inF0' ( in 2-component vector of float)
+0:128            'inF1' ( in 2-component vector of float)
 0:132      Sequence
 0:132        move second child to first child ( temp 2-component vector of float)
-0:132          'r029' ( temp 2-component vector of float)
-0:132          exp2 ( temp 2-component vector of float)
+0:132          'r028' ( temp 2-component vector of float)
+0:132          exp ( temp 2-component vector of float)
 0:132            'inF0' ( in 2-component vector of float)
 0:133      Sequence
 0:133        move second child to first child ( temp 2-component vector of float)
-0:133          'r030' ( temp 2-component vector of float)
-0:133          face-forward ( temp 2-component vector of float)
+0:133          'r029' ( temp 2-component vector of float)
+0:133          exp2 ( temp 2-component vector of float)
 0:133            'inF0' ( in 2-component vector of float)
-0:133            'inF1' ( in 2-component vector of float)
-0:133            'inF2' ( in 2-component vector of float)
 0:134      Sequence
-0:134        move second child to first child ( temp 2-component vector of uint)
-0:134          'r031' ( temp 2-component vector of uint)
+0:134        move second child to first child ( temp 2-component vector of float)
+0:134          'r030' ( temp 2-component vector of float)
+0:134          face-forward ( temp 2-component vector of float)
+0:134            'inF0' ( in 2-component vector of float)
+0:134            'inF1' ( in 2-component vector of float)
+0:134            'inF2' ( in 2-component vector of float)
+0:135      Sequence
+0:135        move second child to first child ( temp 2-component vector of uint)
+0:135          'r031' ( temp 2-component vector of uint)
 0:?           findMSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:135      Sequence
-0:135        move second child to first child ( temp 2-component vector of uint)
-0:135          'r032' ( temp 2-component vector of uint)
+0:136      Sequence
+0:136        move second child to first child ( temp 2-component vector of uint)
+0:136          'r032' ( temp 2-component vector of uint)
 0:?           findLSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:136      Sequence
-0:136        move second child to first child ( temp 2-component vector of float)
-0:136          'r033' ( temp 2-component vector of float)
-0:136          Floor ( temp 2-component vector of float)
-0:136            'inF0' ( in 2-component vector of float)
-0:138      Sequence
-0:138        move second child to first child ( temp 2-component vector of float)
-0:138          'r035' ( temp 2-component vector of float)
-0:138          mod ( temp 2-component vector of float)
-0:138            'inF0' ( in 2-component vector of float)
-0:138            'inF1' ( in 2-component vector of float)
+0:137      Sequence
+0:137        move second child to first child ( temp 2-component vector of float)
+0:137          'r033' ( temp 2-component vector of float)
+0:137          Floor ( temp 2-component vector of float)
+0:137            'inF0' ( in 2-component vector of float)
 0:139      Sequence
 0:139        move second child to first child ( temp 2-component vector of float)
-0:139          'r036' ( temp 2-component vector of float)
-0:139          Fraction ( temp 2-component vector of float)
+0:139          'r035' ( temp 2-component vector of float)
+0:139          mod ( temp 2-component vector of float)
 0:139            'inF0' ( in 2-component vector of float)
+0:139            'inF1' ( in 2-component vector of float)
 0:140      Sequence
 0:140        move second child to first child ( temp 2-component vector of float)
-0:140          'r038' ( temp 2-component vector of float)
-0:140          fwidth ( temp 2-component vector of float)
+0:140          'r036' ( temp 2-component vector of float)
+0:140          Fraction ( temp 2-component vector of float)
 0:140            'inF0' ( in 2-component vector of float)
 0:141      Sequence
-0:141        move second child to first child ( temp 2-component vector of bool)
-0:141          'r039' ( temp 2-component vector of bool)
-0:141          isinf ( temp 2-component vector of bool)
+0:141        move second child to first child ( temp 2-component vector of float)
+0:141          'r038' ( temp 2-component vector of float)
+0:141          fwidth ( temp 2-component vector of float)
 0:141            'inF0' ( in 2-component vector of float)
 0:142      Sequence
 0:142        move second child to first child ( temp 2-component vector of bool)
-0:142          'r040' ( temp 2-component vector of bool)
-0:142          isnan ( temp 2-component vector of bool)
+0:142          'r039' ( temp 2-component vector of bool)
+0:142          isinf ( temp 2-component vector of bool)
 0:142            'inF0' ( in 2-component vector of float)
 0:143      Sequence
-0:143        move second child to first child ( temp 2-component vector of float)
-0:143          'r041' ( temp 2-component vector of float)
-0:143          ldexp ( temp 2-component vector of float)
+0:143        move second child to first child ( temp 2-component vector of bool)
+0:143          'r040' ( temp 2-component vector of bool)
+0:143          isnan ( temp 2-component vector of bool)
 0:143            'inF0' ( in 2-component vector of float)
-0:143            'inF1' ( in 2-component vector of float)
 0:144      Sequence
 0:144        move second child to first child ( temp 2-component vector of float)
-0:144          'r039a' ( temp 2-component vector of float)
-0:144          mix ( temp 2-component vector of float)
+0:144          'r041' ( temp 2-component vector of float)
+0:144          ldexp ( temp 2-component vector of float)
 0:144            'inF0' ( in 2-component vector of float)
 0:144            'inF1' ( in 2-component vector of float)
-0:144            'inF2' ( in 2-component vector of float)
 0:145      Sequence
-0:145        move second child to first child ( temp float)
-0:145          'r042' ( temp float)
-0:145          length ( temp float)
+0:145        move second child to first child ( temp 2-component vector of float)
+0:145          'r039a' ( temp 2-component vector of float)
+0:145          mix ( temp 2-component vector of float)
 0:145            'inF0' ( in 2-component vector of float)
+0:145            'inF1' ( in 2-component vector of float)
+0:145            'inF2' ( in 2-component vector of float)
 0:146      Sequence
-0:146        move second child to first child ( temp 2-component vector of float)
-0:146          'r043' ( temp 2-component vector of float)
-0:146          log ( temp 2-component vector of float)
+0:146        move second child to first child ( temp float)
+0:146          'r042' ( temp float)
+0:146          length ( temp float)
 0:146            'inF0' ( in 2-component vector of float)
 0:147      Sequence
 0:147        move second child to first child ( temp 2-component vector of float)
-0:147          'r044' ( temp 2-component vector of float)
-0:147          vector-scale ( temp 2-component vector of float)
-0:147            log2 ( temp 2-component vector of float)
-0:147              'inF0' ( in 2-component vector of float)
-0:147            Constant:
-0:147              0.301030
+0:147          'r043' ( temp 2-component vector of float)
+0:147          log ( temp 2-component vector of float)
+0:147            'inF0' ( in 2-component vector of float)
 0:148      Sequence
 0:148        move second child to first child ( temp 2-component vector of float)
-0:148          'r045' ( temp 2-component vector of float)
-0:148          log2 ( temp 2-component vector of float)
-0:148            'inF0' ( in 2-component vector of float)
+0:148          'r044' ( temp 2-component vector of float)
+0:148          vector-scale ( temp 2-component vector of float)
+0:148            log2 ( temp 2-component vector of float)
+0:148              'inF0' ( in 2-component vector of float)
+0:148            Constant:
+0:148              0.301030
 0:149      Sequence
 0:149        move second child to first child ( temp 2-component vector of float)
-0:149          'r046' ( temp 2-component vector of float)
-0:149          max ( temp 2-component vector of float)
+0:149          'r045' ( temp 2-component vector of float)
+0:149          log2 ( temp 2-component vector of float)
 0:149            'inF0' ( in 2-component vector of float)
-0:149            'inF1' ( in 2-component vector of float)
 0:150      Sequence
 0:150        move second child to first child ( temp 2-component vector of float)
-0:150          'r047' ( temp 2-component vector of float)
-0:150          min ( temp 2-component vector of float)
+0:150          'r046' ( temp 2-component vector of float)
+0:150          max ( temp 2-component vector of float)
 0:150            'inF0' ( in 2-component vector of float)
 0:150            'inF1' ( in 2-component vector of float)
 0:151      Sequence
 0:151        move second child to first child ( temp 2-component vector of float)
-0:151          'r048' ( temp 2-component vector of float)
-0:151          normalize ( temp 2-component vector of float)
+0:151          'r047' ( temp 2-component vector of float)
+0:151          min ( temp 2-component vector of float)
 0:151            'inF0' ( in 2-component vector of float)
+0:151            'inF1' ( in 2-component vector of float)
 0:152      Sequence
 0:152        move second child to first child ( temp 2-component vector of float)
-0:152          'r049' ( temp 2-component vector of float)
-0:152          pow ( temp 2-component vector of float)
+0:152          'r048' ( temp 2-component vector of float)
+0:152          normalize ( temp 2-component vector of float)
 0:152            'inF0' ( in 2-component vector of float)
-0:152            'inF1' ( in 2-component vector of float)
 0:153      Sequence
 0:153        move second child to first child ( temp 2-component vector of float)
-0:153          'r050' ( temp 2-component vector of float)
-0:153          radians ( temp 2-component vector of float)
+0:153          'r049' ( temp 2-component vector of float)
+0:153          pow ( temp 2-component vector of float)
 0:153            'inF0' ( in 2-component vector of float)
+0:153            'inF1' ( in 2-component vector of float)
 0:154      Sequence
 0:154        move second child to first child ( temp 2-component vector of float)
-0:154          'r051' ( temp 2-component vector of float)
-0:154          divide ( temp 2-component vector of float)
-0:154            Constant:
-0:154              1.000000
+0:154          'r050' ( temp 2-component vector of float)
+0:154          radians ( temp 2-component vector of float)
 0:154            'inF0' ( in 2-component vector of float)
 0:155      Sequence
 0:155        move second child to first child ( temp 2-component vector of float)
-0:155          'r052' ( temp 2-component vector of float)
-0:155          reflect ( temp 2-component vector of float)
+0:155          'r051' ( temp 2-component vector of float)
+0:155          divide ( temp 2-component vector of float)
+0:155            Constant:
+0:155              1.000000
 0:155            'inF0' ( in 2-component vector of float)
-0:155            'inF1' ( in 2-component vector of float)
 0:156      Sequence
 0:156        move second child to first child ( temp 2-component vector of float)
-0:156          'r053' ( temp 2-component vector of float)
-0:156          refract ( temp 2-component vector of float)
+0:156          'r052' ( temp 2-component vector of float)
+0:156          reflect ( temp 2-component vector of float)
 0:156            'inF0' ( in 2-component vector of float)
 0:156            'inF1' ( in 2-component vector of float)
-0:156            Constant:
-0:156              2.000000
 0:157      Sequence
-0:157        move second child to first child ( temp 2-component vector of uint)
-0:157          'r054' ( temp 2-component vector of uint)
+0:157        move second child to first child ( temp 2-component vector of float)
+0:157          'r053' ( temp 2-component vector of float)
+0:157          refract ( temp 2-component vector of float)
+0:157            'inF0' ( in 2-component vector of float)
+0:157            'inF1' ( in 2-component vector of float)
+0:157            Constant:
+0:157              2.000000
+0:158      Sequence
+0:158        move second child to first child ( temp 2-component vector of uint)
+0:158          'r054' ( temp 2-component vector of uint)
 0:?           bitFieldReverse ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
-0:158      Sequence
-0:158        move second child to first child ( temp 2-component vector of float)
-0:158          'r055' ( temp 2-component vector of float)
-0:158          roundEven ( temp 2-component vector of float)
-0:158            'inF0' ( in 2-component vector of float)
 0:159      Sequence
 0:159        move second child to first child ( temp 2-component vector of float)
-0:159          'r056' ( temp 2-component vector of float)
-0:159          inverse sqrt ( temp 2-component vector of float)
+0:159          'r055' ( temp 2-component vector of float)
+0:159          roundEven ( temp 2-component vector of float)
 0:159            'inF0' ( in 2-component vector of float)
 0:160      Sequence
 0:160        move second child to first child ( temp 2-component vector of float)
-0:160          'r057' ( temp 2-component vector of float)
-0:160          clamp ( temp 2-component vector of float)
+0:160          'r056' ( temp 2-component vector of float)
+0:160          inverse sqrt ( temp 2-component vector of float)
 0:160            'inF0' ( in 2-component vector of float)
-0:160            Constant:
-0:160              0.000000
-0:160            Constant:
-0:160              1.000000
 0:161      Sequence
 0:161        move second child to first child ( temp 2-component vector of float)
-0:161          'r058' ( temp 2-component vector of float)
-0:161          Sign ( temp 2-component vector of float)
+0:161          'r057' ( temp 2-component vector of float)
+0:161          clamp ( temp 2-component vector of float)
 0:161            'inF0' ( in 2-component vector of float)
+0:161            Constant:
+0:161              0.000000
+0:161            Constant:
+0:161              1.000000
 0:162      Sequence
 0:162        move second child to first child ( temp 2-component vector of float)
-0:162          'r059' ( temp 2-component vector of float)
-0:162          sine ( temp 2-component vector of float)
+0:162          'r058' ( temp 2-component vector of float)
+0:162          Sign ( temp 2-component vector of float)
 0:162            'inF0' ( in 2-component vector of float)
 0:163      Sequence
 0:163        move second child to first child ( temp 2-component vector of float)
-0:163          'inF1' ( in 2-component vector of float)
+0:163          'r059' ( temp 2-component vector of float)
 0:163          sine ( temp 2-component vector of float)
 0:163            'inF0' ( in 2-component vector of float)
-0:163        move second child to first child ( temp 2-component vector of float)
-0:163          'inF2' ( in 2-component vector of float)
-0:163          cosine ( temp 2-component vector of float)
-0:163            'inF0' ( in 2-component vector of float)
 0:164      Sequence
 0:164        move second child to first child ( temp 2-component vector of float)
-0:164          'r060' ( temp 2-component vector of float)
-0:164          hyp. sine ( temp 2-component vector of float)
+0:164          'inF1' ( in 2-component vector of float)
+0:164          sine ( temp 2-component vector of float)
+0:164            'inF0' ( in 2-component vector of float)
+0:164        move second child to first child ( temp 2-component vector of float)
+0:164          'inF2' ( in 2-component vector of float)
+0:164          cosine ( temp 2-component vector of float)
 0:164            'inF0' ( in 2-component vector of float)
 0:165      Sequence
 0:165        move second child to first child ( temp 2-component vector of float)
-0:165          'r061' ( temp 2-component vector of float)
-0:165          smoothstep ( temp 2-component vector of float)
+0:165          'r060' ( temp 2-component vector of float)
+0:165          hyp. sine ( temp 2-component vector of float)
 0:165            'inF0' ( in 2-component vector of float)
-0:165            'inF1' ( in 2-component vector of float)
-0:165            'inF2' ( in 2-component vector of float)
 0:166      Sequence
 0:166        move second child to first child ( temp 2-component vector of float)
-0:166          'r062' ( temp 2-component vector of float)
-0:166          sqrt ( temp 2-component vector of float)
+0:166          'r061' ( temp 2-component vector of float)
+0:166          smoothstep ( temp 2-component vector of float)
 0:166            'inF0' ( in 2-component vector of float)
+0:166            'inF1' ( in 2-component vector of float)
+0:166            'inF2' ( in 2-component vector of float)
 0:167      Sequence
 0:167        move second child to first child ( temp 2-component vector of float)
-0:167          'r063' ( temp 2-component vector of float)
-0:167          step ( temp 2-component vector of float)
+0:167          'r062' ( temp 2-component vector of float)
+0:167          sqrt ( temp 2-component vector of float)
 0:167            'inF0' ( in 2-component vector of float)
-0:167            'inF1' ( in 2-component vector of float)
 0:168      Sequence
 0:168        move second child to first child ( temp 2-component vector of float)
-0:168          'r064' ( temp 2-component vector of float)
-0:168          tangent ( temp 2-component vector of float)
+0:168          'r063' ( temp 2-component vector of float)
+0:168          step ( temp 2-component vector of float)
 0:168            'inF0' ( in 2-component vector of float)
+0:168            'inF1' ( in 2-component vector of float)
 0:169      Sequence
 0:169        move second child to first child ( temp 2-component vector of float)
-0:169          'r065' ( temp 2-component vector of float)
-0:169          hyp. tangent ( temp 2-component vector of float)
+0:169          'r064' ( temp 2-component vector of float)
+0:169          tangent ( temp 2-component vector of float)
 0:169            'inF0' ( in 2-component vector of float)
-0:171      Sequence
-0:171        move second child to first child ( temp 2-component vector of float)
-0:171          'r066' ( temp 2-component vector of float)
-0:171          trunc ( temp 2-component vector of float)
-0:171            'inF0' ( in 2-component vector of float)
-0:174      Branch: Return with expression
+0:170      Sequence
+0:170        move second child to first child ( temp 2-component vector of float)
+0:170          'r065' ( temp 2-component vector of float)
+0:170          hyp. tangent ( temp 2-component vector of float)
+0:170            'inF0' ( in 2-component vector of float)
+0:172      Sequence
+0:172        move second child to first child ( temp 2-component vector of float)
+0:172          'r066' ( temp 2-component vector of float)
+0:172          trunc ( temp 2-component vector of float)
+0:172            'inF0' ( in 2-component vector of float)
+0:175      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:178  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
-0:178    Function Parameters: 
-0:178      'inF0' ( in 3-component vector of float)
-0:178      'inF1' ( in 3-component vector of float)
-0:178      'inF2' ( in 3-component vector of float)
-0:178      'inU0' ( in 3-component vector of uint)
-0:178      'inU1' ( in 3-component vector of uint)
+0:179  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
+0:179    Function Parameters: 
+0:179      'inF0' ( in 3-component vector of float)
+0:179      'inF1' ( in 3-component vector of float)
+0:179      'inF2' ( in 3-component vector of float)
+0:179      'inU0' ( in 3-component vector of uint)
+0:179      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
-0:181      Sequence
-0:181        move second child to first child ( temp bool)
-0:181          'r000' ( temp bool)
-0:181          all ( temp bool)
-0:181            Convert float to bool ( temp 3-component vector of bool)
-0:181              'inF0' ( in 3-component vector of float)
 0:182      Sequence
-0:182        move second child to first child ( temp 3-component vector of float)
-0:182          'r001' ( temp 3-component vector of float)
-0:182          Absolute value ( temp 3-component vector of float)
-0:182            'inF0' ( in 3-component vector of float)
+0:182        move second child to first child ( temp bool)
+0:182          'r000' ( temp bool)
+0:182          all ( temp bool)
+0:182            Convert float to bool ( temp 3-component vector of bool)
+0:182              'inF0' ( in 3-component vector of float)
 0:183      Sequence
 0:183        move second child to first child ( temp 3-component vector of float)
-0:183          'r002' ( temp 3-component vector of float)
-0:183          arc cosine ( temp 3-component vector of float)
+0:183          'r001' ( temp 3-component vector of float)
+0:183          Absolute value ( temp 3-component vector of float)
 0:183            'inF0' ( in 3-component vector of float)
 0:184      Sequence
-0:184        move second child to first child ( temp bool)
-0:184          'r003' ( temp bool)
-0:184          any ( temp bool)
-0:184            Convert float to bool ( temp 3-component vector of bool)
-0:184              'inF0' ( in 3-component vector of float)
+0:184        move second child to first child ( temp 3-component vector of float)
+0:184          'r002' ( temp 3-component vector of float)
+0:184          arc cosine ( temp 3-component vector of float)
+0:184            'inF0' ( in 3-component vector of float)
 0:185      Sequence
-0:185        move second child to first child ( temp 3-component vector of float)
-0:185          'r004' ( temp 3-component vector of float)
-0:185          arc sine ( temp 3-component vector of float)
-0:185            'inF0' ( in 3-component vector of float)
+0:185        move second child to first child ( temp bool)
+0:185          'r003' ( temp bool)
+0:185          any ( temp bool)
+0:185            Convert float to bool ( temp 3-component vector of bool)
+0:185              'inF0' ( in 3-component vector of float)
 0:186      Sequence
-0:186        move second child to first child ( temp 3-component vector of int)
-0:186          'r005' ( temp 3-component vector of int)
-0:186          floatBitsToInt ( temp 3-component vector of int)
+0:186        move second child to first child ( temp 3-component vector of float)
+0:186          'r004' ( temp 3-component vector of float)
+0:186          arc sine ( temp 3-component vector of float)
 0:186            'inF0' ( in 3-component vector of float)
 0:187      Sequence
-0:187        move second child to first child ( temp 3-component vector of uint)
-0:187          'r006' ( temp 3-component vector of uint)
-0:187          floatBitsToUint ( temp 3-component vector of uint)
+0:187        move second child to first child ( temp 3-component vector of int)
+0:187          'r005' ( temp 3-component vector of int)
+0:187          floatBitsToInt ( temp 3-component vector of int)
 0:187            'inF0' ( in 3-component vector of float)
 0:188      Sequence
-0:188        move second child to first child ( temp 3-component vector of float)
-0:188          'r007' ( temp 3-component vector of float)
-0:188          intBitsToFloat ( temp 3-component vector of float)
-0:188            'inU0' ( in 3-component vector of uint)
-0:190      Sequence
-0:190        move second child to first child ( temp 3-component vector of float)
-0:190          'r009' ( temp 3-component vector of float)
-0:190          arc tangent ( temp 3-component vector of float)
-0:190            'inF0' ( in 3-component vector of float)
+0:188        move second child to first child ( temp 3-component vector of uint)
+0:188          'r006' ( temp 3-component vector of uint)
+0:188          floatBitsToUint ( temp 3-component vector of uint)
+0:188            'inF0' ( in 3-component vector of float)
+0:189      Sequence
+0:189        move second child to first child ( temp 3-component vector of float)
+0:189          'r007' ( temp 3-component vector of float)
+0:189          intBitsToFloat ( temp 3-component vector of float)
+0:189            'inU0' ( in 3-component vector of uint)
 0:191      Sequence
 0:191        move second child to first child ( temp 3-component vector of float)
-0:191          'r010' ( temp 3-component vector of float)
+0:191          'r009' ( temp 3-component vector of float)
 0:191          arc tangent ( temp 3-component vector of float)
 0:191            'inF0' ( in 3-component vector of float)
-0:191            'inF1' ( in 3-component vector of float)
 0:192      Sequence
 0:192        move second child to first child ( temp 3-component vector of float)
-0:192          'r011' ( temp 3-component vector of float)
-0:192          Ceiling ( temp 3-component vector of float)
+0:192          'r010' ( temp 3-component vector of float)
+0:192          arc tangent ( temp 3-component vector of float)
 0:192            'inF0' ( in 3-component vector of float)
+0:192            'inF1' ( in 3-component vector of float)
 0:193      Sequence
 0:193        move second child to first child ( temp 3-component vector of float)
-0:193          'r012' ( temp 3-component vector of float)
-0:193          clamp ( temp 3-component vector of float)
+0:193          'r011' ( temp 3-component vector of float)
+0:193          Ceiling ( temp 3-component vector of float)
 0:193            'inF0' ( in 3-component vector of float)
-0:193            'inF1' ( in 3-component vector of float)
-0:193            'inF2' ( in 3-component vector of float)
-0:194      Test condition and select ( temp void)
-0:194        Condition
-0:194        any ( temp bool)
-0:194          Compare Less Than ( temp 3-component vector of bool)
+0:194      Sequence
+0:194        move second child to first child ( temp 3-component vector of float)
+0:194          'r012' ( temp 3-component vector of float)
+0:194          clamp ( temp 3-component vector of float)
 0:194            'inF0' ( in 3-component vector of float)
-0:194            Constant:
-0:194              0.000000
-0:194              0.000000
-0:194              0.000000
-0:194        true case
-0:194        Branch: Kill
+0:194            'inF1' ( in 3-component vector of float)
+0:194            'inF2' ( in 3-component vector of float)
 0:195      Test condition and select ( temp void)
 0:195        Condition
 0:195        any ( temp bool)
 0:195          Compare Less Than ( temp 3-component vector of bool)
-0:195            'inU0' ( in 3-component vector of uint)
+0:195            'inF0' ( in 3-component vector of float)
 0:195            Constant:
 0:195              0.000000
 0:195              0.000000
 0:195              0.000000
 0:195        true case
 0:195        Branch: Kill
-0:196      Sequence
-0:196        move second child to first child ( temp 3-component vector of float)
-0:196          'r013' ( temp 3-component vector of float)
-0:196          cosine ( temp 3-component vector of float)
-0:196            'inF0' ( in 3-component vector of float)
+0:196      Test condition and select ( temp void)
+0:196        Condition
+0:196        any ( temp bool)
+0:196          Compare Less Than ( temp 3-component vector of bool)
+0:196            'inU0' ( in 3-component vector of uint)
+0:196            Constant:
+0:196              0.000000
+0:196              0.000000
+0:196              0.000000
+0:196        true case
+0:196        Branch: Kill
 0:197      Sequence
 0:197        move second child to first child ( temp 3-component vector of float)
-0:197          'r014' ( temp 3-component vector of float)
-0:197          hyp. cosine ( temp 3-component vector of float)
+0:197          'r013' ( temp 3-component vector of float)
+0:197          cosine ( temp 3-component vector of float)
 0:197            'inF0' ( in 3-component vector of float)
 0:198      Sequence
-0:198        move second child to first child ( temp 3-component vector of uint)
-0:198          'r015' ( temp 3-component vector of uint)
+0:198        move second child to first child ( temp 3-component vector of float)
+0:198          'r014' ( temp 3-component vector of float)
+0:198          hyp. cosine ( temp 3-component vector of float)
+0:198            'inF0' ( in 3-component vector of float)
+0:199      Sequence
+0:199        move second child to first child ( temp 3-component vector of uint)
+0:199          'r015' ( temp 3-component vector of uint)
 0:?           bitCount ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
-0:199      Sequence
-0:199        move second child to first child ( temp 3-component vector of float)
-0:199          'r016' ( temp 3-component vector of float)
-0:199          cross-product ( temp 3-component vector of float)
-0:199            'inF0' ( in 3-component vector of float)
-0:199            'inF1' ( in 3-component vector of float)
 0:200      Sequence
 0:200        move second child to first child ( temp 3-component vector of float)
-0:200          'r017' ( temp 3-component vector of float)
-0:200          dPdx ( temp 3-component vector of float)
+0:200          'r016' ( temp 3-component vector of float)
+0:200          cross-product ( temp 3-component vector of float)
 0:200            'inF0' ( in 3-component vector of float)
+0:200            'inF1' ( in 3-component vector of float)
 0:201      Sequence
 0:201        move second child to first child ( temp 3-component vector of float)
-0:201          'r018' ( temp 3-component vector of float)
-0:201          dPdxCoarse ( temp 3-component vector of float)
+0:201          'r017' ( temp 3-component vector of float)
+0:201          dPdx ( temp 3-component vector of float)
 0:201            'inF0' ( in 3-component vector of float)
 0:202      Sequence
 0:202        move second child to first child ( temp 3-component vector of float)
-0:202          'r019' ( temp 3-component vector of float)
-0:202          dPdxFine ( temp 3-component vector of float)
+0:202          'r018' ( temp 3-component vector of float)
+0:202          dPdxCoarse ( temp 3-component vector of float)
 0:202            'inF0' ( in 3-component vector of float)
 0:203      Sequence
 0:203        move second child to first child ( temp 3-component vector of float)
-0:203          'r020' ( temp 3-component vector of float)
-0:203          dPdy ( temp 3-component vector of float)
+0:203          'r019' ( temp 3-component vector of float)
+0:203          dPdxFine ( temp 3-component vector of float)
 0:203            'inF0' ( in 3-component vector of float)
 0:204      Sequence
 0:204        move second child to first child ( temp 3-component vector of float)
-0:204          'r021' ( temp 3-component vector of float)
-0:204          dPdyCoarse ( temp 3-component vector of float)
+0:204          'r020' ( temp 3-component vector of float)
+0:204          dPdy ( temp 3-component vector of float)
 0:204            'inF0' ( in 3-component vector of float)
 0:205      Sequence
 0:205        move second child to first child ( temp 3-component vector of float)
-0:205          'r022' ( temp 3-component vector of float)
-0:205          dPdyFine ( temp 3-component vector of float)
+0:205          'r021' ( temp 3-component vector of float)
+0:205          dPdyCoarse ( temp 3-component vector of float)
 0:205            'inF0' ( in 3-component vector of float)
 0:206      Sequence
 0:206        move second child to first child ( temp 3-component vector of float)
-0:206          'r023' ( temp 3-component vector of float)
-0:206          degrees ( temp 3-component vector of float)
+0:206          'r022' ( temp 3-component vector of float)
+0:206          dPdyFine ( temp 3-component vector of float)
 0:206            'inF0' ( in 3-component vector of float)
 0:207      Sequence
-0:207        move second child to first child ( temp float)
-0:207          'r024' ( temp float)
-0:207          distance ( temp float)
+0:207        move second child to first child ( temp 3-component vector of float)
+0:207          'r023' ( temp 3-component vector of float)
+0:207          degrees ( temp 3-component vector of float)
 0:207            'inF0' ( in 3-component vector of float)
-0:207            'inF1' ( in 3-component vector of float)
 0:208      Sequence
 0:208        move second child to first child ( temp float)
-0:208          'r025' ( temp float)
-0:208          dot-product ( temp float)
+0:208          'r024' ( temp float)
+0:208          distance ( temp float)
 0:208            'inF0' ( in 3-component vector of float)
 0:208            'inF1' ( in 3-component vector of float)
-0:212      Sequence
-0:212        move second child to first child ( temp 3-component vector of float)
-0:212          'r029' ( temp 3-component vector of float)
-0:212          exp ( temp 3-component vector of float)
-0:212            'inF0' ( in 3-component vector of float)
+0:209      Sequence
+0:209        move second child to first child ( temp float)
+0:209          'r025' ( temp float)
+0:209          dot-product ( temp float)
+0:209            'inF0' ( in 3-component vector of float)
+0:209            'inF1' ( in 3-component vector of float)
 0:213      Sequence
 0:213        move second child to first child ( temp 3-component vector of float)
-0:213          'r030' ( temp 3-component vector of float)
-0:213          exp2 ( temp 3-component vector of float)
+0:213          'r029' ( temp 3-component vector of float)
+0:213          exp ( temp 3-component vector of float)
 0:213            'inF0' ( in 3-component vector of float)
 0:214      Sequence
 0:214        move second child to first child ( temp 3-component vector of float)
-0:214          'r031' ( temp 3-component vector of float)
-0:214          face-forward ( temp 3-component vector of float)
+0:214          'r030' ( temp 3-component vector of float)
+0:214          exp2 ( temp 3-component vector of float)
 0:214            'inF0' ( in 3-component vector of float)
-0:214            'inF1' ( in 3-component vector of float)
-0:214            'inF2' ( in 3-component vector of float)
 0:215      Sequence
-0:215        move second child to first child ( temp 3-component vector of uint)
-0:215          'r032' ( temp 3-component vector of uint)
+0:215        move second child to first child ( temp 3-component vector of float)
+0:215          'r031' ( temp 3-component vector of float)
+0:215          face-forward ( temp 3-component vector of float)
+0:215            'inF0' ( in 3-component vector of float)
+0:215            'inF1' ( in 3-component vector of float)
+0:215            'inF2' ( in 3-component vector of float)
+0:216      Sequence
+0:216        move second child to first child ( temp 3-component vector of uint)
+0:216          'r032' ( temp 3-component vector of uint)
 0:?           findMSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:216      Sequence
-0:216        move second child to first child ( temp 3-component vector of uint)
-0:216          'r033' ( temp 3-component vector of uint)
+0:217      Sequence
+0:217        move second child to first child ( temp 3-component vector of uint)
+0:217          'r033' ( temp 3-component vector of uint)
 0:?           findLSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:217      Sequence
-0:217        move second child to first child ( temp 3-component vector of float)
-0:217          'r034' ( temp 3-component vector of float)
-0:217          Floor ( temp 3-component vector of float)
-0:217            'inF0' ( in 3-component vector of float)
-0:219      Sequence
-0:219        move second child to first child ( temp 3-component vector of float)
-0:219          'r036' ( temp 3-component vector of float)
-0:219          mod ( temp 3-component vector of float)
-0:219            'inF0' ( in 3-component vector of float)
-0:219            'inF1' ( in 3-component vector of float)
+0:218      Sequence
+0:218        move second child to first child ( temp 3-component vector of float)
+0:218          'r034' ( temp 3-component vector of float)
+0:218          Floor ( temp 3-component vector of float)
+0:218            'inF0' ( in 3-component vector of float)
 0:220      Sequence
 0:220        move second child to first child ( temp 3-component vector of float)
-0:220          'r037' ( temp 3-component vector of float)
-0:220          Fraction ( temp 3-component vector of float)
+0:220          'r036' ( temp 3-component vector of float)
+0:220          mod ( temp 3-component vector of float)
 0:220            'inF0' ( in 3-component vector of float)
+0:220            'inF1' ( in 3-component vector of float)
 0:221      Sequence
 0:221        move second child to first child ( temp 3-component vector of float)
-0:221          'r039' ( temp 3-component vector of float)
-0:221          fwidth ( temp 3-component vector of float)
+0:221          'r037' ( temp 3-component vector of float)
+0:221          Fraction ( temp 3-component vector of float)
 0:221            'inF0' ( in 3-component vector of float)
 0:222      Sequence
-0:222        move second child to first child ( temp 3-component vector of bool)
-0:222          'r040' ( temp 3-component vector of bool)
-0:222          isinf ( temp 3-component vector of bool)
+0:222        move second child to first child ( temp 3-component vector of float)
+0:222          'r039' ( temp 3-component vector of float)
+0:222          fwidth ( temp 3-component vector of float)
 0:222            'inF0' ( in 3-component vector of float)
 0:223      Sequence
 0:223        move second child to first child ( temp 3-component vector of bool)
-0:223          'r041' ( temp 3-component vector of bool)
-0:223          isnan ( temp 3-component vector of bool)
+0:223          'r040' ( temp 3-component vector of bool)
+0:223          isinf ( temp 3-component vector of bool)
 0:223            'inF0' ( in 3-component vector of float)
 0:224      Sequence
-0:224        move second child to first child ( temp 3-component vector of float)
-0:224          'r042' ( temp 3-component vector of float)
-0:224          ldexp ( temp 3-component vector of float)
+0:224        move second child to first child ( temp 3-component vector of bool)
+0:224          'r041' ( temp 3-component vector of bool)
+0:224          isnan ( temp 3-component vector of bool)
 0:224            'inF0' ( in 3-component vector of float)
-0:224            'inF1' ( in 3-component vector of float)
 0:225      Sequence
 0:225        move second child to first child ( temp 3-component vector of float)
-0:225          'r039a' ( temp 3-component vector of float)
-0:225          mix ( temp 3-component vector of float)
+0:225          'r042' ( temp 3-component vector of float)
+0:225          ldexp ( temp 3-component vector of float)
 0:225            'inF0' ( in 3-component vector of float)
 0:225            'inF1' ( in 3-component vector of float)
-0:225            'inF2' ( in 3-component vector of float)
 0:226      Sequence
 0:226        move second child to first child ( temp 3-component vector of float)
-0:226          'r039b' ( temp 3-component vector of float)
+0:226          'r039a' ( temp 3-component vector of float)
 0:226          mix ( temp 3-component vector of float)
 0:226            'inF0' ( in 3-component vector of float)
 0:226            'inF1' ( in 3-component vector of float)
-0:226            Constant:
-0:226              0.300000
+0:226            'inF2' ( in 3-component vector of float)
 0:227      Sequence
-0:227        move second child to first child ( temp float)
-0:227          'r043' ( temp float)
-0:227          length ( temp float)
+0:227        move second child to first child ( temp 3-component vector of float)
+0:227          'r039b' ( temp 3-component vector of float)
+0:227          mix ( temp 3-component vector of float)
 0:227            'inF0' ( in 3-component vector of float)
+0:227            'inF1' ( in 3-component vector of float)
+0:227            Constant:
+0:227              0.300000
 0:228      Sequence
-0:228        move second child to first child ( temp 3-component vector of float)
-0:228          'r044' ( temp 3-component vector of float)
-0:228          log ( temp 3-component vector of float)
+0:228        move second child to first child ( temp float)
+0:228          'r043' ( temp float)
+0:228          length ( temp float)
 0:228            'inF0' ( in 3-component vector of float)
 0:229      Sequence
 0:229        move second child to first child ( temp 3-component vector of float)
-0:229          'r045' ( temp 3-component vector of float)
-0:229          vector-scale ( temp 3-component vector of float)
-0:229            log2 ( temp 3-component vector of float)
-0:229              'inF0' ( in 3-component vector of float)
-0:229            Constant:
-0:229              0.301030
+0:229          'r044' ( temp 3-component vector of float)
+0:229          log ( temp 3-component vector of float)
+0:229            'inF0' ( in 3-component vector of float)
 0:230      Sequence
 0:230        move second child to first child ( temp 3-component vector of float)
-0:230          'r046' ( temp 3-component vector of float)
-0:230          log2 ( temp 3-component vector of float)
-0:230            'inF0' ( in 3-component vector of float)
+0:230          'r045' ( temp 3-component vector of float)
+0:230          vector-scale ( temp 3-component vector of float)
+0:230            log2 ( temp 3-component vector of float)
+0:230              'inF0' ( in 3-component vector of float)
+0:230            Constant:
+0:230              0.301030
 0:231      Sequence
 0:231        move second child to first child ( temp 3-component vector of float)
-0:231          'r047' ( temp 3-component vector of float)
-0:231          max ( temp 3-component vector of float)
+0:231          'r046' ( temp 3-component vector of float)
+0:231          log2 ( temp 3-component vector of float)
 0:231            'inF0' ( in 3-component vector of float)
-0:231            'inF1' ( in 3-component vector of float)
 0:232      Sequence
 0:232        move second child to first child ( temp 3-component vector of float)
-0:232          'r048' ( temp 3-component vector of float)
-0:232          min ( temp 3-component vector of float)
+0:232          'r047' ( temp 3-component vector of float)
+0:232          max ( temp 3-component vector of float)
 0:232            'inF0' ( in 3-component vector of float)
 0:232            'inF1' ( in 3-component vector of float)
 0:233      Sequence
 0:233        move second child to first child ( temp 3-component vector of float)
-0:233          'r049' ( temp 3-component vector of float)
-0:233          normalize ( temp 3-component vector of float)
+0:233          'r048' ( temp 3-component vector of float)
+0:233          min ( temp 3-component vector of float)
 0:233            'inF0' ( in 3-component vector of float)
+0:233            'inF1' ( in 3-component vector of float)
 0:234      Sequence
 0:234        move second child to first child ( temp 3-component vector of float)
-0:234          'r050' ( temp 3-component vector of float)
-0:234          pow ( temp 3-component vector of float)
+0:234          'r049' ( temp 3-component vector of float)
+0:234          normalize ( temp 3-component vector of float)
 0:234            'inF0' ( in 3-component vector of float)
-0:234            'inF1' ( in 3-component vector of float)
 0:235      Sequence
 0:235        move second child to first child ( temp 3-component vector of float)
-0:235          'r051' ( temp 3-component vector of float)
-0:235          radians ( temp 3-component vector of float)
+0:235          'r050' ( temp 3-component vector of float)
+0:235          pow ( temp 3-component vector of float)
 0:235            'inF0' ( in 3-component vector of float)
+0:235            'inF1' ( in 3-component vector of float)
 0:236      Sequence
 0:236        move second child to first child ( temp 3-component vector of float)
-0:236          'r052' ( temp 3-component vector of float)
-0:236          divide ( temp 3-component vector of float)
-0:236            Constant:
-0:236              1.000000
+0:236          'r051' ( temp 3-component vector of float)
+0:236          radians ( temp 3-component vector of float)
 0:236            'inF0' ( in 3-component vector of float)
 0:237      Sequence
 0:237        move second child to first child ( temp 3-component vector of float)
-0:237          'r053' ( temp 3-component vector of float)
-0:237          reflect ( temp 3-component vector of float)
+0:237          'r052' ( temp 3-component vector of float)
+0:237          divide ( temp 3-component vector of float)
+0:237            Constant:
+0:237              1.000000
 0:237            'inF0' ( in 3-component vector of float)
-0:237            'inF1' ( in 3-component vector of float)
 0:238      Sequence
 0:238        move second child to first child ( temp 3-component vector of float)
-0:238          'r054' ( temp 3-component vector of float)
-0:238          refract ( temp 3-component vector of float)
+0:238          'r053' ( temp 3-component vector of float)
+0:238          reflect ( temp 3-component vector of float)
 0:238            'inF0' ( in 3-component vector of float)
 0:238            'inF1' ( in 3-component vector of float)
-0:238            Constant:
-0:238              2.000000
 0:239      Sequence
-0:239        move second child to first child ( temp 3-component vector of uint)
-0:239          'r055' ( temp 3-component vector of uint)
+0:239        move second child to first child ( temp 3-component vector of float)
+0:239          'r054' ( temp 3-component vector of float)
+0:239          refract ( temp 3-component vector of float)
+0:239            'inF0' ( in 3-component vector of float)
+0:239            'inF1' ( in 3-component vector of float)
+0:239            Constant:
+0:239              2.000000
+0:240      Sequence
+0:240        move second child to first child ( temp 3-component vector of uint)
+0:240          'r055' ( temp 3-component vector of uint)
 0:?           bitFieldReverse ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
-0:240      Sequence
-0:240        move second child to first child ( temp 3-component vector of float)
-0:240          'r056' ( temp 3-component vector of float)
-0:240          roundEven ( temp 3-component vector of float)
-0:240            'inF0' ( in 3-component vector of float)
 0:241      Sequence
 0:241        move second child to first child ( temp 3-component vector of float)
-0:241          'r057' ( temp 3-component vector of float)
-0:241          inverse sqrt ( temp 3-component vector of float)
+0:241          'r056' ( temp 3-component vector of float)
+0:241          roundEven ( temp 3-component vector of float)
 0:241            'inF0' ( in 3-component vector of float)
 0:242      Sequence
 0:242        move second child to first child ( temp 3-component vector of float)
-0:242          'r058' ( temp 3-component vector of float)
-0:242          clamp ( temp 3-component vector of float)
+0:242          'r057' ( temp 3-component vector of float)
+0:242          inverse sqrt ( temp 3-component vector of float)
 0:242            'inF0' ( in 3-component vector of float)
-0:242            Constant:
-0:242              0.000000
-0:242            Constant:
-0:242              1.000000
 0:243      Sequence
 0:243        move second child to first child ( temp 3-component vector of float)
-0:243          'r059' ( temp 3-component vector of float)
-0:243          Sign ( temp 3-component vector of float)
+0:243          'r058' ( temp 3-component vector of float)
+0:243          clamp ( temp 3-component vector of float)
 0:243            'inF0' ( in 3-component vector of float)
+0:243            Constant:
+0:243              0.000000
+0:243            Constant:
+0:243              1.000000
 0:244      Sequence
 0:244        move second child to first child ( temp 3-component vector of float)
-0:244          'r060' ( temp 3-component vector of float)
-0:244          sine ( temp 3-component vector of float)
+0:244          'r059' ( temp 3-component vector of float)
+0:244          Sign ( temp 3-component vector of float)
 0:244            'inF0' ( in 3-component vector of float)
 0:245      Sequence
 0:245        move second child to first child ( temp 3-component vector of float)
-0:245          'inF1' ( in 3-component vector of float)
+0:245          'r060' ( temp 3-component vector of float)
 0:245          sine ( temp 3-component vector of float)
 0:245            'inF0' ( in 3-component vector of float)
-0:245        move second child to first child ( temp 3-component vector of float)
-0:245          'inF2' ( in 3-component vector of float)
-0:245          cosine ( temp 3-component vector of float)
-0:245            'inF0' ( in 3-component vector of float)
 0:246      Sequence
 0:246        move second child to first child ( temp 3-component vector of float)
-0:246          'r061' ( temp 3-component vector of float)
-0:246          hyp. sine ( temp 3-component vector of float)
+0:246          'inF1' ( in 3-component vector of float)
+0:246          sine ( temp 3-component vector of float)
+0:246            'inF0' ( in 3-component vector of float)
+0:246        move second child to first child ( temp 3-component vector of float)
+0:246          'inF2' ( in 3-component vector of float)
+0:246          cosine ( temp 3-component vector of float)
 0:246            'inF0' ( in 3-component vector of float)
 0:247      Sequence
 0:247        move second child to first child ( temp 3-component vector of float)
-0:247          'r062' ( temp 3-component vector of float)
-0:247          smoothstep ( temp 3-component vector of float)
+0:247          'r061' ( temp 3-component vector of float)
+0:247          hyp. sine ( temp 3-component vector of float)
 0:247            'inF0' ( in 3-component vector of float)
-0:247            'inF1' ( in 3-component vector of float)
-0:247            'inF2' ( in 3-component vector of float)
 0:248      Sequence
 0:248        move second child to first child ( temp 3-component vector of float)
-0:248          'r063' ( temp 3-component vector of float)
-0:248          sqrt ( temp 3-component vector of float)
+0:248          'r062' ( temp 3-component vector of float)
+0:248          smoothstep ( temp 3-component vector of float)
 0:248            'inF0' ( in 3-component vector of float)
+0:248            'inF1' ( in 3-component vector of float)
+0:248            'inF2' ( in 3-component vector of float)
 0:249      Sequence
 0:249        move second child to first child ( temp 3-component vector of float)
-0:249          'r064' ( temp 3-component vector of float)
-0:249          step ( temp 3-component vector of float)
+0:249          'r063' ( temp 3-component vector of float)
+0:249          sqrt ( temp 3-component vector of float)
 0:249            'inF0' ( in 3-component vector of float)
-0:249            'inF1' ( in 3-component vector of float)
 0:250      Sequence
 0:250        move second child to first child ( temp 3-component vector of float)
-0:250          'r065' ( temp 3-component vector of float)
-0:250          tangent ( temp 3-component vector of float)
+0:250          'r064' ( temp 3-component vector of float)
+0:250          step ( temp 3-component vector of float)
 0:250            'inF0' ( in 3-component vector of float)
+0:250            'inF1' ( in 3-component vector of float)
 0:251      Sequence
 0:251        move second child to first child ( temp 3-component vector of float)
-0:251          'r066' ( temp 3-component vector of float)
-0:251          hyp. tangent ( temp 3-component vector of float)
+0:251          'r065' ( temp 3-component vector of float)
+0:251          tangent ( temp 3-component vector of float)
 0:251            'inF0' ( in 3-component vector of float)
-0:253      Sequence
-0:253        move second child to first child ( temp 3-component vector of float)
-0:253          'r067' ( temp 3-component vector of float)
-0:253          trunc ( temp 3-component vector of float)
-0:253            'inF0' ( in 3-component vector of float)
-0:256      Branch: Return with expression
+0:252      Sequence
+0:252        move second child to first child ( temp 3-component vector of float)
+0:252          'r066' ( temp 3-component vector of float)
+0:252          hyp. tangent ( temp 3-component vector of float)
+0:252            'inF0' ( in 3-component vector of float)
+0:254      Sequence
+0:254        move second child to first child ( temp 3-component vector of float)
+0:254          'r067' ( temp 3-component vector of float)
+0:254          trunc ( temp 3-component vector of float)
+0:254            'inF0' ( in 3-component vector of float)
+0:257      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:260  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
-0:260    Function Parameters: 
-0:260      'inF0' ( in 4-component vector of float)
-0:260      'inF1' ( in 4-component vector of float)
-0:260      'inF2' ( in 4-component vector of float)
-0:260      'inU0' ( in 4-component vector of uint)
-0:260      'inU1' ( in 4-component vector of uint)
+0:261  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
+0:261    Function Parameters: 
+0:261      'inF0' ( in 4-component vector of float)
+0:261      'inF1' ( in 4-component vector of float)
+0:261      'inF2' ( in 4-component vector of float)
+0:261      'inU0' ( in 4-component vector of uint)
+0:261      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
-0:263      Sequence
-0:263        move second child to first child ( temp bool)
-0:263          'r000' ( temp bool)
-0:263          all ( temp bool)
-0:263            Convert float to bool ( temp 4-component vector of bool)
-0:263              'inF0' ( in 4-component vector of float)
 0:264      Sequence
-0:264        move second child to first child ( temp 4-component vector of float)
-0:264          'r001' ( temp 4-component vector of float)
-0:264          Absolute value ( temp 4-component vector of float)
-0:264            'inF0' ( in 4-component vector of float)
+0:264        move second child to first child ( temp bool)
+0:264          'r000' ( temp bool)
+0:264          all ( temp bool)
+0:264            Convert float to bool ( temp 4-component vector of bool)
+0:264              'inF0' ( in 4-component vector of float)
 0:265      Sequence
 0:265        move second child to first child ( temp 4-component vector of float)
-0:265          'r002' ( temp 4-component vector of float)
-0:265          arc cosine ( temp 4-component vector of float)
+0:265          'r001' ( temp 4-component vector of float)
+0:265          Absolute value ( temp 4-component vector of float)
 0:265            'inF0' ( in 4-component vector of float)
 0:266      Sequence
-0:266        move second child to first child ( temp bool)
-0:266          'r003' ( temp bool)
-0:266          any ( temp bool)
-0:266            Convert float to bool ( temp 4-component vector of bool)
-0:266              'inF0' ( in 4-component vector of float)
+0:266        move second child to first child ( temp 4-component vector of float)
+0:266          'r002' ( temp 4-component vector of float)
+0:266          arc cosine ( temp 4-component vector of float)
+0:266            'inF0' ( in 4-component vector of float)
 0:267      Sequence
-0:267        move second child to first child ( temp 4-component vector of float)
-0:267          'r004' ( temp 4-component vector of float)
-0:267          arc sine ( temp 4-component vector of float)
-0:267            'inF0' ( in 4-component vector of float)
+0:267        move second child to first child ( temp bool)
+0:267          'r003' ( temp bool)
+0:267          any ( temp bool)
+0:267            Convert float to bool ( temp 4-component vector of bool)
+0:267              'inF0' ( in 4-component vector of float)
 0:268      Sequence
-0:268        move second child to first child ( temp 4-component vector of int)
-0:268          'r005' ( temp 4-component vector of int)
-0:268          floatBitsToInt ( temp 4-component vector of int)
+0:268        move second child to first child ( temp 4-component vector of float)
+0:268          'r004' ( temp 4-component vector of float)
+0:268          arc sine ( temp 4-component vector of float)
 0:268            'inF0' ( in 4-component vector of float)
 0:269      Sequence
-0:269        move second child to first child ( temp 4-component vector of uint)
-0:269          'r006' ( temp 4-component vector of uint)
-0:269          floatBitsToUint ( temp 4-component vector of uint)
+0:269        move second child to first child ( temp 4-component vector of int)
+0:269          'r005' ( temp 4-component vector of int)
+0:269          floatBitsToInt ( temp 4-component vector of int)
 0:269            'inF0' ( in 4-component vector of float)
 0:270      Sequence
-0:270        move second child to first child ( temp 4-component vector of float)
-0:270          'r007' ( temp 4-component vector of float)
-0:270          intBitsToFloat ( temp 4-component vector of float)
-0:270            'inU0' ( in 4-component vector of uint)
-0:272      Sequence
-0:272        move second child to first child ( temp 4-component vector of float)
-0:272          'r009' ( temp 4-component vector of float)
-0:272          arc tangent ( temp 4-component vector of float)
-0:272            'inF0' ( in 4-component vector of float)
+0:270        move second child to first child ( temp 4-component vector of uint)
+0:270          'r006' ( temp 4-component vector of uint)
+0:270          floatBitsToUint ( temp 4-component vector of uint)
+0:270            'inF0' ( in 4-component vector of float)
+0:271      Sequence
+0:271        move second child to first child ( temp 4-component vector of float)
+0:271          'r007' ( temp 4-component vector of float)
+0:271          intBitsToFloat ( temp 4-component vector of float)
+0:271            'inU0' ( in 4-component vector of uint)
 0:273      Sequence
 0:273        move second child to first child ( temp 4-component vector of float)
-0:273          'r010' ( temp 4-component vector of float)
+0:273          'r009' ( temp 4-component vector of float)
 0:273          arc tangent ( temp 4-component vector of float)
 0:273            'inF0' ( in 4-component vector of float)
-0:273            'inF1' ( in 4-component vector of float)
 0:274      Sequence
 0:274        move second child to first child ( temp 4-component vector of float)
-0:274          'r011' ( temp 4-component vector of float)
-0:274          Ceiling ( temp 4-component vector of float)
+0:274          'r010' ( temp 4-component vector of float)
+0:274          arc tangent ( temp 4-component vector of float)
 0:274            'inF0' ( in 4-component vector of float)
+0:274            'inF1' ( in 4-component vector of float)
 0:275      Sequence
 0:275        move second child to first child ( temp 4-component vector of float)
-0:275          'r012' ( temp 4-component vector of float)
-0:275          clamp ( temp 4-component vector of float)
+0:275          'r011' ( temp 4-component vector of float)
+0:275          Ceiling ( temp 4-component vector of float)
 0:275            'inF0' ( in 4-component vector of float)
-0:275            'inF1' ( in 4-component vector of float)
-0:275            'inF2' ( in 4-component vector of float)
-0:276      Test condition and select ( temp void)
-0:276        Condition
-0:276        any ( temp bool)
-0:276          Compare Less Than ( temp 4-component vector of bool)
+0:276      Sequence
+0:276        move second child to first child ( temp 4-component vector of float)
+0:276          'r012' ( temp 4-component vector of float)
+0:276          clamp ( temp 4-component vector of float)
 0:276            'inF0' ( in 4-component vector of float)
-0:276            Constant:
-0:276              0.000000
-0:276              0.000000
-0:276              0.000000
-0:276              0.000000
-0:276        true case
-0:276        Branch: Kill
+0:276            'inF1' ( in 4-component vector of float)
+0:276            'inF2' ( in 4-component vector of float)
 0:277      Test condition and select ( temp void)
 0:277        Condition
 0:277        any ( temp bool)
 0:277          Compare Less Than ( temp 4-component vector of bool)
-0:277            'inU0' ( in 4-component vector of uint)
+0:277            'inF0' ( in 4-component vector of float)
 0:277            Constant:
 0:277              0.000000
 0:277              0.000000
@@ -1253,905 +1247,917 @@
 0:277              0.000000
 0:277        true case
 0:277        Branch: Kill
-0:278      Sequence
-0:278        move second child to first child ( temp 4-component vector of float)
-0:278          'r013' ( temp 4-component vector of float)
-0:278          cosine ( temp 4-component vector of float)
-0:278            'inF0' ( in 4-component vector of float)
+0:278      Test condition and select ( temp void)
+0:278        Condition
+0:278        any ( temp bool)
+0:278          Compare Less Than ( temp 4-component vector of bool)
+0:278            'inU0' ( in 4-component vector of uint)
+0:278            Constant:
+0:278              0.000000
+0:278              0.000000
+0:278              0.000000
+0:278              0.000000
+0:278        true case
+0:278        Branch: Kill
 0:279      Sequence
 0:279        move second child to first child ( temp 4-component vector of float)
-0:279          'r014' ( temp 4-component vector of float)
-0:279          hyp. cosine ( temp 4-component vector of float)
+0:279          'r013' ( temp 4-component vector of float)
+0:279          cosine ( temp 4-component vector of float)
 0:279            'inF0' ( in 4-component vector of float)
 0:280      Sequence
-0:280        move second child to first child ( temp 4-component vector of uint)
-0:280          'r015' ( temp 4-component vector of uint)
+0:280        move second child to first child ( temp 4-component vector of float)
+0:280          'r014' ( temp 4-component vector of float)
+0:280          hyp. cosine ( temp 4-component vector of float)
+0:280            'inF0' ( in 4-component vector of float)
+0:281      Sequence
+0:281        move second child to first child ( temp 4-component vector of uint)
+0:281          'r015' ( temp 4-component vector of uint)
 0:?           bitCount ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
 0:?               2 (const uint)
-0:281      Sequence
-0:281        move second child to first child ( temp 4-component vector of float)
-0:281          'r016' ( temp 4-component vector of float)
-0:281          dPdx ( temp 4-component vector of float)
-0:281            'inF0' ( in 4-component vector of float)
 0:282      Sequence
 0:282        move second child to first child ( temp 4-component vector of float)
-0:282          'r017' ( temp 4-component vector of float)
-0:282          dPdxCoarse ( temp 4-component vector of float)
+0:282          'r016' ( temp 4-component vector of float)
+0:282          dPdx ( temp 4-component vector of float)
 0:282            'inF0' ( in 4-component vector of float)
 0:283      Sequence
 0:283        move second child to first child ( temp 4-component vector of float)
-0:283          'r018' ( temp 4-component vector of float)
-0:283          dPdxFine ( temp 4-component vector of float)
+0:283          'r017' ( temp 4-component vector of float)
+0:283          dPdxCoarse ( temp 4-component vector of float)
 0:283            'inF0' ( in 4-component vector of float)
 0:284      Sequence
 0:284        move second child to first child ( temp 4-component vector of float)
-0:284          'r019' ( temp 4-component vector of float)
-0:284          dPdy ( temp 4-component vector of float)
+0:284          'r018' ( temp 4-component vector of float)
+0:284          dPdxFine ( temp 4-component vector of float)
 0:284            'inF0' ( in 4-component vector of float)
 0:285      Sequence
 0:285        move second child to first child ( temp 4-component vector of float)
-0:285          'r020' ( temp 4-component vector of float)
-0:285          dPdyCoarse ( temp 4-component vector of float)
+0:285          'r019' ( temp 4-component vector of float)
+0:285          dPdy ( temp 4-component vector of float)
 0:285            'inF0' ( in 4-component vector of float)
 0:286      Sequence
 0:286        move second child to first child ( temp 4-component vector of float)
-0:286          'r021' ( temp 4-component vector of float)
-0:286          dPdyFine ( temp 4-component vector of float)
+0:286          'r020' ( temp 4-component vector of float)
+0:286          dPdyCoarse ( temp 4-component vector of float)
 0:286            'inF0' ( in 4-component vector of float)
 0:287      Sequence
 0:287        move second child to first child ( temp 4-component vector of float)
-0:287          'r022' ( temp 4-component vector of float)
-0:287          degrees ( temp 4-component vector of float)
+0:287          'r021' ( temp 4-component vector of float)
+0:287          dPdyFine ( temp 4-component vector of float)
 0:287            'inF0' ( in 4-component vector of float)
 0:288      Sequence
-0:288        move second child to first child ( temp float)
-0:288          'r023' ( temp float)
-0:288          distance ( temp float)
+0:288        move second child to first child ( temp 4-component vector of float)
+0:288          'r022' ( temp 4-component vector of float)
+0:288          degrees ( temp 4-component vector of float)
 0:288            'inF0' ( in 4-component vector of float)
-0:288            'inF1' ( in 4-component vector of float)
 0:289      Sequence
 0:289        move second child to first child ( temp float)
-0:289          'r024' ( temp float)
-0:289          dot-product ( temp float)
+0:289          'r023' ( temp float)
+0:289          distance ( temp float)
 0:289            'inF0' ( in 4-component vector of float)
 0:289            'inF1' ( in 4-component vector of float)
 0:290      Sequence
-0:290        move second child to first child ( temp 4-component vector of float)
-0:290          'r025' ( temp 4-component vector of float)
-0:290          Construct vec4 ( temp 4-component vector of float)
-0:290            Constant:
-0:290              1.000000
-0:290            component-wise multiply ( temp float)
-0:290              direct index ( temp float)
-0:290                'inF0' ( in 4-component vector of float)
-0:290                Constant:
-0:290                  1 (const int)
-0:290              direct index ( temp float)
-0:290                'inF1' ( in 4-component vector of float)
-0:290                Constant:
-0:290                  1 (const int)
-0:290            direct index ( temp float)
-0:290              'inF0' ( in 4-component vector of float)
-0:290              Constant:
-0:290                2 (const int)
-0:290            direct index ( temp float)
-0:290              'inF1' ( in 4-component vector of float)
-0:290              Constant:
-0:290                3 (const int)
-0:294      Sequence
-0:294        move second child to first child ( temp 4-component vector of float)
-0:294          'r029' ( temp 4-component vector of float)
-0:294          exp ( temp 4-component vector of float)
-0:294            'inF0' ( in 4-component vector of float)
+0:290        move second child to first child ( temp float)
+0:290          'r024' ( temp float)
+0:290          dot-product ( temp float)
+0:290            'inF0' ( in 4-component vector of float)
+0:290            'inF1' ( in 4-component vector of float)
+0:291      Sequence
+0:291        move second child to first child ( temp 4-component vector of float)
+0:291          'r025' ( temp 4-component vector of float)
+0:291          Construct vec4 ( temp 4-component vector of float)
+0:291            Constant:
+0:291              1.000000
+0:291            component-wise multiply ( temp float)
+0:291              direct index ( temp float)
+0:291                'inF0' ( in 4-component vector of float)
+0:291                Constant:
+0:291                  1 (const int)
+0:291              direct index ( temp float)
+0:291                'inF1' ( in 4-component vector of float)
+0:291                Constant:
+0:291                  1 (const int)
+0:291            direct index ( temp float)
+0:291              'inF0' ( in 4-component vector of float)
+0:291              Constant:
+0:291                2 (const int)
+0:291            direct index ( temp float)
+0:291              'inF1' ( in 4-component vector of float)
+0:291              Constant:
+0:291                3 (const int)
 0:295      Sequence
 0:295        move second child to first child ( temp 4-component vector of float)
-0:295          'r030' ( temp 4-component vector of float)
-0:295          exp2 ( temp 4-component vector of float)
+0:295          'r029' ( temp 4-component vector of float)
+0:295          exp ( temp 4-component vector of float)
 0:295            'inF0' ( in 4-component vector of float)
 0:296      Sequence
 0:296        move second child to first child ( temp 4-component vector of float)
-0:296          'r031' ( temp 4-component vector of float)
-0:296          face-forward ( temp 4-component vector of float)
+0:296          'r030' ( temp 4-component vector of float)
+0:296          exp2 ( temp 4-component vector of float)
 0:296            'inF0' ( in 4-component vector of float)
-0:296            'inF1' ( in 4-component vector of float)
-0:296            'inF2' ( in 4-component vector of float)
 0:297      Sequence
-0:297        move second child to first child ( temp 4-component vector of uint)
-0:297          'r032' ( temp 4-component vector of uint)
+0:297        move second child to first child ( temp 4-component vector of float)
+0:297          'r031' ( temp 4-component vector of float)
+0:297          face-forward ( temp 4-component vector of float)
+0:297            'inF0' ( in 4-component vector of float)
+0:297            'inF1' ( in 4-component vector of float)
+0:297            'inF2' ( in 4-component vector of float)
+0:298      Sequence
+0:298        move second child to first child ( temp 4-component vector of uint)
+0:298          'r032' ( temp 4-component vector of uint)
 0:?           findMSB ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
 0:?               9 (const uint)
 0:?               10 (const uint)
-0:298      Sequence
-0:298        move second child to first child ( temp 4-component vector of uint)
-0:298          'r033' ( temp 4-component vector of uint)
+0:299      Sequence
+0:299        move second child to first child ( temp 4-component vector of uint)
+0:299          'r033' ( temp 4-component vector of uint)
 0:?           findLSB ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
 0:?               9 (const uint)
 0:?               10 (const uint)
-0:299      Sequence
-0:299        move second child to first child ( temp 4-component vector of float)
-0:299          'r034' ( temp 4-component vector of float)
-0:299          Floor ( temp 4-component vector of float)
-0:299            'inF0' ( in 4-component vector of float)
-0:301      Sequence
-0:301        move second child to first child ( temp 4-component vector of float)
-0:301          'r036' ( temp 4-component vector of float)
-0:301          mod ( temp 4-component vector of float)
-0:301            'inF0' ( in 4-component vector of float)
-0:301            'inF1' ( in 4-component vector of float)
+0:300      Sequence
+0:300        move second child to first child ( temp 4-component vector of float)
+0:300          'r034' ( temp 4-component vector of float)
+0:300          Floor ( temp 4-component vector of float)
+0:300            'inF0' ( in 4-component vector of float)
 0:302      Sequence
 0:302        move second child to first child ( temp 4-component vector of float)
-0:302          'r037' ( temp 4-component vector of float)
-0:302          Fraction ( temp 4-component vector of float)
+0:302          'r036' ( temp 4-component vector of float)
+0:302          mod ( temp 4-component vector of float)
 0:302            'inF0' ( in 4-component vector of float)
+0:302            'inF1' ( in 4-component vector of float)
 0:303      Sequence
 0:303        move second child to first child ( temp 4-component vector of float)
-0:303          'r039' ( temp 4-component vector of float)
-0:303          fwidth ( temp 4-component vector of float)
+0:303          'r037' ( temp 4-component vector of float)
+0:303          Fraction ( temp 4-component vector of float)
 0:303            'inF0' ( in 4-component vector of float)
 0:304      Sequence
-0:304        move second child to first child ( temp 4-component vector of bool)
-0:304          'r040' ( temp 4-component vector of bool)
-0:304          isinf ( temp 4-component vector of bool)
+0:304        move second child to first child ( temp 4-component vector of float)
+0:304          'r039' ( temp 4-component vector of float)
+0:304          fwidth ( temp 4-component vector of float)
 0:304            'inF0' ( in 4-component vector of float)
 0:305      Sequence
 0:305        move second child to first child ( temp 4-component vector of bool)
-0:305          'r041' ( temp 4-component vector of bool)
-0:305          isnan ( temp 4-component vector of bool)
+0:305          'r040' ( temp 4-component vector of bool)
+0:305          isinf ( temp 4-component vector of bool)
 0:305            'inF0' ( in 4-component vector of float)
 0:306      Sequence
-0:306        move second child to first child ( temp 4-component vector of float)
-0:306          'r042' ( temp 4-component vector of float)
-0:306          ldexp ( temp 4-component vector of float)
+0:306        move second child to first child ( temp 4-component vector of bool)
+0:306          'r041' ( temp 4-component vector of bool)
+0:306          isnan ( temp 4-component vector of bool)
 0:306            'inF0' ( in 4-component vector of float)
-0:306            'inF1' ( in 4-component vector of float)
 0:307      Sequence
 0:307        move second child to first child ( temp 4-component vector of float)
-0:307          'r039a' ( temp 4-component vector of float)
-0:307          mix ( temp 4-component vector of float)
+0:307          'r042' ( temp 4-component vector of float)
+0:307          ldexp ( temp 4-component vector of float)
 0:307            'inF0' ( in 4-component vector of float)
 0:307            'inF1' ( in 4-component vector of float)
-0:307            'inF2' ( in 4-component vector of float)
 0:308      Sequence
-0:308        move second child to first child ( temp float)
-0:308          'r043' ( temp float)
-0:308          length ( temp float)
+0:308        move second child to first child ( temp 4-component vector of float)
+0:308          'r039a' ( temp 4-component vector of float)
+0:308          mix ( temp 4-component vector of float)
 0:308            'inF0' ( in 4-component vector of float)
+0:308            'inF1' ( in 4-component vector of float)
+0:308            'inF2' ( in 4-component vector of float)
 0:309      Sequence
-0:309        move second child to first child ( temp 4-component vector of float)
-0:309          'r044' ( temp 4-component vector of float)
-0:309          log ( temp 4-component vector of float)
+0:309        move second child to first child ( temp float)
+0:309          'r043' ( temp float)
+0:309          length ( temp float)
 0:309            'inF0' ( in 4-component vector of float)
 0:310      Sequence
 0:310        move second child to first child ( temp 4-component vector of float)
-0:310          'r045' ( temp 4-component vector of float)
-0:310          vector-scale ( temp 4-component vector of float)
-0:310            log2 ( temp 4-component vector of float)
-0:310              'inF0' ( in 4-component vector of float)
-0:310            Constant:
-0:310              0.301030
+0:310          'r044' ( temp 4-component vector of float)
+0:310          log ( temp 4-component vector of float)
+0:310            'inF0' ( in 4-component vector of float)
 0:311      Sequence
 0:311        move second child to first child ( temp 4-component vector of float)
-0:311          'r046' ( temp 4-component vector of float)
-0:311          log2 ( temp 4-component vector of float)
-0:311            'inF0' ( in 4-component vector of float)
+0:311          'r045' ( temp 4-component vector of float)
+0:311          vector-scale ( temp 4-component vector of float)
+0:311            log2 ( temp 4-component vector of float)
+0:311              'inF0' ( in 4-component vector of float)
+0:311            Constant:
+0:311              0.301030
 0:312      Sequence
 0:312        move second child to first child ( temp 4-component vector of float)
-0:312          'r047' ( temp 4-component vector of float)
-0:312          max ( temp 4-component vector of float)
+0:312          'r046' ( temp 4-component vector of float)
+0:312          log2 ( temp 4-component vector of float)
 0:312            'inF0' ( in 4-component vector of float)
-0:312            'inF1' ( in 4-component vector of float)
 0:313      Sequence
 0:313        move second child to first child ( temp 4-component vector of float)
-0:313          'r048' ( temp 4-component vector of float)
-0:313          min ( temp 4-component vector of float)
+0:313          'r047' ( temp 4-component vector of float)
+0:313          max ( temp 4-component vector of float)
 0:313            'inF0' ( in 4-component vector of float)
 0:313            'inF1' ( in 4-component vector of float)
 0:314      Sequence
 0:314        move second child to first child ( temp 4-component vector of float)
-0:314          'r049' ( temp 4-component vector of float)
-0:314          normalize ( temp 4-component vector of float)
+0:314          'r048' ( temp 4-component vector of float)
+0:314          min ( temp 4-component vector of float)
 0:314            'inF0' ( in 4-component vector of float)
+0:314            'inF1' ( in 4-component vector of float)
 0:315      Sequence
 0:315        move second child to first child ( temp 4-component vector of float)
-0:315          'r050' ( temp 4-component vector of float)
-0:315          pow ( temp 4-component vector of float)
+0:315          'r049' ( temp 4-component vector of float)
+0:315          normalize ( temp 4-component vector of float)
 0:315            'inF0' ( in 4-component vector of float)
-0:315            'inF1' ( in 4-component vector of float)
 0:316      Sequence
 0:316        move second child to first child ( temp 4-component vector of float)
-0:316          'r051' ( temp 4-component vector of float)
-0:316          radians ( temp 4-component vector of float)
+0:316          'r050' ( temp 4-component vector of float)
+0:316          pow ( temp 4-component vector of float)
 0:316            'inF0' ( in 4-component vector of float)
+0:316            'inF1' ( in 4-component vector of float)
 0:317      Sequence
 0:317        move second child to first child ( temp 4-component vector of float)
-0:317          'r052' ( temp 4-component vector of float)
-0:317          divide ( temp 4-component vector of float)
-0:317            Constant:
-0:317              1.000000
+0:317          'r051' ( temp 4-component vector of float)
+0:317          radians ( temp 4-component vector of float)
 0:317            'inF0' ( in 4-component vector of float)
 0:318      Sequence
 0:318        move second child to first child ( temp 4-component vector of float)
-0:318          'r053' ( temp 4-component vector of float)
-0:318          reflect ( temp 4-component vector of float)
+0:318          'r052' ( temp 4-component vector of float)
+0:318          divide ( temp 4-component vector of float)
+0:318            Constant:
+0:318              1.000000
 0:318            'inF0' ( in 4-component vector of float)
-0:318            'inF1' ( in 4-component vector of float)
 0:319      Sequence
 0:319        move second child to first child ( temp 4-component vector of float)
-0:319          'r054' ( temp 4-component vector of float)
-0:319          refract ( temp 4-component vector of float)
+0:319          'r053' ( temp 4-component vector of float)
+0:319          reflect ( temp 4-component vector of float)
 0:319            'inF0' ( in 4-component vector of float)
 0:319            'inF1' ( in 4-component vector of float)
-0:319            Constant:
-0:319              2.000000
 0:320      Sequence
-0:320        move second child to first child ( temp 4-component vector of uint)
-0:320          'r055' ( temp 4-component vector of uint)
+0:320        move second child to first child ( temp 4-component vector of float)
+0:320          'r054' ( temp 4-component vector of float)
+0:320          refract ( temp 4-component vector of float)
+0:320            'inF0' ( in 4-component vector of float)
+0:320            'inF1' ( in 4-component vector of float)
+0:320            Constant:
+0:320              2.000000
+0:321      Sequence
+0:321        move second child to first child ( temp 4-component vector of uint)
+0:321          'r055' ( temp 4-component vector of uint)
 0:?           bitFieldReverse ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:321      Sequence
-0:321        move second child to first child ( temp 4-component vector of float)
-0:321          'r056' ( temp 4-component vector of float)
-0:321          roundEven ( temp 4-component vector of float)
-0:321            'inF0' ( in 4-component vector of float)
 0:322      Sequence
 0:322        move second child to first child ( temp 4-component vector of float)
-0:322          'r057' ( temp 4-component vector of float)
-0:322          inverse sqrt ( temp 4-component vector of float)
+0:322          'r056' ( temp 4-component vector of float)
+0:322          roundEven ( temp 4-component vector of float)
 0:322            'inF0' ( in 4-component vector of float)
 0:323      Sequence
 0:323        move second child to first child ( temp 4-component vector of float)
-0:323          'r058' ( temp 4-component vector of float)
-0:323          clamp ( temp 4-component vector of float)
+0:323          'r057' ( temp 4-component vector of float)
+0:323          inverse sqrt ( temp 4-component vector of float)
 0:323            'inF0' ( in 4-component vector of float)
-0:323            Constant:
-0:323              0.000000
-0:323            Constant:
-0:323              1.000000
 0:324      Sequence
 0:324        move second child to first child ( temp 4-component vector of float)
-0:324          'r059' ( temp 4-component vector of float)
-0:324          Sign ( temp 4-component vector of float)
+0:324          'r058' ( temp 4-component vector of float)
+0:324          clamp ( temp 4-component vector of float)
 0:324            'inF0' ( in 4-component vector of float)
+0:324            Constant:
+0:324              0.000000
+0:324            Constant:
+0:324              1.000000
 0:325      Sequence
 0:325        move second child to first child ( temp 4-component vector of float)
-0:325          'r060' ( temp 4-component vector of float)
-0:325          sine ( temp 4-component vector of float)
+0:325          'r059' ( temp 4-component vector of float)
+0:325          Sign ( temp 4-component vector of float)
 0:325            'inF0' ( in 4-component vector of float)
 0:326      Sequence
 0:326        move second child to first child ( temp 4-component vector of float)
-0:326          'inF1' ( in 4-component vector of float)
+0:326          'r060' ( temp 4-component vector of float)
 0:326          sine ( temp 4-component vector of float)
 0:326            'inF0' ( in 4-component vector of float)
-0:326        move second child to first child ( temp 4-component vector of float)
-0:326          'inF2' ( in 4-component vector of float)
-0:326          cosine ( temp 4-component vector of float)
-0:326            'inF0' ( in 4-component vector of float)
 0:327      Sequence
 0:327        move second child to first child ( temp 4-component vector of float)
-0:327          'r061' ( temp 4-component vector of float)
-0:327          hyp. sine ( temp 4-component vector of float)
+0:327          'inF1' ( in 4-component vector of float)
+0:327          sine ( temp 4-component vector of float)
+0:327            'inF0' ( in 4-component vector of float)
+0:327        move second child to first child ( temp 4-component vector of float)
+0:327          'inF2' ( in 4-component vector of float)
+0:327          cosine ( temp 4-component vector of float)
 0:327            'inF0' ( in 4-component vector of float)
 0:328      Sequence
 0:328        move second child to first child ( temp 4-component vector of float)
-0:328          'r062' ( temp 4-component vector of float)
-0:328          smoothstep ( temp 4-component vector of float)
+0:328          'r061' ( temp 4-component vector of float)
+0:328          hyp. sine ( temp 4-component vector of float)
 0:328            'inF0' ( in 4-component vector of float)
-0:328            'inF1' ( in 4-component vector of float)
-0:328            'inF2' ( in 4-component vector of float)
 0:329      Sequence
 0:329        move second child to first child ( temp 4-component vector of float)
-0:329          'r063' ( temp 4-component vector of float)
-0:329          sqrt ( temp 4-component vector of float)
+0:329          'r062' ( temp 4-component vector of float)
+0:329          smoothstep ( temp 4-component vector of float)
 0:329            'inF0' ( in 4-component vector of float)
+0:329            'inF1' ( in 4-component vector of float)
+0:329            'inF2' ( in 4-component vector of float)
 0:330      Sequence
 0:330        move second child to first child ( temp 4-component vector of float)
-0:330          'r064' ( temp 4-component vector of float)
-0:330          step ( temp 4-component vector of float)
+0:330          'r063' ( temp 4-component vector of float)
+0:330          sqrt ( temp 4-component vector of float)
 0:330            'inF0' ( in 4-component vector of float)
-0:330            'inF1' ( in 4-component vector of float)
 0:331      Sequence
 0:331        move second child to first child ( temp 4-component vector of float)
-0:331          'r065' ( temp 4-component vector of float)
-0:331          tangent ( temp 4-component vector of float)
+0:331          'r064' ( temp 4-component vector of float)
+0:331          step ( temp 4-component vector of float)
 0:331            'inF0' ( in 4-component vector of float)
+0:331            'inF1' ( in 4-component vector of float)
 0:332      Sequence
 0:332        move second child to first child ( temp 4-component vector of float)
-0:332          'r066' ( temp 4-component vector of float)
-0:332          hyp. tangent ( temp 4-component vector of float)
+0:332          'r065' ( temp 4-component vector of float)
+0:332          tangent ( temp 4-component vector of float)
 0:332            'inF0' ( in 4-component vector of float)
-0:334      Sequence
-0:334        move second child to first child ( temp 4-component vector of float)
-0:334          'r067' ( temp 4-component vector of float)
-0:334          trunc ( temp 4-component vector of float)
-0:334            'inF0' ( in 4-component vector of float)
-0:337      Branch: Return with expression
+0:333      Sequence
+0:333        move second child to first child ( temp 4-component vector of float)
+0:333          'r066' ( temp 4-component vector of float)
+0:333          hyp. tangent ( temp 4-component vector of float)
+0:333            'inF0' ( in 4-component vector of float)
+0:335      Sequence
+0:335        move second child to first child ( temp 4-component vector of float)
+0:335          'r067' ( temp 4-component vector of float)
+0:335          trunc ( temp 4-component vector of float)
+0:335            'inF0' ( in 4-component vector of float)
+0:338      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:400  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; ( temp 2X2 matrix of float)
-0:400    Function Parameters: 
-0:400      'inF0' ( in 2X2 matrix of float)
-0:400      'inF1' ( in 2X2 matrix of float)
-0:400      'inF2' ( in 2X2 matrix of float)
+0:401  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; ( temp 2X2 matrix of float)
+0:401    Function Parameters: 
+0:401      'inF0' ( in 2X2 matrix of float)
+0:401      'inF1' ( in 2X2 matrix of float)
+0:401      'inF2' ( in 2X2 matrix of float)
 0:?     Sequence
-0:402      Sequence
-0:402        move second child to first child ( temp bool)
-0:402          'r000' ( temp bool)
-0:402          all ( temp bool)
-0:402            Convert float to bool ( temp 2X2 matrix of bool)
-0:402              'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r001' ( temp 2X2 matrix of float)
-0:402          Absolute value ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      arc cosine ( temp 2X2 matrix of float)
-0:402        'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp bool)
-0:402          'r003' ( temp bool)
-0:402          any ( temp bool)
-0:402            Convert float to bool ( temp 2X2 matrix of bool)
-0:402              'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r004' ( temp 2X2 matrix of float)
-0:402          arc sine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r005' ( temp 2X2 matrix of float)
-0:402          arc tangent ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r006' ( temp 2X2 matrix of float)
-0:402          arc tangent ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r007' ( temp 2X2 matrix of float)
-0:402          Ceiling ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Test condition and select ( temp void)
-0:402        Condition
-0:402        any ( temp bool)
-0:402          Compare Less Than ( temp 2X2 matrix of bool)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            Constant:
-0:402              0.000000
-0:402              0.000000
-0:402              0.000000
-0:402              0.000000
-0:402        true case
-0:402        Branch: Kill
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r008' ( temp 2X2 matrix of float)
-0:402          clamp ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402            'inF2' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r009' ( temp 2X2 matrix of float)
-0:402          cosine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r010' ( temp 2X2 matrix of float)
-0:402          hyp. cosine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r011' ( temp 2X2 matrix of float)
-0:402          dPdx ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r012' ( temp 2X2 matrix of float)
-0:402          dPdxCoarse ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r013' ( temp 2X2 matrix of float)
-0:402          dPdxFine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r014' ( temp 2X2 matrix of float)
-0:402          dPdy ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r015' ( temp 2X2 matrix of float)
-0:402          dPdyCoarse ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r016' ( temp 2X2 matrix of float)
-0:402          dPdyFine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r017' ( temp 2X2 matrix of float)
-0:402          degrees ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp float)
-0:402          'r018' ( temp float)
-0:402          determinant ( temp float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r019' ( temp 2X2 matrix of float)
-0:402          exp ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'R020' ( temp 2X2 matrix of float)
-0:402          exp2 ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r021' ( temp 2X2 matrix of float)
-0:402          Floor ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r022' ( temp 2X2 matrix of float)
-0:402          mod ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r023' ( temp 2X2 matrix of float)
-0:402          Fraction ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r025' ( temp 2X2 matrix of float)
-0:402          fwidth ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r026' ( temp 2X2 matrix of float)
-0:402          ldexp ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r026a' ( temp 2X2 matrix of float)
-0:402          mix ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402            'inF2' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r027' ( temp 2X2 matrix of float)
-0:402          log ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r028' ( temp 2X2 matrix of float)
-0:402          matrix-scale ( temp 2X2 matrix of float)
-0:402            log2 ( temp 2X2 matrix of float)
-0:402              'inF0' ( in 2X2 matrix of float)
-0:402            Constant:
-0:402              0.301030
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r029' ( temp 2X2 matrix of float)
-0:402          log2 ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r030' ( temp 2X2 matrix of float)
-0:402          max ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r031' ( temp 2X2 matrix of float)
-0:402          min ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r032' ( temp 2X2 matrix of float)
-0:402          pow ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r033' ( temp 2X2 matrix of float)
-0:402          radians ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r034' ( temp 2X2 matrix of float)
-0:402          roundEven ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r035' ( temp 2X2 matrix of float)
-0:402          inverse sqrt ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r036' ( temp 2X2 matrix of float)
-0:402          clamp ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            Constant:
-0:402              0.000000
-0:402            Constant:
-0:402              1.000000
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r037' ( temp 2X2 matrix of float)
-0:402          Sign ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r038' ( temp 2X2 matrix of float)
-0:402          sine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'inF1' ( in 2X2 matrix of float)
-0:402          sine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'inF2' ( in 2X2 matrix of float)
-0:402          cosine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r039' ( temp 2X2 matrix of float)
-0:402          hyp. sine ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r049' ( temp 2X2 matrix of float)
-0:402          smoothstep ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402            'inF2' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r041' ( temp 2X2 matrix of float)
-0:402          sqrt ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r042' ( temp 2X2 matrix of float)
-0:402          step ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402            'inF1' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r043' ( temp 2X2 matrix of float)
-0:402          tangent ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r044' ( temp 2X2 matrix of float)
-0:402          hyp. tangent ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:402      transpose ( temp 2X2 matrix of float)
-0:402        'inF0' ( in 2X2 matrix of float)
-0:402      Sequence
-0:402        move second child to first child ( temp 2X2 matrix of float)
-0:402          'r046' ( temp 2X2 matrix of float)
-0:402          trunc ( temp 2X2 matrix of float)
-0:402            'inF0' ( in 2X2 matrix of float)
-0:405      Branch: Return with expression
+0:403      Sequence
+0:403        move second child to first child ( temp bool)
+0:403          'r000' ( temp bool)
+0:403          all ( temp bool)
+0:403            Convert float to bool ( temp 2X2 matrix of bool)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r001' ( temp 2X2 matrix of float)
+0:403          Absolute value ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      arc cosine ( temp 2X2 matrix of float)
+0:403        'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp bool)
+0:403          'r003' ( temp bool)
+0:403          any ( temp bool)
+0:403            Convert float to bool ( temp 2X2 matrix of bool)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r004' ( temp 2X2 matrix of float)
+0:403          arc sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r005' ( temp 2X2 matrix of float)
+0:403          arc tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r006' ( temp 2X2 matrix of float)
+0:403          arc tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r007' ( temp 2X2 matrix of float)
+0:403          Ceiling ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Test condition and select ( temp void)
+0:403        Condition
+0:403        any ( temp bool)
+0:403          Compare Less Than ( temp 2X2 matrix of bool)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.000000
+0:403              0.000000
+0:403              0.000000
+0:403              0.000000
+0:403        true case
+0:403        Branch: Kill
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r008' ( temp 2X2 matrix of float)
+0:403          clamp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r009' ( temp 2X2 matrix of float)
+0:403          cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r010' ( temp 2X2 matrix of float)
+0:403          hyp. cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r011' ( temp 2X2 matrix of float)
+0:403          dPdx ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r012' ( temp 2X2 matrix of float)
+0:403          dPdxCoarse ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r013' ( temp 2X2 matrix of float)
+0:403          dPdxFine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r014' ( temp 2X2 matrix of float)
+0:403          dPdy ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r015' ( temp 2X2 matrix of float)
+0:403          dPdyCoarse ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r016' ( temp 2X2 matrix of float)
+0:403          dPdyFine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r017' ( temp 2X2 matrix of float)
+0:403          degrees ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp float)
+0:403          'r018' ( temp float)
+0:403          determinant ( temp float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r019' ( temp 2X2 matrix of float)
+0:403          exp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'R020' ( temp 2X2 matrix of float)
+0:403          exp2 ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r021' ( temp 2X2 matrix of float)
+0:403          Floor ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r022' ( temp 2X2 matrix of float)
+0:403          mod ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r023' ( temp 2X2 matrix of float)
+0:403          Fraction ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r025' ( temp 2X2 matrix of float)
+0:403          fwidth ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r026' ( temp 2X2 matrix of float)
+0:403          ldexp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r026a' ( temp 2X2 matrix of float)
+0:403          mix ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r027' ( temp 2X2 matrix of float)
+0:403          log ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r028' ( temp 2X2 matrix of float)
+0:403          matrix-scale ( temp 2X2 matrix of float)
+0:403            log2 ( temp 2X2 matrix of float)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.301030
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r029' ( temp 2X2 matrix of float)
+0:403          log2 ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r030' ( temp 2X2 matrix of float)
+0:403          max ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r031' ( temp 2X2 matrix of float)
+0:403          min ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r032' ( temp 2X2 matrix of float)
+0:403          pow ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r033' ( temp 2X2 matrix of float)
+0:403          radians ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r034' ( temp 2X2 matrix of float)
+0:403          roundEven ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r035' ( temp 2X2 matrix of float)
+0:403          inverse sqrt ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r036' ( temp 2X2 matrix of float)
+0:403          clamp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.000000
+0:403            Constant:
+0:403              1.000000
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r037' ( temp 2X2 matrix of float)
+0:403          Sign ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r038' ( temp 2X2 matrix of float)
+0:403          sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'inF1' ( in 2X2 matrix of float)
+0:403          sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'inF2' ( in 2X2 matrix of float)
+0:403          cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r039' ( temp 2X2 matrix of float)
+0:403          hyp. sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r049' ( temp 2X2 matrix of float)
+0:403          smoothstep ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r041' ( temp 2X2 matrix of float)
+0:403          sqrt ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r042' ( temp 2X2 matrix of float)
+0:403          step ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r043' ( temp 2X2 matrix of float)
+0:403          tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r044' ( temp 2X2 matrix of float)
+0:403          hyp. tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      transpose ( temp 2X2 matrix of float)
+0:403        'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r046' ( temp 2X2 matrix of float)
+0:403          trunc ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:406      Branch: Return with expression
 0:?         Constant:
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:409  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; ( temp 3X3 matrix of float)
-0:409    Function Parameters: 
-0:409      'inF0' ( in 3X3 matrix of float)
-0:409      'inF1' ( in 3X3 matrix of float)
-0:409      'inF2' ( in 3X3 matrix of float)
+0:410  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; ( temp 3X3 matrix of float)
+0:410    Function Parameters: 
+0:410      'inF0' ( in 3X3 matrix of float)
+0:410      'inF1' ( in 3X3 matrix of float)
+0:410      'inF2' ( in 3X3 matrix of float)
 0:?     Sequence
-0:411      Sequence
-0:411        move second child to first child ( temp bool)
-0:411          'r000' ( temp bool)
-0:411          all ( temp bool)
-0:411            Convert float to bool ( temp 3X3 matrix of bool)
-0:411              'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r001' ( temp 3X3 matrix of float)
-0:411          Absolute value ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      arc cosine ( temp 3X3 matrix of float)
-0:411        'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp bool)
-0:411          'r003' ( temp bool)
-0:411          any ( temp bool)
-0:411            Convert float to bool ( temp 3X3 matrix of bool)
-0:411              'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r004' ( temp 3X3 matrix of float)
-0:411          arc sine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r005' ( temp 3X3 matrix of float)
-0:411          arc tangent ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r006' ( temp 3X3 matrix of float)
-0:411          arc tangent ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r007' ( temp 3X3 matrix of float)
-0:411          Ceiling ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Test condition and select ( temp void)
-0:411        Condition
-0:411        any ( temp bool)
-0:411          Compare Less Than ( temp 3X3 matrix of bool)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            Constant:
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411              0.000000
-0:411        true case
-0:411        Branch: Kill
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r008' ( temp 3X3 matrix of float)
-0:411          clamp ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411            'inF2' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r009' ( temp 3X3 matrix of float)
-0:411          cosine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r010' ( temp 3X3 matrix of float)
-0:411          hyp. cosine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r011' ( temp 3X3 matrix of float)
-0:411          dPdx ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r012' ( temp 3X3 matrix of float)
-0:411          dPdxCoarse ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r013' ( temp 3X3 matrix of float)
-0:411          dPdxFine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r014' ( temp 3X3 matrix of float)
-0:411          dPdy ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r015' ( temp 3X3 matrix of float)
-0:411          dPdyCoarse ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r016' ( temp 3X3 matrix of float)
-0:411          dPdyFine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r017' ( temp 3X3 matrix of float)
-0:411          degrees ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp float)
-0:411          'r018' ( temp float)
-0:411          determinant ( temp float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r019' ( temp 3X3 matrix of float)
-0:411          exp ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'R020' ( temp 3X3 matrix of float)
-0:411          exp2 ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r021' ( temp 3X3 matrix of float)
-0:411          Floor ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r022' ( temp 3X3 matrix of float)
-0:411          mod ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r023' ( temp 3X3 matrix of float)
-0:411          Fraction ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r025' ( temp 3X3 matrix of float)
-0:411          fwidth ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r026' ( temp 3X3 matrix of float)
-0:411          ldexp ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r026a' ( temp 3X3 matrix of float)
-0:411          mix ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411            'inF2' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r027' ( temp 3X3 matrix of float)
-0:411          log ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r028' ( temp 3X3 matrix of float)
-0:411          matrix-scale ( temp 3X3 matrix of float)
-0:411            log2 ( temp 3X3 matrix of float)
-0:411              'inF0' ( in 3X3 matrix of float)
-0:411            Constant:
-0:411              0.301030
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r029' ( temp 3X3 matrix of float)
-0:411          log2 ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r030' ( temp 3X3 matrix of float)
-0:411          max ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r031' ( temp 3X3 matrix of float)
-0:411          min ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r032' ( temp 3X3 matrix of float)
-0:411          pow ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r033' ( temp 3X3 matrix of float)
-0:411          radians ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r034' ( temp 3X3 matrix of float)
-0:411          roundEven ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r035' ( temp 3X3 matrix of float)
-0:411          inverse sqrt ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r036' ( temp 3X3 matrix of float)
-0:411          clamp ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            Constant:
-0:411              0.000000
-0:411            Constant:
-0:411              1.000000
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r037' ( temp 3X3 matrix of float)
-0:411          Sign ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r038' ( temp 3X3 matrix of float)
-0:411          sine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'inF1' ( in 3X3 matrix of float)
-0:411          sine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'inF2' ( in 3X3 matrix of float)
-0:411          cosine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r039' ( temp 3X3 matrix of float)
-0:411          hyp. sine ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r049' ( temp 3X3 matrix of float)
-0:411          smoothstep ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411            'inF2' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r041' ( temp 3X3 matrix of float)
-0:411          sqrt ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r042' ( temp 3X3 matrix of float)
-0:411          step ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411            'inF1' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r043' ( temp 3X3 matrix of float)
-0:411          tangent ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r044' ( temp 3X3 matrix of float)
-0:411          hyp. tangent ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:411      transpose ( temp 3X3 matrix of float)
-0:411        'inF0' ( in 3X3 matrix of float)
-0:411      Sequence
-0:411        move second child to first child ( temp 3X3 matrix of float)
-0:411          'r046' ( temp 3X3 matrix of float)
-0:411          trunc ( temp 3X3 matrix of float)
-0:411            'inF0' ( in 3X3 matrix of float)
-0:414      Branch: Return with expression
+0:412      Sequence
+0:412        move second child to first child ( temp bool)
+0:412          'r000' ( temp bool)
+0:412          all ( temp bool)
+0:412            Convert float to bool ( temp 3X3 matrix of bool)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r001' ( temp 3X3 matrix of float)
+0:412          Absolute value ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      arc cosine ( temp 3X3 matrix of float)
+0:412        'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp bool)
+0:412          'r003' ( temp bool)
+0:412          any ( temp bool)
+0:412            Convert float to bool ( temp 3X3 matrix of bool)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r004' ( temp 3X3 matrix of float)
+0:412          arc sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r005' ( temp 3X3 matrix of float)
+0:412          arc tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r006' ( temp 3X3 matrix of float)
+0:412          arc tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r007' ( temp 3X3 matrix of float)
+0:412          Ceiling ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Test condition and select ( temp void)
+0:412        Condition
+0:412        any ( temp bool)
+0:412          Compare Less Than ( temp 3X3 matrix of bool)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412        true case
+0:412        Branch: Kill
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r008' ( temp 3X3 matrix of float)
+0:412          clamp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r009' ( temp 3X3 matrix of float)
+0:412          cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r010' ( temp 3X3 matrix of float)
+0:412          hyp. cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r011' ( temp 3X3 matrix of float)
+0:412          dPdx ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r012' ( temp 3X3 matrix of float)
+0:412          dPdxCoarse ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r013' ( temp 3X3 matrix of float)
+0:412          dPdxFine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r014' ( temp 3X3 matrix of float)
+0:412          dPdy ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r015' ( temp 3X3 matrix of float)
+0:412          dPdyCoarse ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r016' ( temp 3X3 matrix of float)
+0:412          dPdyFine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r017' ( temp 3X3 matrix of float)
+0:412          degrees ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp float)
+0:412          'r018' ( temp float)
+0:412          determinant ( temp float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r019' ( temp 3X3 matrix of float)
+0:412          exp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'R020' ( temp 3X3 matrix of float)
+0:412          exp2 ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r021' ( temp 3X3 matrix of float)
+0:412          Floor ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r022' ( temp 3X3 matrix of float)
+0:412          mod ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r023' ( temp 3X3 matrix of float)
+0:412          Fraction ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r025' ( temp 3X3 matrix of float)
+0:412          fwidth ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r026' ( temp 3X3 matrix of float)
+0:412          ldexp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r026a' ( temp 3X3 matrix of float)
+0:412          mix ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r027' ( temp 3X3 matrix of float)
+0:412          log ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r028' ( temp 3X3 matrix of float)
+0:412          matrix-scale ( temp 3X3 matrix of float)
+0:412            log2 ( temp 3X3 matrix of float)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.301030
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r029' ( temp 3X3 matrix of float)
+0:412          log2 ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r030' ( temp 3X3 matrix of float)
+0:412          max ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r031' ( temp 3X3 matrix of float)
+0:412          min ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r032' ( temp 3X3 matrix of float)
+0:412          pow ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r033' ( temp 3X3 matrix of float)
+0:412          radians ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r034' ( temp 3X3 matrix of float)
+0:412          roundEven ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r035' ( temp 3X3 matrix of float)
+0:412          inverse sqrt ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r036' ( temp 3X3 matrix of float)
+0:412          clamp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.000000
+0:412            Constant:
+0:412              1.000000
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r037' ( temp 3X3 matrix of float)
+0:412          Sign ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r038' ( temp 3X3 matrix of float)
+0:412          sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'inF1' ( in 3X3 matrix of float)
+0:412          sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'inF2' ( in 3X3 matrix of float)
+0:412          cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r039' ( temp 3X3 matrix of float)
+0:412          hyp. sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r049' ( temp 3X3 matrix of float)
+0:412          smoothstep ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r041' ( temp 3X3 matrix of float)
+0:412          sqrt ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r042' ( temp 3X3 matrix of float)
+0:412          step ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r043' ( temp 3X3 matrix of float)
+0:412          tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r044' ( temp 3X3 matrix of float)
+0:412          hyp. tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      transpose ( temp 3X3 matrix of float)
+0:412        'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r046' ( temp 3X3 matrix of float)
+0:412          trunc ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:415      Branch: Return with expression
 0:?         Constant:
 0:?           3.000000
 0:?           3.000000
@@ -2162,297 +2168,297 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:418  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; ( temp 4X4 matrix of float)
-0:418    Function Parameters: 
-0:418      'inF0' ( in 4X4 matrix of float)
-0:418      'inF1' ( in 4X4 matrix of float)
-0:418      'inF2' ( in 4X4 matrix of float)
+0:419  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; ( temp 4X4 matrix of float)
+0:419    Function Parameters: 
+0:419      'inF0' ( in 4X4 matrix of float)
+0:419      'inF1' ( in 4X4 matrix of float)
+0:419      'inF2' ( in 4X4 matrix of float)
 0:?     Sequence
-0:420      Sequence
-0:420        move second child to first child ( temp bool)
-0:420          'r000' ( temp bool)
-0:420          all ( temp bool)
-0:420            Convert float to bool ( temp 4X4 matrix of bool)
-0:420              'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r001' ( temp 4X4 matrix of float)
-0:420          Absolute value ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      arc cosine ( temp 4X4 matrix of float)
-0:420        'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp bool)
-0:420          'r003' ( temp bool)
-0:420          any ( temp bool)
-0:420            Convert float to bool ( temp 4X4 matrix of bool)
-0:420              'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r004' ( temp 4X4 matrix of float)
-0:420          arc sine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r005' ( temp 4X4 matrix of float)
-0:420          arc tangent ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r006' ( temp 4X4 matrix of float)
-0:420          arc tangent ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r007' ( temp 4X4 matrix of float)
-0:420          Ceiling ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Test condition and select ( temp void)
-0:420        Condition
-0:420        any ( temp bool)
-0:420          Compare Less Than ( temp 4X4 matrix of bool)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            Constant:
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420              0.000000
-0:420        true case
-0:420        Branch: Kill
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r008' ( temp 4X4 matrix of float)
-0:420          clamp ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420            'inF2' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r009' ( temp 4X4 matrix of float)
-0:420          cosine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r010' ( temp 4X4 matrix of float)
-0:420          hyp. cosine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r011' ( temp 4X4 matrix of float)
-0:420          dPdx ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r012' ( temp 4X4 matrix of float)
-0:420          dPdxCoarse ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r013' ( temp 4X4 matrix of float)
-0:420          dPdxFine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r014' ( temp 4X4 matrix of float)
-0:420          dPdy ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r015' ( temp 4X4 matrix of float)
-0:420          dPdyCoarse ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r016' ( temp 4X4 matrix of float)
-0:420          dPdyFine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r017' ( temp 4X4 matrix of float)
-0:420          degrees ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp float)
-0:420          'r018' ( temp float)
-0:420          determinant ( temp float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r019' ( temp 4X4 matrix of float)
-0:420          exp ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'R020' ( temp 4X4 matrix of float)
-0:420          exp2 ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r021' ( temp 4X4 matrix of float)
-0:420          Floor ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r022' ( temp 4X4 matrix of float)
-0:420          mod ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r023' ( temp 4X4 matrix of float)
-0:420          Fraction ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r025' ( temp 4X4 matrix of float)
-0:420          fwidth ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r026' ( temp 4X4 matrix of float)
-0:420          ldexp ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r026a' ( temp 4X4 matrix of float)
-0:420          mix ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420            'inF2' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r027' ( temp 4X4 matrix of float)
-0:420          log ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r028' ( temp 4X4 matrix of float)
-0:420          matrix-scale ( temp 4X4 matrix of float)
-0:420            log2 ( temp 4X4 matrix of float)
-0:420              'inF0' ( in 4X4 matrix of float)
-0:420            Constant:
-0:420              0.301030
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r029' ( temp 4X4 matrix of float)
-0:420          log2 ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r030' ( temp 4X4 matrix of float)
-0:420          max ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r031' ( temp 4X4 matrix of float)
-0:420          min ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r032' ( temp 4X4 matrix of float)
-0:420          pow ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r033' ( temp 4X4 matrix of float)
-0:420          radians ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r034' ( temp 4X4 matrix of float)
-0:420          roundEven ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r035' ( temp 4X4 matrix of float)
-0:420          inverse sqrt ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r036' ( temp 4X4 matrix of float)
-0:420          clamp ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            Constant:
-0:420              0.000000
-0:420            Constant:
-0:420              1.000000
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r037' ( temp 4X4 matrix of float)
-0:420          Sign ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r038' ( temp 4X4 matrix of float)
-0:420          sine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'inF1' ( in 4X4 matrix of float)
-0:420          sine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'inF2' ( in 4X4 matrix of float)
-0:420          cosine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r039' ( temp 4X4 matrix of float)
-0:420          hyp. sine ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r049' ( temp 4X4 matrix of float)
-0:420          smoothstep ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420            'inF2' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r041' ( temp 4X4 matrix of float)
-0:420          sqrt ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r042' ( temp 4X4 matrix of float)
-0:420          step ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420            'inF1' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r043' ( temp 4X4 matrix of float)
-0:420          tangent ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r044' ( temp 4X4 matrix of float)
-0:420          hyp. tangent ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:420      transpose ( temp 4X4 matrix of float)
-0:420        'inF0' ( in 4X4 matrix of float)
-0:420      Sequence
-0:420        move second child to first child ( temp 4X4 matrix of float)
-0:420          'r046' ( temp 4X4 matrix of float)
-0:420          trunc ( temp 4X4 matrix of float)
-0:420            'inF0' ( in 4X4 matrix of float)
-0:423      Branch: Return with expression
+0:421      Sequence
+0:421        move second child to first child ( temp bool)
+0:421          'r000' ( temp bool)
+0:421          all ( temp bool)
+0:421            Convert float to bool ( temp 4X4 matrix of bool)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r001' ( temp 4X4 matrix of float)
+0:421          Absolute value ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      arc cosine ( temp 4X4 matrix of float)
+0:421        'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp bool)
+0:421          'r003' ( temp bool)
+0:421          any ( temp bool)
+0:421            Convert float to bool ( temp 4X4 matrix of bool)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r004' ( temp 4X4 matrix of float)
+0:421          arc sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r005' ( temp 4X4 matrix of float)
+0:421          arc tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r006' ( temp 4X4 matrix of float)
+0:421          arc tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r007' ( temp 4X4 matrix of float)
+0:421          Ceiling ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Test condition and select ( temp void)
+0:421        Condition
+0:421        any ( temp bool)
+0:421          Compare Less Than ( temp 4X4 matrix of bool)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421        true case
+0:421        Branch: Kill
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r008' ( temp 4X4 matrix of float)
+0:421          clamp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r009' ( temp 4X4 matrix of float)
+0:421          cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r010' ( temp 4X4 matrix of float)
+0:421          hyp. cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r011' ( temp 4X4 matrix of float)
+0:421          dPdx ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r012' ( temp 4X4 matrix of float)
+0:421          dPdxCoarse ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r013' ( temp 4X4 matrix of float)
+0:421          dPdxFine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r014' ( temp 4X4 matrix of float)
+0:421          dPdy ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r015' ( temp 4X4 matrix of float)
+0:421          dPdyCoarse ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r016' ( temp 4X4 matrix of float)
+0:421          dPdyFine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r017' ( temp 4X4 matrix of float)
+0:421          degrees ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp float)
+0:421          'r018' ( temp float)
+0:421          determinant ( temp float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r019' ( temp 4X4 matrix of float)
+0:421          exp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'R020' ( temp 4X4 matrix of float)
+0:421          exp2 ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r021' ( temp 4X4 matrix of float)
+0:421          Floor ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r022' ( temp 4X4 matrix of float)
+0:421          mod ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r023' ( temp 4X4 matrix of float)
+0:421          Fraction ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r025' ( temp 4X4 matrix of float)
+0:421          fwidth ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r026' ( temp 4X4 matrix of float)
+0:421          ldexp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r026a' ( temp 4X4 matrix of float)
+0:421          mix ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r027' ( temp 4X4 matrix of float)
+0:421          log ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r028' ( temp 4X4 matrix of float)
+0:421          matrix-scale ( temp 4X4 matrix of float)
+0:421            log2 ( temp 4X4 matrix of float)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.301030
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r029' ( temp 4X4 matrix of float)
+0:421          log2 ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r030' ( temp 4X4 matrix of float)
+0:421          max ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r031' ( temp 4X4 matrix of float)
+0:421          min ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r032' ( temp 4X4 matrix of float)
+0:421          pow ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r033' ( temp 4X4 matrix of float)
+0:421          radians ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r034' ( temp 4X4 matrix of float)
+0:421          roundEven ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r035' ( temp 4X4 matrix of float)
+0:421          inverse sqrt ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r036' ( temp 4X4 matrix of float)
+0:421          clamp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.000000
+0:421            Constant:
+0:421              1.000000
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r037' ( temp 4X4 matrix of float)
+0:421          Sign ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r038' ( temp 4X4 matrix of float)
+0:421          sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'inF1' ( in 4X4 matrix of float)
+0:421          sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'inF2' ( in 4X4 matrix of float)
+0:421          cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r039' ( temp 4X4 matrix of float)
+0:421          hyp. sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r049' ( temp 4X4 matrix of float)
+0:421          smoothstep ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r041' ( temp 4X4 matrix of float)
+0:421          sqrt ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r042' ( temp 4X4 matrix of float)
+0:421          step ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r043' ( temp 4X4 matrix of float)
+0:421          tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r044' ( temp 4X4 matrix of float)
+0:421          hyp. tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      transpose ( temp 4X4 matrix of float)
+0:421        'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r046' ( temp 4X4 matrix of float)
+0:421          trunc ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:424      Branch: Return with expression
 0:?         Constant:
 0:?           4.000000
 0:?           4.000000
@@ -2470,334 +2476,334 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:441  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; ( temp void)
-0:441    Function Parameters: 
-0:441      'inF0' ( in float)
-0:441      'inF1' ( in float)
-0:441      'inFV0' ( in 2-component vector of float)
-0:441      'inFV1' ( in 2-component vector of float)
-0:441      'inFM0' ( in 2X2 matrix of float)
-0:441      'inFM1' ( in 2X2 matrix of float)
+0:442  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; ( temp void)
+0:442    Function Parameters: 
+0:442      'inF0' ( in float)
+0:442      'inF1' ( in float)
+0:442      'inFV0' ( in 2-component vector of float)
+0:442      'inFV1' ( in 2-component vector of float)
+0:442      'inFM0' ( in 2X2 matrix of float)
+0:442      'inFM1' ( in 2X2 matrix of float)
 0:?     Sequence
-0:442      Sequence
-0:442        move second child to first child ( temp float)
-0:442          'r0' ( temp float)
-0:442          component-wise multiply ( temp float)
-0:442            'inF1' ( in float)
-0:442            'inF0' ( in float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2-component vector of float)
-0:442          'r1' ( temp 2-component vector of float)
-0:442          vector-scale ( temp 2-component vector of float)
-0:442            'inF0' ( in float)
-0:442            'inFV0' ( in 2-component vector of float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2-component vector of float)
-0:442          'r2' ( temp 2-component vector of float)
-0:442          vector-scale ( temp 2-component vector of float)
-0:442            'inFV0' ( in 2-component vector of float)
-0:442            'inF0' ( in float)
-0:442      Sequence
-0:442        move second child to first child ( temp float)
-0:442          'r3' ( temp float)
-0:442          dot-product ( temp float)
-0:442            'inFV0' ( in 2-component vector of float)
-0:442            'inFV1' ( in 2-component vector of float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2-component vector of float)
-0:442          'r4' ( temp 2-component vector of float)
-0:442          vector-times-matrix ( temp 2-component vector of float)
-0:442            'inFV0' ( in 2-component vector of float)
-0:442            'inFM0' ( in 2X2 matrix of float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2-component vector of float)
-0:442          'r5' ( temp 2-component vector of float)
-0:442          matrix-times-vector ( temp 2-component vector of float)
-0:442            'inFM0' ( in 2X2 matrix of float)
-0:442            'inFV0' ( in 2-component vector of float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2X2 matrix of float)
-0:442          'r6' ( temp 2X2 matrix of float)
-0:442          matrix-scale ( temp 2X2 matrix of float)
-0:442            'inF0' ( in float)
-0:442            'inFM0' ( in 2X2 matrix of float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2X2 matrix of float)
-0:442          'r7' ( temp 2X2 matrix of float)
-0:442          matrix-scale ( temp 2X2 matrix of float)
-0:442            'inFM0' ( in 2X2 matrix of float)
-0:442            'inF0' ( in float)
-0:442      Sequence
-0:442        move second child to first child ( temp 2X2 matrix of float)
-0:442          'r8' ( temp 2X2 matrix of float)
-0:442          matrix-multiply ( temp 2X2 matrix of float)
-0:442            'inFM1' ( in 2X2 matrix of float)
-0:442            'inFM0' ( in 2X2 matrix of float)
-0:448  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; ( temp void)
-0:448    Function Parameters: 
-0:448      'inF0' ( in float)
-0:448      'inF1' ( in float)
-0:448      'inFV0' ( in 3-component vector of float)
-0:448      'inFV1' ( in 3-component vector of float)
-0:448      'inFM0' ( in 3X3 matrix of float)
-0:448      'inFM1' ( in 3X3 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp float)
+0:443          'r0' ( temp float)
+0:443          component-wise multiply ( temp float)
+0:443            'inF1' ( in float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r1' ( temp 2-component vector of float)
+0:443          vector-scale ( temp 2-component vector of float)
+0:443            'inF0' ( in float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r2' ( temp 2-component vector of float)
+0:443          vector-scale ( temp 2-component vector of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp float)
+0:443          'r3' ( temp float)
+0:443          dot-product ( temp float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inFV1' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r4' ( temp 2-component vector of float)
+0:443          vector-times-matrix ( temp 2-component vector of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r5' ( temp 2-component vector of float)
+0:443          matrix-times-vector ( temp 2-component vector of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r6' ( temp 2X2 matrix of float)
+0:443          matrix-scale ( temp 2X2 matrix of float)
+0:443            'inF0' ( in float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r7' ( temp 2X2 matrix of float)
+0:443          matrix-scale ( temp 2X2 matrix of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r8' ( temp 2X2 matrix of float)
+0:443          matrix-multiply ( temp 2X2 matrix of float)
+0:443            'inFM1' ( in 2X2 matrix of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:449  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; ( temp void)
+0:449    Function Parameters: 
+0:449      'inF0' ( in float)
+0:449      'inF1' ( in float)
+0:449      'inFV0' ( in 3-component vector of float)
+0:449      'inFV1' ( in 3-component vector of float)
+0:449      'inFM0' ( in 3X3 matrix of float)
+0:449      'inFM1' ( in 3X3 matrix of float)
 0:?     Sequence
-0:449      Sequence
-0:449        move second child to first child ( temp float)
-0:449          'r0' ( temp float)
-0:449          component-wise multiply ( temp float)
-0:449            'inF1' ( in float)
-0:449            'inF0' ( in float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3-component vector of float)
-0:449          'r1' ( temp 3-component vector of float)
-0:449          vector-scale ( temp 3-component vector of float)
-0:449            'inF0' ( in float)
-0:449            'inFV0' ( in 3-component vector of float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3-component vector of float)
-0:449          'r2' ( temp 3-component vector of float)
-0:449          vector-scale ( temp 3-component vector of float)
-0:449            'inFV0' ( in 3-component vector of float)
-0:449            'inF0' ( in float)
-0:449      Sequence
-0:449        move second child to first child ( temp float)
-0:449          'r3' ( temp float)
-0:449          dot-product ( temp float)
-0:449            'inFV0' ( in 3-component vector of float)
-0:449            'inFV1' ( in 3-component vector of float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3-component vector of float)
-0:449          'r4' ( temp 3-component vector of float)
-0:449          vector-times-matrix ( temp 3-component vector of float)
-0:449            'inFV0' ( in 3-component vector of float)
-0:449            'inFM0' ( in 3X3 matrix of float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3-component vector of float)
-0:449          'r5' ( temp 3-component vector of float)
-0:449          matrix-times-vector ( temp 3-component vector of float)
-0:449            'inFM0' ( in 3X3 matrix of float)
-0:449            'inFV0' ( in 3-component vector of float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3X3 matrix of float)
-0:449          'r6' ( temp 3X3 matrix of float)
-0:449          matrix-scale ( temp 3X3 matrix of float)
-0:449            'inF0' ( in float)
-0:449            'inFM0' ( in 3X3 matrix of float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3X3 matrix of float)
-0:449          'r7' ( temp 3X3 matrix of float)
-0:449          matrix-scale ( temp 3X3 matrix of float)
-0:449            'inFM0' ( in 3X3 matrix of float)
-0:449            'inF0' ( in float)
-0:449      Sequence
-0:449        move second child to first child ( temp 3X3 matrix of float)
-0:449          'r8' ( temp 3X3 matrix of float)
-0:449          matrix-multiply ( temp 3X3 matrix of float)
-0:449            'inFM1' ( in 3X3 matrix of float)
-0:449            'inFM0' ( in 3X3 matrix of float)
-0:455  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; ( temp void)
-0:455    Function Parameters: 
-0:455      'inF0' ( in float)
-0:455      'inF1' ( in float)
-0:455      'inFV0' ( in 4-component vector of float)
-0:455      'inFV1' ( in 4-component vector of float)
-0:455      'inFM0' ( in 4X4 matrix of float)
-0:455      'inFM1' ( in 4X4 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp float)
+0:450          'r0' ( temp float)
+0:450          component-wise multiply ( temp float)
+0:450            'inF1' ( in float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r1' ( temp 3-component vector of float)
+0:450          vector-scale ( temp 3-component vector of float)
+0:450            'inF0' ( in float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r2' ( temp 3-component vector of float)
+0:450          vector-scale ( temp 3-component vector of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp float)
+0:450          'r3' ( temp float)
+0:450          dot-product ( temp float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inFV1' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r4' ( temp 3-component vector of float)
+0:450          vector-times-matrix ( temp 3-component vector of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r5' ( temp 3-component vector of float)
+0:450          matrix-times-vector ( temp 3-component vector of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r6' ( temp 3X3 matrix of float)
+0:450          matrix-scale ( temp 3X3 matrix of float)
+0:450            'inF0' ( in float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r7' ( temp 3X3 matrix of float)
+0:450          matrix-scale ( temp 3X3 matrix of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r8' ( temp 3X3 matrix of float)
+0:450          matrix-multiply ( temp 3X3 matrix of float)
+0:450            'inFM1' ( in 3X3 matrix of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:456  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; ( temp void)
+0:456    Function Parameters: 
+0:456      'inF0' ( in float)
+0:456      'inF1' ( in float)
+0:456      'inFV0' ( in 4-component vector of float)
+0:456      'inFV1' ( in 4-component vector of float)
+0:456      'inFM0' ( in 4X4 matrix of float)
+0:456      'inFM1' ( in 4X4 matrix of float)
 0:?     Sequence
-0:456      Sequence
-0:456        move second child to first child ( temp float)
-0:456          'r0' ( temp float)
-0:456          component-wise multiply ( temp float)
-0:456            'inF1' ( in float)
-0:456            'inF0' ( in float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4-component vector of float)
-0:456          'r1' ( temp 4-component vector of float)
-0:456          vector-scale ( temp 4-component vector of float)
-0:456            'inF0' ( in float)
-0:456            'inFV0' ( in 4-component vector of float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4-component vector of float)
-0:456          'r2' ( temp 4-component vector of float)
-0:456          vector-scale ( temp 4-component vector of float)
-0:456            'inFV0' ( in 4-component vector of float)
-0:456            'inF0' ( in float)
-0:456      Sequence
-0:456        move second child to first child ( temp float)
-0:456          'r3' ( temp float)
-0:456          dot-product ( temp float)
-0:456            'inFV0' ( in 4-component vector of float)
-0:456            'inFV1' ( in 4-component vector of float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4-component vector of float)
-0:456          'r4' ( temp 4-component vector of float)
-0:456          vector-times-matrix ( temp 4-component vector of float)
-0:456            'inFV0' ( in 4-component vector of float)
-0:456            'inFM0' ( in 4X4 matrix of float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4-component vector of float)
-0:456          'r5' ( temp 4-component vector of float)
-0:456          matrix-times-vector ( temp 4-component vector of float)
-0:456            'inFM0' ( in 4X4 matrix of float)
-0:456            'inFV0' ( in 4-component vector of float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4X4 matrix of float)
-0:456          'r6' ( temp 4X4 matrix of float)
-0:456          matrix-scale ( temp 4X4 matrix of float)
-0:456            'inF0' ( in float)
-0:456            'inFM0' ( in 4X4 matrix of float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4X4 matrix of float)
-0:456          'r7' ( temp 4X4 matrix of float)
-0:456          matrix-scale ( temp 4X4 matrix of float)
-0:456            'inFM0' ( in 4X4 matrix of float)
-0:456            'inF0' ( in float)
-0:456      Sequence
-0:456        move second child to first child ( temp 4X4 matrix of float)
-0:456          'r8' ( temp 4X4 matrix of float)
-0:456          matrix-multiply ( temp 4X4 matrix of float)
-0:456            'inFM1' ( in 4X4 matrix of float)
-0:456            'inFM0' ( in 4X4 matrix of float)
-0:465  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; ( temp void)
-0:465    Function Parameters: 
-0:465      'inF0' ( in float)
-0:465      'inF1' ( in float)
-0:465      'inFV2' ( in 2-component vector of float)
-0:465      'inFV3' ( in 3-component vector of float)
-0:465      'inFM2x3' ( in 2X3 matrix of float)
-0:465      'inFM3x2' ( in 3X2 matrix of float)
-0:465      'inFM3x3' ( in 3X3 matrix of float)
-0:465      'inFM3x4' ( in 3X4 matrix of float)
-0:465      'inFM2x4' ( in 2X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp float)
+0:457          'r0' ( temp float)
+0:457          component-wise multiply ( temp float)
+0:457            'inF1' ( in float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r1' ( temp 4-component vector of float)
+0:457          vector-scale ( temp 4-component vector of float)
+0:457            'inF0' ( in float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r2' ( temp 4-component vector of float)
+0:457          vector-scale ( temp 4-component vector of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp float)
+0:457          'r3' ( temp float)
+0:457          dot-product ( temp float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inFV1' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r4' ( temp 4-component vector of float)
+0:457          vector-times-matrix ( temp 4-component vector of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r5' ( temp 4-component vector of float)
+0:457          matrix-times-vector ( temp 4-component vector of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r6' ( temp 4X4 matrix of float)
+0:457          matrix-scale ( temp 4X4 matrix of float)
+0:457            'inF0' ( in float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r7' ( temp 4X4 matrix of float)
+0:457          matrix-scale ( temp 4X4 matrix of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r8' ( temp 4X4 matrix of float)
+0:457          matrix-multiply ( temp 4X4 matrix of float)
+0:457            'inFM1' ( in 4X4 matrix of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:466  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; ( temp void)
+0:466    Function Parameters: 
+0:466      'inF0' ( in float)
+0:466      'inF1' ( in float)
+0:466      'inFV2' ( in 2-component vector of float)
+0:466      'inFV3' ( in 3-component vector of float)
+0:466      'inFM2x3' ( in 2X3 matrix of float)
+0:466      'inFM3x2' ( in 3X2 matrix of float)
+0:466      'inFM3x3' ( in 3X3 matrix of float)
+0:466      'inFM3x4' ( in 3X4 matrix of float)
+0:466      'inFM2x4' ( in 2X4 matrix of float)
 0:?     Sequence
-0:466      Sequence
-0:466        move second child to first child ( temp float)
-0:466          'r00' ( temp float)
-0:466          component-wise multiply ( temp float)
-0:466            'inF1' ( in float)
-0:466            'inF0' ( in float)
 0:467      Sequence
-0:467        move second child to first child ( temp 2-component vector of float)
-0:467          'r01' ( temp 2-component vector of float)
-0:467          vector-scale ( temp 2-component vector of float)
+0:467        move second child to first child ( temp float)
+0:467          'r00' ( temp float)
+0:467          component-wise multiply ( temp float)
+0:467            'inF1' ( in float)
 0:467            'inF0' ( in float)
-0:467            'inFV2' ( in 2-component vector of float)
 0:468      Sequence
-0:468        move second child to first child ( temp 3-component vector of float)
-0:468          'r02' ( temp 3-component vector of float)
-0:468          vector-scale ( temp 3-component vector of float)
+0:468        move second child to first child ( temp 2-component vector of float)
+0:468          'r01' ( temp 2-component vector of float)
+0:468          vector-scale ( temp 2-component vector of float)
 0:468            'inF0' ( in float)
-0:468            'inFV3' ( in 3-component vector of float)
+0:468            'inFV2' ( in 2-component vector of float)
 0:469      Sequence
-0:469        move second child to first child ( temp 2-component vector of float)
-0:469          'r03' ( temp 2-component vector of float)
-0:469          vector-scale ( temp 2-component vector of float)
-0:469            'inFV2' ( in 2-component vector of float)
+0:469        move second child to first child ( temp 3-component vector of float)
+0:469          'r02' ( temp 3-component vector of float)
+0:469          vector-scale ( temp 3-component vector of float)
 0:469            'inF0' ( in float)
+0:469            'inFV3' ( in 3-component vector of float)
 0:470      Sequence
-0:470        move second child to first child ( temp 3-component vector of float)
-0:470          'r04' ( temp 3-component vector of float)
-0:470          vector-scale ( temp 3-component vector of float)
-0:470            'inFV3' ( in 3-component vector of float)
+0:470        move second child to first child ( temp 2-component vector of float)
+0:470          'r03' ( temp 2-component vector of float)
+0:470          vector-scale ( temp 2-component vector of float)
+0:470            'inFV2' ( in 2-component vector of float)
 0:470            'inF0' ( in float)
 0:471      Sequence
-0:471        move second child to first child ( temp float)
-0:471          'r05' ( temp float)
-0:471          dot-product ( temp float)
-0:471            'inFV2' ( in 2-component vector of float)
-0:471            'inFV2' ( in 2-component vector of float)
+0:471        move second child to first child ( temp 3-component vector of float)
+0:471          'r04' ( temp 3-component vector of float)
+0:471          vector-scale ( temp 3-component vector of float)
+0:471            'inFV3' ( in 3-component vector of float)
+0:471            'inF0' ( in float)
 0:472      Sequence
 0:472        move second child to first child ( temp float)
-0:472          'r06' ( temp float)
+0:472          'r05' ( temp float)
 0:472          dot-product ( temp float)
-0:472            'inFV3' ( in 3-component vector of float)
-0:472            'inFV3' ( in 3-component vector of float)
+0:472            'inFV2' ( in 2-component vector of float)
+0:472            'inFV2' ( in 2-component vector of float)
 0:473      Sequence
-0:473        move second child to first child ( temp 3-component vector of float)
-0:473          'r07' ( temp 3-component vector of float)
-0:473          matrix-times-vector ( temp 3-component vector of float)
-0:473            'inFM2x3' ( in 2X3 matrix of float)
-0:473            'inFV2' ( in 2-component vector of float)
+0:473        move second child to first child ( temp float)
+0:473          'r06' ( temp float)
+0:473          dot-product ( temp float)
+0:473            'inFV3' ( in 3-component vector of float)
+0:473            'inFV3' ( in 3-component vector of float)
 0:474      Sequence
-0:474        move second child to first child ( temp 2-component vector of float)
-0:474          'r08' ( temp 2-component vector of float)
-0:474          matrix-times-vector ( temp 2-component vector of float)
-0:474            'inFM3x2' ( in 3X2 matrix of float)
-0:474            'inFV3' ( in 3-component vector of float)
+0:474        move second child to first child ( temp 3-component vector of float)
+0:474          'r07' ( temp 3-component vector of float)
+0:474          matrix-times-vector ( temp 3-component vector of float)
+0:474            'inFM2x3' ( in 2X3 matrix of float)
+0:474            'inFV2' ( in 2-component vector of float)
 0:475      Sequence
 0:475        move second child to first child ( temp 2-component vector of float)
-0:475          'r09' ( temp 2-component vector of float)
-0:475          vector-times-matrix ( temp 2-component vector of float)
+0:475          'r08' ( temp 2-component vector of float)
+0:475          matrix-times-vector ( temp 2-component vector of float)
+0:475            'inFM3x2' ( in 3X2 matrix of float)
 0:475            'inFV3' ( in 3-component vector of float)
-0:475            'inFM2x3' ( in 2X3 matrix of float)
 0:476      Sequence
-0:476        move second child to first child ( temp 3-component vector of float)
-0:476          'r10' ( temp 3-component vector of float)
-0:476          vector-times-matrix ( temp 3-component vector of float)
-0:476            'inFV2' ( in 2-component vector of float)
-0:476            'inFM3x2' ( in 3X2 matrix of float)
+0:476        move second child to first child ( temp 2-component vector of float)
+0:476          'r09' ( temp 2-component vector of float)
+0:476          vector-times-matrix ( temp 2-component vector of float)
+0:476            'inFV3' ( in 3-component vector of float)
+0:476            'inFM2x3' ( in 2X3 matrix of float)
 0:477      Sequence
-0:477        move second child to first child ( temp 2X3 matrix of float)
-0:477          'r11' ( temp 2X3 matrix of float)
-0:477          matrix-scale ( temp 2X3 matrix of float)
-0:477            'inF0' ( in float)
-0:477            'inFM2x3' ( in 2X3 matrix of float)
+0:477        move second child to first child ( temp 3-component vector of float)
+0:477          'r10' ( temp 3-component vector of float)
+0:477          vector-times-matrix ( temp 3-component vector of float)
+0:477            'inFV2' ( in 2-component vector of float)
+0:477            'inFM3x2' ( in 3X2 matrix of float)
 0:478      Sequence
-0:478        move second child to first child ( temp 3X2 matrix of float)
-0:478          'r12' ( temp 3X2 matrix of float)
-0:478          matrix-scale ( temp 3X2 matrix of float)
+0:478        move second child to first child ( temp 2X3 matrix of float)
+0:478          'r11' ( temp 2X3 matrix of float)
+0:478          matrix-scale ( temp 2X3 matrix of float)
 0:478            'inF0' ( in float)
-0:478            'inFM3x2' ( in 3X2 matrix of float)
+0:478            'inFM2x3' ( in 2X3 matrix of float)
 0:479      Sequence
-0:479        move second child to first child ( temp 2X2 matrix of float)
-0:479          'r13' ( temp 2X2 matrix of float)
-0:479          matrix-multiply ( temp 2X2 matrix of float)
+0:479        move second child to first child ( temp 3X2 matrix of float)
+0:479          'r12' ( temp 3X2 matrix of float)
+0:479          matrix-scale ( temp 3X2 matrix of float)
+0:479            'inF0' ( in float)
 0:479            'inFM3x2' ( in 3X2 matrix of float)
-0:479            'inFM2x3' ( in 2X3 matrix of float)
 0:480      Sequence
-0:480        move second child to first child ( temp 2X3 matrix of float)
-0:480          'r14' ( temp 2X3 matrix of float)
-0:480          matrix-multiply ( temp 2X3 matrix of float)
-0:480            'inFM3x3' ( in 3X3 matrix of float)
+0:480        move second child to first child ( temp 2X2 matrix of float)
+0:480          'r13' ( temp 2X2 matrix of float)
+0:480          matrix-multiply ( temp 2X2 matrix of float)
+0:480            'inFM3x2' ( in 3X2 matrix of float)
 0:480            'inFM2x3' ( in 2X3 matrix of float)
 0:481      Sequence
-0:481        move second child to first child ( temp 2X4 matrix of float)
-0:481          'r15' ( temp 2X4 matrix of float)
-0:481          matrix-multiply ( temp 2X4 matrix of float)
-0:481            'inFM3x4' ( in 3X4 matrix of float)
+0:481        move second child to first child ( temp 2X3 matrix of float)
+0:481          'r14' ( temp 2X3 matrix of float)
+0:481          matrix-multiply ( temp 2X3 matrix of float)
+0:481            'inFM3x3' ( in 3X3 matrix of float)
 0:481            'inFM2x3' ( in 2X3 matrix of float)
 0:482      Sequence
-0:482        move second child to first child ( temp 3X4 matrix of float)
-0:482          'r16' ( temp 3X4 matrix of float)
-0:482          matrix-multiply ( temp 3X4 matrix of float)
-0:482            'inFM2x4' ( in 2X4 matrix of float)
-0:482            'inFM3x2' ( in 3X2 matrix of float)
-0:488  Function Definition: @main( ( temp structure{ temp 4-component vector of float color})
-0:488    Function Parameters: 
+0:482        move second child to first child ( temp 2X4 matrix of float)
+0:482          'r15' ( temp 2X4 matrix of float)
+0:482          matrix-multiply ( temp 2X4 matrix of float)
+0:482            'inFM3x4' ( in 3X4 matrix of float)
+0:482            'inFM2x3' ( in 2X3 matrix of float)
+0:483      Sequence
+0:483        move second child to first child ( temp 3X4 matrix of float)
+0:483          'r16' ( temp 3X4 matrix of float)
+0:483          matrix-multiply ( temp 3X4 matrix of float)
+0:483            'inFM2x4' ( in 2X4 matrix of float)
+0:483            'inFM3x2' ( in 3X2 matrix of float)
+0:489  Function Definition: @main( ( temp structure{ temp 4-component vector of float color})
+0:489    Function Parameters: 
 0:?     Sequence
-0:490      move second child to first child ( temp 4-component vector of float)
-0:490        color: direct index for structure ( temp 4-component vector of float)
-0:490          'ps_output' ( temp structure{ temp 4-component vector of float color})
-0:490          Constant:
-0:490            0 (const int)
-0:490        Constant:
-0:490          1.000000
-0:490          1.000000
-0:490          1.000000
-0:490          1.000000
-0:491      Branch: Return with expression
-0:491        'ps_output' ( temp structure{ temp 4-component vector of float color})
-0:488  Function Definition: main( ( temp void)
-0:488    Function Parameters: 
+0:491      move second child to first child ( temp 4-component vector of float)
+0:491        color: direct index for structure ( temp 4-component vector of float)
+0:491          'ps_output' ( temp structure{ temp 4-component vector of float color})
+0:491          Constant:
+0:491            0 (const int)
+0:491        Constant:
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:492      Branch: Return with expression
+0:492        'ps_output' ( temp structure{ temp 4-component vector of float color})
+0:489  Function Definition: main( ( temp void)
+0:489    Function Parameters: 
 0:?     Sequence
-0:488      Sequence
-0:488        move second child to first child ( temp 4-component vector of float)
+0:489      Sequence
+0:489        move second child to first child ( temp 4-component vector of float)
 0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
-0:488          color: direct index for structure ( temp 4-component vector of float)
-0:488            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
-0:488            Constant:
-0:488              0 (const int)
+0:489          color: direct index for structure ( temp 4-component vector of float)
+0:489            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
+0:489            Constant:
+0:489              0 (const int)
 0:?   Linker Objects
 0:?     'gs_ua' ( shared uint)
 0:?     'gs_ub' ( shared uint)
@@ -2960,1110 +2966,1104 @@
 0:44          'r023' ( temp float)
 0:44          degrees ( temp float)
 0:44            'inF0' ( in float)
-0:48      Sequence
-0:48        move second child to first child ( temp float)
-0:48          'r027' ( temp float)
-0:48          exp ( temp float)
-0:48            'inF0' ( in float)
+0:45      Sequence
+0:45        move second child to first child ( temp float)
+0:45          'r024' ( temp float)
+0:45          distance ( temp float)
+0:45            'inF0' ( in float)
+0:45            'inF1' ( in float)
 0:49      Sequence
 0:49        move second child to first child ( temp float)
-0:49          'r028' ( temp float)
-0:49          exp2 ( temp float)
+0:49          'r027' ( temp float)
+0:49          exp ( temp float)
 0:49            'inF0' ( in float)
 0:50      Sequence
-0:50        move second child to first child ( temp uint)
-0:50          'r029' ( temp uint)
-0:50          Convert int to uint ( temp uint)
-0:50            findMSB ( temp int)
-0:50              Constant:
-0:50                7 (const int)
+0:50        move second child to first child ( temp float)
+0:50          'r028' ( temp float)
+0:50          exp2 ( temp float)
+0:50            'inF0' ( in float)
 0:51      Sequence
 0:51        move second child to first child ( temp uint)
-0:51          'r030' ( temp uint)
+0:51          'r029' ( temp uint)
 0:51          Convert int to uint ( temp uint)
-0:51            findLSB ( temp int)
+0:51            findMSB ( temp int)
 0:51              Constant:
 0:51                7 (const int)
 0:52      Sequence
-0:52        move second child to first child ( temp float)
-0:52          'r031' ( temp float)
-0:52          Floor ( temp float)
-0:52            'inF0' ( in float)
-0:54      Sequence
-0:54        move second child to first child ( temp float)
-0:54          'r033' ( temp float)
-0:54          mod ( temp float)
-0:54            'inF0' ( in float)
-0:54            'inF1' ( in float)
+0:52        move second child to first child ( temp uint)
+0:52          'r030' ( temp uint)
+0:52          Convert int to uint ( temp uint)
+0:52            findLSB ( temp int)
+0:52              Constant:
+0:52                7 (const int)
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'r031' ( temp float)
+0:53          Floor ( temp float)
+0:53            'inF0' ( in float)
 0:55      Sequence
 0:55        move second child to first child ( temp float)
-0:55          'r034' ( temp float)
-0:55          Fraction ( temp float)
+0:55          'r033' ( temp float)
+0:55          mod ( temp float)
 0:55            'inF0' ( in float)
+0:55            'inF1' ( in float)
 0:56      Sequence
 0:56        move second child to first child ( temp float)
-0:56          'r036' ( temp float)
-0:56          fwidth ( temp float)
+0:56          'r034' ( temp float)
+0:56          Fraction ( temp float)
 0:56            'inF0' ( in float)
 0:57      Sequence
-0:57        move second child to first child ( temp bool)
-0:57          'r037' ( temp bool)
-0:57          isinf ( temp bool)
+0:57        move second child to first child ( temp float)
+0:57          'r036' ( temp float)
+0:57          fwidth ( temp float)
 0:57            'inF0' ( in float)
 0:58      Sequence
 0:58        move second child to first child ( temp bool)
-0:58          'r038' ( temp bool)
-0:58          isnan ( temp bool)
+0:58          'r037' ( temp bool)
+0:58          isinf ( temp bool)
 0:58            'inF0' ( in float)
 0:59      Sequence
-0:59        move second child to first child ( temp float)
-0:59          'r039' ( temp float)
-0:59          ldexp ( temp float)
+0:59        move second child to first child ( temp bool)
+0:59          'r038' ( temp bool)
+0:59          isnan ( temp bool)
 0:59            'inF0' ( in float)
-0:59            'inF1' ( in float)
 0:60      Sequence
 0:60        move second child to first child ( temp float)
-0:60          'r039a' ( temp float)
-0:60          mix ( temp float)
+0:60          'r039' ( temp float)
+0:60          ldexp ( temp float)
 0:60            'inF0' ( in float)
 0:60            'inF1' ( in float)
-0:60            'inF2' ( in float)
 0:61      Sequence
 0:61        move second child to first child ( temp float)
-0:61          'r040' ( temp float)
-0:61          log ( temp float)
+0:61          'r039a' ( temp float)
+0:61          mix ( temp float)
 0:61            'inF0' ( in float)
+0:61            'inF1' ( in float)
+0:61            'inF2' ( in float)
 0:62      Sequence
 0:62        move second child to first child ( temp float)
-0:62          'r041' ( temp float)
-0:62          component-wise multiply ( temp float)
-0:62            log2 ( temp float)
-0:62              'inF0' ( in float)
-0:62            Constant:
-0:62              0.301030
+0:62          'r040' ( temp float)
+0:62          log ( temp float)
+0:62            'inF0' ( in float)
 0:63      Sequence
 0:63        move second child to first child ( temp float)
-0:63          'r042' ( temp float)
-0:63          log2 ( temp float)
-0:63            'inF0' ( in float)
+0:63          'r041' ( temp float)
+0:63          component-wise multiply ( temp float)
+0:63            log2 ( temp float)
+0:63              'inF0' ( in float)
+0:63            Constant:
+0:63              0.301030
 0:64      Sequence
 0:64        move second child to first child ( temp float)
-0:64          'r043' ( temp float)
-0:64          max ( temp float)
+0:64          'r042' ( temp float)
+0:64          log2 ( temp float)
 0:64            'inF0' ( in float)
-0:64            'inF1' ( in float)
 0:65      Sequence
 0:65        move second child to first child ( temp float)
-0:65          'r044' ( temp float)
-0:65          min ( temp float)
+0:65          'r043' ( temp float)
+0:65          max ( temp float)
 0:65            'inF0' ( in float)
 0:65            'inF1' ( in float)
 0:66      Sequence
 0:66        move second child to first child ( temp float)
-0:66          'r045' ( temp float)
-0:66          pow ( temp float)
+0:66          'r044' ( temp float)
+0:66          min ( temp float)
 0:66            'inF0' ( in float)
 0:66            'inF1' ( in float)
 0:67      Sequence
 0:67        move second child to first child ( temp float)
-0:67          'r046' ( temp float)
-0:67          radians ( temp float)
+0:67          'r045' ( temp float)
+0:67          pow ( temp float)
 0:67            'inF0' ( in float)
+0:67            'inF1' ( in float)
 0:68      Sequence
 0:68        move second child to first child ( temp float)
-0:68          'r047' ( temp float)
-0:68          divide ( temp float)
-0:68            Constant:
-0:68              1.000000
+0:68          'r046' ( temp float)
+0:68          radians ( temp float)
 0:68            'inF0' ( in float)
 0:69      Sequence
-0:69        move second child to first child ( temp uint)
-0:69          'r048' ( temp uint)
-0:69          Convert int to uint ( temp uint)
-0:69            bitFieldReverse ( temp int)
-0:69              Constant:
-0:69                2 (const int)
+0:69        move second child to first child ( temp float)
+0:69          'r047' ( temp float)
+0:69          divide ( temp float)
+0:69            Constant:
+0:69              1.000000
+0:69            'inF0' ( in float)
 0:70      Sequence
-0:70        move second child to first child ( temp float)
-0:70          'r049' ( temp float)
-0:70          roundEven ( temp float)
-0:70            'inF0' ( in float)
+0:70        move second child to first child ( temp uint)
+0:70          'r048' ( temp uint)
+0:70          Convert int to uint ( temp uint)
+0:70            bitFieldReverse ( temp int)
+0:70              Constant:
+0:70                2 (const int)
 0:71      Sequence
 0:71        move second child to first child ( temp float)
-0:71          'r050' ( temp float)
-0:71          inverse sqrt ( temp float)
+0:71          'r049' ( temp float)
+0:71          roundEven ( temp float)
 0:71            'inF0' ( in float)
 0:72      Sequence
 0:72        move second child to first child ( temp float)
-0:72          'r051' ( temp float)
-0:72          clamp ( temp float)
+0:72          'r050' ( temp float)
+0:72          inverse sqrt ( temp float)
 0:72            'inF0' ( in float)
-0:72            Constant:
-0:72              0.000000
-0:72            Constant:
-0:72              1.000000
 0:73      Sequence
 0:73        move second child to first child ( temp float)
-0:73          'r052' ( temp float)
-0:73          Sign ( temp float)
+0:73          'r051' ( temp float)
+0:73          clamp ( temp float)
 0:73            'inF0' ( in float)
+0:73            Constant:
+0:73              0.000000
+0:73            Constant:
+0:73              1.000000
 0:74      Sequence
 0:74        move second child to first child ( temp float)
-0:74          'r053' ( temp float)
-0:74          sine ( temp float)
+0:74          'r052' ( temp float)
+0:74          Sign ( temp float)
 0:74            'inF0' ( in float)
 0:75      Sequence
 0:75        move second child to first child ( temp float)
-0:75          'inF1' ( in float)
+0:75          'r053' ( temp float)
 0:75          sine ( temp float)
 0:75            'inF0' ( in float)
-0:75        move second child to first child ( temp float)
-0:75          'inF2' ( in float)
-0:75          cosine ( temp float)
-0:75            'inF0' ( in float)
 0:76      Sequence
 0:76        move second child to first child ( temp float)
-0:76          'r055' ( temp float)
-0:76          hyp. sine ( temp float)
+0:76          'inF1' ( in float)
+0:76          sine ( temp float)
+0:76            'inF0' ( in float)
+0:76        move second child to first child ( temp float)
+0:76          'inF2' ( in float)
+0:76          cosine ( temp float)
 0:76            'inF0' ( in float)
 0:77      Sequence
 0:77        move second child to first child ( temp float)
-0:77          'r056' ( temp float)
-0:77          smoothstep ( temp float)
+0:77          'r055' ( temp float)
+0:77          hyp. sine ( temp float)
 0:77            'inF0' ( in float)
-0:77            'inF1' ( in float)
-0:77            'inF2' ( in float)
 0:78      Sequence
 0:78        move second child to first child ( temp float)
-0:78          'r057' ( temp float)
-0:78          sqrt ( temp float)
+0:78          'r056' ( temp float)
+0:78          smoothstep ( temp float)
 0:78            'inF0' ( in float)
+0:78            'inF1' ( in float)
+0:78            'inF2' ( in float)
 0:79      Sequence
 0:79        move second child to first child ( temp float)
-0:79          'r058' ( temp float)
-0:79          step ( temp float)
+0:79          'r057' ( temp float)
+0:79          sqrt ( temp float)
 0:79            'inF0' ( in float)
-0:79            'inF1' ( in float)
 0:80      Sequence
 0:80        move second child to first child ( temp float)
-0:80          'r059' ( temp float)
-0:80          tangent ( temp float)
+0:80          'r058' ( temp float)
+0:80          step ( temp float)
 0:80            'inF0' ( in float)
+0:80            'inF1' ( in float)
 0:81      Sequence
 0:81        move second child to first child ( temp float)
-0:81          'r060' ( temp float)
-0:81          hyp. tangent ( temp float)
+0:81          'r059' ( temp float)
+0:81          tangent ( temp float)
 0:81            'inF0' ( in float)
-0:83      Sequence
-0:83        move second child to first child ( temp float)
-0:83          'r061' ( temp float)
-0:83          trunc ( temp float)
-0:83            'inF0' ( in float)
-0:85      Branch: Return with expression
-0:85        Constant:
-0:85          0.000000
-0:89  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
-0:89    Function Parameters: 
-0:89      'inF0' ( in 1-component vector of float)
-0:89      'inF1' ( in 1-component vector of float)
-0:89      'inF2' ( in 1-component vector of float)
+0:82      Sequence
+0:82        move second child to first child ( temp float)
+0:82          'r060' ( temp float)
+0:82          hyp. tangent ( temp float)
+0:82            'inF0' ( in float)
+0:84      Sequence
+0:84        move second child to first child ( temp float)
+0:84          'r061' ( temp float)
+0:84          trunc ( temp float)
+0:84            'inF0' ( in float)
+0:86      Branch: Return with expression
+0:86        Constant:
+0:86          0.000000
+0:90  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
+0:90    Function Parameters: 
+0:90      'inF0' ( in 1-component vector of float)
+0:90      'inF1' ( in 1-component vector of float)
+0:90      'inF2' ( in 1-component vector of float)
 0:?     Sequence
-0:91      Branch: Return with expression
-0:91        Constant:
-0:91          0.000000
-0:95  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
-0:95    Function Parameters: 
-0:95      'inF0' ( in 2-component vector of float)
-0:95      'inF1' ( in 2-component vector of float)
-0:95      'inF2' ( in 2-component vector of float)
-0:95      'inU0' ( in 2-component vector of uint)
-0:95      'inU1' ( in 2-component vector of uint)
+0:92      Branch: Return with expression
+0:92        Constant:
+0:92          0.000000
+0:96  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
+0:96    Function Parameters: 
+0:96      'inF0' ( in 2-component vector of float)
+0:96      'inF1' ( in 2-component vector of float)
+0:96      'inF2' ( in 2-component vector of float)
+0:96      'inU0' ( in 2-component vector of uint)
+0:96      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
-0:98      Sequence
-0:98        move second child to first child ( temp bool)
-0:98          'r000' ( temp bool)
-0:98          all ( temp bool)
-0:98            Convert float to bool ( temp 2-component vector of bool)
-0:98              'inF0' ( in 2-component vector of float)
 0:99      Sequence
-0:99        move second child to first child ( temp 2-component vector of float)
-0:99          'r001' ( temp 2-component vector of float)
-0:99          Absolute value ( temp 2-component vector of float)
-0:99            'inF0' ( in 2-component vector of float)
+0:99        move second child to first child ( temp bool)
+0:99          'r000' ( temp bool)
+0:99          all ( temp bool)
+0:99            Convert float to bool ( temp 2-component vector of bool)
+0:99              'inF0' ( in 2-component vector of float)
 0:100      Sequence
 0:100        move second child to first child ( temp 2-component vector of float)
-0:100          'r002' ( temp 2-component vector of float)
-0:100          arc cosine ( temp 2-component vector of float)
+0:100          'r001' ( temp 2-component vector of float)
+0:100          Absolute value ( temp 2-component vector of float)
 0:100            'inF0' ( in 2-component vector of float)
 0:101      Sequence
-0:101        move second child to first child ( temp bool)
-0:101          'r003' ( temp bool)
-0:101          any ( temp bool)
-0:101            Convert float to bool ( temp 2-component vector of bool)
-0:101              'inF0' ( in 2-component vector of float)
+0:101        move second child to first child ( temp 2-component vector of float)
+0:101          'r002' ( temp 2-component vector of float)
+0:101          arc cosine ( temp 2-component vector of float)
+0:101            'inF0' ( in 2-component vector of float)
 0:102      Sequence
-0:102        move second child to first child ( temp 2-component vector of float)
-0:102          'r004' ( temp 2-component vector of float)
-0:102          arc sine ( temp 2-component vector of float)
-0:102            'inF0' ( in 2-component vector of float)
+0:102        move second child to first child ( temp bool)
+0:102          'r003' ( temp bool)
+0:102          any ( temp bool)
+0:102            Convert float to bool ( temp 2-component vector of bool)
+0:102              'inF0' ( in 2-component vector of float)
 0:103      Sequence
-0:103        move second child to first child ( temp 2-component vector of int)
-0:103          'r005' ( temp 2-component vector of int)
-0:103          floatBitsToInt ( temp 2-component vector of int)
+0:103        move second child to first child ( temp 2-component vector of float)
+0:103          'r004' ( temp 2-component vector of float)
+0:103          arc sine ( temp 2-component vector of float)
 0:103            'inF0' ( in 2-component vector of float)
 0:104      Sequence
-0:104        move second child to first child ( temp 2-component vector of uint)
-0:104          'r006' ( temp 2-component vector of uint)
-0:104          floatBitsToUint ( temp 2-component vector of uint)
+0:104        move second child to first child ( temp 2-component vector of int)
+0:104          'r005' ( temp 2-component vector of int)
+0:104          floatBitsToInt ( temp 2-component vector of int)
 0:104            'inF0' ( in 2-component vector of float)
 0:105      Sequence
-0:105        move second child to first child ( temp 2-component vector of float)
-0:105          'r007' ( temp 2-component vector of float)
-0:105          intBitsToFloat ( temp 2-component vector of float)
-0:105            'inU0' ( in 2-component vector of uint)
-0:107      Sequence
-0:107        move second child to first child ( temp 2-component vector of float)
-0:107          'r009' ( temp 2-component vector of float)
-0:107          arc tangent ( temp 2-component vector of float)
-0:107            'inF0' ( in 2-component vector of float)
+0:105        move second child to first child ( temp 2-component vector of uint)
+0:105          'r006' ( temp 2-component vector of uint)
+0:105          floatBitsToUint ( temp 2-component vector of uint)
+0:105            'inF0' ( in 2-component vector of float)
+0:106      Sequence
+0:106        move second child to first child ( temp 2-component vector of float)
+0:106          'r007' ( temp 2-component vector of float)
+0:106          intBitsToFloat ( temp 2-component vector of float)
+0:106            'inU0' ( in 2-component vector of uint)
 0:108      Sequence
 0:108        move second child to first child ( temp 2-component vector of float)
-0:108          'r010' ( temp 2-component vector of float)
+0:108          'r009' ( temp 2-component vector of float)
 0:108          arc tangent ( temp 2-component vector of float)
 0:108            'inF0' ( in 2-component vector of float)
-0:108            'inF1' ( in 2-component vector of float)
 0:109      Sequence
 0:109        move second child to first child ( temp 2-component vector of float)
-0:109          'r011' ( temp 2-component vector of float)
-0:109          Ceiling ( temp 2-component vector of float)
+0:109          'r010' ( temp 2-component vector of float)
+0:109          arc tangent ( temp 2-component vector of float)
 0:109            'inF0' ( in 2-component vector of float)
+0:109            'inF1' ( in 2-component vector of float)
 0:110      Sequence
 0:110        move second child to first child ( temp 2-component vector of float)
-0:110          'r012' ( temp 2-component vector of float)
-0:110          clamp ( temp 2-component vector of float)
+0:110          'r011' ( temp 2-component vector of float)
+0:110          Ceiling ( temp 2-component vector of float)
 0:110            'inF0' ( in 2-component vector of float)
-0:110            'inF1' ( in 2-component vector of float)
-0:110            'inF2' ( in 2-component vector of float)
-0:111      Test condition and select ( temp void)
-0:111        Condition
-0:111        any ( temp bool)
-0:111          Compare Less Than ( temp 2-component vector of bool)
+0:111      Sequence
+0:111        move second child to first child ( temp 2-component vector of float)
+0:111          'r012' ( temp 2-component vector of float)
+0:111          clamp ( temp 2-component vector of float)
 0:111            'inF0' ( in 2-component vector of float)
-0:111            Constant:
-0:111              0.000000
-0:111              0.000000
-0:111        true case
-0:111        Branch: Kill
+0:111            'inF1' ( in 2-component vector of float)
+0:111            'inF2' ( in 2-component vector of float)
 0:112      Test condition and select ( temp void)
 0:112        Condition
 0:112        any ( temp bool)
 0:112          Compare Less Than ( temp 2-component vector of bool)
-0:112            'inU0' ( in 2-component vector of uint)
+0:112            'inF0' ( in 2-component vector of float)
 0:112            Constant:
 0:112              0.000000
 0:112              0.000000
 0:112        true case
 0:112        Branch: Kill
-0:113      Sequence
-0:113        move second child to first child ( temp 2-component vector of float)
-0:113          'r013' ( temp 2-component vector of float)
-0:113          cosine ( temp 2-component vector of float)
-0:113            'inF0' ( in 2-component vector of float)
+0:113      Test condition and select ( temp void)
+0:113        Condition
+0:113        any ( temp bool)
+0:113          Compare Less Than ( temp 2-component vector of bool)
+0:113            'inU0' ( in 2-component vector of uint)
+0:113            Constant:
+0:113              0.000000
+0:113              0.000000
+0:113        true case
+0:113        Branch: Kill
 0:114      Sequence
 0:114        move second child to first child ( temp 2-component vector of float)
-0:114          'r015' ( temp 2-component vector of float)
-0:114          hyp. cosine ( temp 2-component vector of float)
+0:114          'r013' ( temp 2-component vector of float)
+0:114          cosine ( temp 2-component vector of float)
 0:114            'inF0' ( in 2-component vector of float)
 0:115      Sequence
-0:115        move second child to first child ( temp 2-component vector of int)
-0:115          'r016' ( temp 2-component vector of int)
+0:115        move second child to first child ( temp 2-component vector of float)
+0:115          'r015' ( temp 2-component vector of float)
+0:115          hyp. cosine ( temp 2-component vector of float)
+0:115            'inF0' ( in 2-component vector of float)
+0:116      Sequence
+0:116        move second child to first child ( temp 2-component vector of int)
+0:116          'r016' ( temp 2-component vector of int)
 0:?           bitCount ( temp 2-component vector of int)
 0:?             Constant:
 0:?               7 (const int)
 0:?               3 (const int)
-0:116      Sequence
-0:116        move second child to first child ( temp 2-component vector of float)
-0:116          'r017' ( temp 2-component vector of float)
-0:116          dPdx ( temp 2-component vector of float)
-0:116            'inF0' ( in 2-component vector of float)
 0:117      Sequence
 0:117        move second child to first child ( temp 2-component vector of float)
-0:117          'r018' ( temp 2-component vector of float)
-0:117          dPdxCoarse ( temp 2-component vector of float)
+0:117          'r017' ( temp 2-component vector of float)
+0:117          dPdx ( temp 2-component vector of float)
 0:117            'inF0' ( in 2-component vector of float)
 0:118      Sequence
 0:118        move second child to first child ( temp 2-component vector of float)
-0:118          'r019' ( temp 2-component vector of float)
-0:118          dPdxFine ( temp 2-component vector of float)
+0:118          'r018' ( temp 2-component vector of float)
+0:118          dPdxCoarse ( temp 2-component vector of float)
 0:118            'inF0' ( in 2-component vector of float)
 0:119      Sequence
 0:119        move second child to first child ( temp 2-component vector of float)
-0:119          'r020' ( temp 2-component vector of float)
-0:119          dPdy ( temp 2-component vector of float)
+0:119          'r019' ( temp 2-component vector of float)
+0:119          dPdxFine ( temp 2-component vector of float)
 0:119            'inF0' ( in 2-component vector of float)
 0:120      Sequence
 0:120        move second child to first child ( temp 2-component vector of float)
-0:120          'r021' ( temp 2-component vector of float)
-0:120          dPdyCoarse ( temp 2-component vector of float)
+0:120          'r020' ( temp 2-component vector of float)
+0:120          dPdy ( temp 2-component vector of float)
 0:120            'inF0' ( in 2-component vector of float)
 0:121      Sequence
 0:121        move second child to first child ( temp 2-component vector of float)
-0:121          'r022' ( temp 2-component vector of float)
-0:121          dPdyFine ( temp 2-component vector of float)
+0:121          'r021' ( temp 2-component vector of float)
+0:121          dPdyCoarse ( temp 2-component vector of float)
 0:121            'inF0' ( in 2-component vector of float)
 0:122      Sequence
 0:122        move second child to first child ( temp 2-component vector of float)
-0:122          'r023' ( temp 2-component vector of float)
-0:122          degrees ( temp 2-component vector of float)
+0:122          'r022' ( temp 2-component vector of float)
+0:122          dPdyFine ( temp 2-component vector of float)
 0:122            'inF0' ( in 2-component vector of float)
-0:126      Sequence
-0:126        move second child to first child ( temp float)
-0:126          'r026' ( temp float)
-0:126          distance ( temp float)
-0:126            'inF0' ( in 2-component vector of float)
-0:126            'inF1' ( in 2-component vector of float)
+0:123      Sequence
+0:123        move second child to first child ( temp 2-component vector of float)
+0:123          'r023' ( temp 2-component vector of float)
+0:123          degrees ( temp 2-component vector of float)
+0:123            'inF0' ( in 2-component vector of float)
 0:127      Sequence
 0:127        move second child to first child ( temp float)
-0:127          'r027' ( temp float)
-0:127          dot-product ( temp float)
+0:127          'r026' ( temp float)
+0:127          distance ( temp float)
 0:127            'inF0' ( in 2-component vector of float)
 0:127            'inF1' ( in 2-component vector of float)
-0:131      Sequence
-0:131        move second child to first child ( temp 2-component vector of float)
-0:131          'r028' ( temp 2-component vector of float)
-0:131          exp ( temp 2-component vector of float)
-0:131            'inF0' ( in 2-component vector of float)
+0:128      Sequence
+0:128        move second child to first child ( temp float)
+0:128          'r027' ( temp float)
+0:128          dot-product ( temp float)
+0:128            'inF0' ( in 2-component vector of float)
+0:128            'inF1' ( in 2-component vector of float)
 0:132      Sequence
 0:132        move second child to first child ( temp 2-component vector of float)
-0:132          'r029' ( temp 2-component vector of float)
-0:132          exp2 ( temp 2-component vector of float)
+0:132          'r028' ( temp 2-component vector of float)
+0:132          exp ( temp 2-component vector of float)
 0:132            'inF0' ( in 2-component vector of float)
 0:133      Sequence
 0:133        move second child to first child ( temp 2-component vector of float)
-0:133          'r030' ( temp 2-component vector of float)
-0:133          face-forward ( temp 2-component vector of float)
+0:133          'r029' ( temp 2-component vector of float)
+0:133          exp2 ( temp 2-component vector of float)
 0:133            'inF0' ( in 2-component vector of float)
-0:133            'inF1' ( in 2-component vector of float)
-0:133            'inF2' ( in 2-component vector of float)
 0:134      Sequence
-0:134        move second child to first child ( temp 2-component vector of uint)
-0:134          'r031' ( temp 2-component vector of uint)
+0:134        move second child to first child ( temp 2-component vector of float)
+0:134          'r030' ( temp 2-component vector of float)
+0:134          face-forward ( temp 2-component vector of float)
+0:134            'inF0' ( in 2-component vector of float)
+0:134            'inF1' ( in 2-component vector of float)
+0:134            'inF2' ( in 2-component vector of float)
+0:135      Sequence
+0:135        move second child to first child ( temp 2-component vector of uint)
+0:135          'r031' ( temp 2-component vector of uint)
 0:?           findMSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:135      Sequence
-0:135        move second child to first child ( temp 2-component vector of uint)
-0:135          'r032' ( temp 2-component vector of uint)
+0:136      Sequence
+0:136        move second child to first child ( temp 2-component vector of uint)
+0:136          'r032' ( temp 2-component vector of uint)
 0:?           findLSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:136      Sequence
-0:136        move second child to first child ( temp 2-component vector of float)
-0:136          'r033' ( temp 2-component vector of float)
-0:136          Floor ( temp 2-component vector of float)
-0:136            'inF0' ( in 2-component vector of float)
-0:138      Sequence
-0:138        move second child to first child ( temp 2-component vector of float)
-0:138          'r035' ( temp 2-component vector of float)
-0:138          mod ( temp 2-component vector of float)
-0:138            'inF0' ( in 2-component vector of float)
-0:138            'inF1' ( in 2-component vector of float)
+0:137      Sequence
+0:137        move second child to first child ( temp 2-component vector of float)
+0:137          'r033' ( temp 2-component vector of float)
+0:137          Floor ( temp 2-component vector of float)
+0:137            'inF0' ( in 2-component vector of float)
 0:139      Sequence
 0:139        move second child to first child ( temp 2-component vector of float)
-0:139          'r036' ( temp 2-component vector of float)
-0:139          Fraction ( temp 2-component vector of float)
+0:139          'r035' ( temp 2-component vector of float)
+0:139          mod ( temp 2-component vector of float)
 0:139            'inF0' ( in 2-component vector of float)
+0:139            'inF1' ( in 2-component vector of float)
 0:140      Sequence
 0:140        move second child to first child ( temp 2-component vector of float)
-0:140          'r038' ( temp 2-component vector of float)
-0:140          fwidth ( temp 2-component vector of float)
+0:140          'r036' ( temp 2-component vector of float)
+0:140          Fraction ( temp 2-component vector of float)
 0:140            'inF0' ( in 2-component vector of float)
 0:141      Sequence
-0:141        move second child to first child ( temp 2-component vector of bool)
-0:141          'r039' ( temp 2-component vector of bool)
-0:141          isinf ( temp 2-component vector of bool)
+0:141        move second child to first child ( temp 2-component vector of float)
+0:141          'r038' ( temp 2-component vector of float)
+0:141          fwidth ( temp 2-component vector of float)
 0:141            'inF0' ( in 2-component vector of float)
 0:142      Sequence
 0:142        move second child to first child ( temp 2-component vector of bool)
-0:142          'r040' ( temp 2-component vector of bool)
-0:142          isnan ( temp 2-component vector of bool)
+0:142          'r039' ( temp 2-component vector of bool)
+0:142          isinf ( temp 2-component vector of bool)
 0:142            'inF0' ( in 2-component vector of float)
 0:143      Sequence
-0:143        move second child to first child ( temp 2-component vector of float)
-0:143          'r041' ( temp 2-component vector of float)
-0:143          ldexp ( temp 2-component vector of float)
+0:143        move second child to first child ( temp 2-component vector of bool)
+0:143          'r040' ( temp 2-component vector of bool)
+0:143          isnan ( temp 2-component vector of bool)
 0:143            'inF0' ( in 2-component vector of float)
-0:143            'inF1' ( in 2-component vector of float)
 0:144      Sequence
 0:144        move second child to first child ( temp 2-component vector of float)
-0:144          'r039a' ( temp 2-component vector of float)
-0:144          mix ( temp 2-component vector of float)
+0:144          'r041' ( temp 2-component vector of float)
+0:144          ldexp ( temp 2-component vector of float)
 0:144            'inF0' ( in 2-component vector of float)
 0:144            'inF1' ( in 2-component vector of float)
-0:144            'inF2' ( in 2-component vector of float)
 0:145      Sequence
-0:145        move second child to first child ( temp float)
-0:145          'r042' ( temp float)
-0:145          length ( temp float)
+0:145        move second child to first child ( temp 2-component vector of float)
+0:145          'r039a' ( temp 2-component vector of float)
+0:145          mix ( temp 2-component vector of float)
 0:145            'inF0' ( in 2-component vector of float)
+0:145            'inF1' ( in 2-component vector of float)
+0:145            'inF2' ( in 2-component vector of float)
 0:146      Sequence
-0:146        move second child to first child ( temp 2-component vector of float)
-0:146          'r043' ( temp 2-component vector of float)
-0:146          log ( temp 2-component vector of float)
+0:146        move second child to first child ( temp float)
+0:146          'r042' ( temp float)
+0:146          length ( temp float)
 0:146            'inF0' ( in 2-component vector of float)
 0:147      Sequence
 0:147        move second child to first child ( temp 2-component vector of float)
-0:147          'r044' ( temp 2-component vector of float)
-0:147          vector-scale ( temp 2-component vector of float)
-0:147            log2 ( temp 2-component vector of float)
-0:147              'inF0' ( in 2-component vector of float)
-0:147            Constant:
-0:147              0.301030
+0:147          'r043' ( temp 2-component vector of float)
+0:147          log ( temp 2-component vector of float)
+0:147            'inF0' ( in 2-component vector of float)
 0:148      Sequence
 0:148        move second child to first child ( temp 2-component vector of float)
-0:148          'r045' ( temp 2-component vector of float)
-0:148          log2 ( temp 2-component vector of float)
-0:148            'inF0' ( in 2-component vector of float)
+0:148          'r044' ( temp 2-component vector of float)
+0:148          vector-scale ( temp 2-component vector of float)
+0:148            log2 ( temp 2-component vector of float)
+0:148              'inF0' ( in 2-component vector of float)
+0:148            Constant:
+0:148              0.301030
 0:149      Sequence
 0:149        move second child to first child ( temp 2-component vector of float)
-0:149          'r046' ( temp 2-component vector of float)
-0:149          max ( temp 2-component vector of float)
+0:149          'r045' ( temp 2-component vector of float)
+0:149          log2 ( temp 2-component vector of float)
 0:149            'inF0' ( in 2-component vector of float)
-0:149            'inF1' ( in 2-component vector of float)
 0:150      Sequence
 0:150        move second child to first child ( temp 2-component vector of float)
-0:150          'r047' ( temp 2-component vector of float)
-0:150          min ( temp 2-component vector of float)
+0:150          'r046' ( temp 2-component vector of float)
+0:150          max ( temp 2-component vector of float)
 0:150            'inF0' ( in 2-component vector of float)
 0:150            'inF1' ( in 2-component vector of float)
 0:151      Sequence
 0:151        move second child to first child ( temp 2-component vector of float)
-0:151          'r048' ( temp 2-component vector of float)
-0:151          normalize ( temp 2-component vector of float)
+0:151          'r047' ( temp 2-component vector of float)
+0:151          min ( temp 2-component vector of float)
 0:151            'inF0' ( in 2-component vector of float)
+0:151            'inF1' ( in 2-component vector of float)
 0:152      Sequence
 0:152        move second child to first child ( temp 2-component vector of float)
-0:152          'r049' ( temp 2-component vector of float)
-0:152          pow ( temp 2-component vector of float)
+0:152          'r048' ( temp 2-component vector of float)
+0:152          normalize ( temp 2-component vector of float)
 0:152            'inF0' ( in 2-component vector of float)
-0:152            'inF1' ( in 2-component vector of float)
 0:153      Sequence
 0:153        move second child to first child ( temp 2-component vector of float)
-0:153          'r050' ( temp 2-component vector of float)
-0:153          radians ( temp 2-component vector of float)
+0:153          'r049' ( temp 2-component vector of float)
+0:153          pow ( temp 2-component vector of float)
 0:153            'inF0' ( in 2-component vector of float)
+0:153            'inF1' ( in 2-component vector of float)
 0:154      Sequence
 0:154        move second child to first child ( temp 2-component vector of float)
-0:154          'r051' ( temp 2-component vector of float)
-0:154          divide ( temp 2-component vector of float)
-0:154            Constant:
-0:154              1.000000
+0:154          'r050' ( temp 2-component vector of float)
+0:154          radians ( temp 2-component vector of float)
 0:154            'inF0' ( in 2-component vector of float)
 0:155      Sequence
 0:155        move second child to first child ( temp 2-component vector of float)
-0:155          'r052' ( temp 2-component vector of float)
-0:155          reflect ( temp 2-component vector of float)
+0:155          'r051' ( temp 2-component vector of float)
+0:155          divide ( temp 2-component vector of float)
+0:155            Constant:
+0:155              1.000000
 0:155            'inF0' ( in 2-component vector of float)
-0:155            'inF1' ( in 2-component vector of float)
 0:156      Sequence
 0:156        move second child to first child ( temp 2-component vector of float)
-0:156          'r053' ( temp 2-component vector of float)
-0:156          refract ( temp 2-component vector of float)
+0:156          'r052' ( temp 2-component vector of float)
+0:156          reflect ( temp 2-component vector of float)
 0:156            'inF0' ( in 2-component vector of float)
 0:156            'inF1' ( in 2-component vector of float)
-0:156            Constant:
-0:156              2.000000
 0:157      Sequence
-0:157        move second child to first child ( temp 2-component vector of uint)
-0:157          'r054' ( temp 2-component vector of uint)
+0:157        move second child to first child ( temp 2-component vector of float)
+0:157          'r053' ( temp 2-component vector of float)
+0:157          refract ( temp 2-component vector of float)
+0:157            'inF0' ( in 2-component vector of float)
+0:157            'inF1' ( in 2-component vector of float)
+0:157            Constant:
+0:157              2.000000
+0:158      Sequence
+0:158        move second child to first child ( temp 2-component vector of uint)
+0:158          'r054' ( temp 2-component vector of uint)
 0:?           bitFieldReverse ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
-0:158      Sequence
-0:158        move second child to first child ( temp 2-component vector of float)
-0:158          'r055' ( temp 2-component vector of float)
-0:158          roundEven ( temp 2-component vector of float)
-0:158            'inF0' ( in 2-component vector of float)
 0:159      Sequence
 0:159        move second child to first child ( temp 2-component vector of float)
-0:159          'r056' ( temp 2-component vector of float)
-0:159          inverse sqrt ( temp 2-component vector of float)
+0:159          'r055' ( temp 2-component vector of float)
+0:159          roundEven ( temp 2-component vector of float)
 0:159            'inF0' ( in 2-component vector of float)
 0:160      Sequence
 0:160        move second child to first child ( temp 2-component vector of float)
-0:160          'r057' ( temp 2-component vector of float)
-0:160          clamp ( temp 2-component vector of float)
+0:160          'r056' ( temp 2-component vector of float)
+0:160          inverse sqrt ( temp 2-component vector of float)
 0:160            'inF0' ( in 2-component vector of float)
-0:160            Constant:
-0:160              0.000000
-0:160            Constant:
-0:160              1.000000
 0:161      Sequence
 0:161        move second child to first child ( temp 2-component vector of float)
-0:161          'r058' ( temp 2-component vector of float)
-0:161          Sign ( temp 2-component vector of float)
+0:161          'r057' ( temp 2-component vector of float)
+0:161          clamp ( temp 2-component vector of float)
 0:161            'inF0' ( in 2-component vector of float)
+0:161            Constant:
+0:161              0.000000
+0:161            Constant:
+0:161              1.000000
 0:162      Sequence
 0:162        move second child to first child ( temp 2-component vector of float)
-0:162          'r059' ( temp 2-component vector of float)
-0:162          sine ( temp 2-component vector of float)
+0:162          'r058' ( temp 2-component vector of float)
+0:162          Sign ( temp 2-component vector of float)
 0:162            'inF0' ( in 2-component vector of float)
 0:163      Sequence
 0:163        move second child to first child ( temp 2-component vector of float)
-0:163          'inF1' ( in 2-component vector of float)
+0:163          'r059' ( temp 2-component vector of float)
 0:163          sine ( temp 2-component vector of float)
 0:163            'inF0' ( in 2-component vector of float)
-0:163        move second child to first child ( temp 2-component vector of float)
-0:163          'inF2' ( in 2-component vector of float)
-0:163          cosine ( temp 2-component vector of float)
-0:163            'inF0' ( in 2-component vector of float)
 0:164      Sequence
 0:164        move second child to first child ( temp 2-component vector of float)
-0:164          'r060' ( temp 2-component vector of float)
-0:164          hyp. sine ( temp 2-component vector of float)
+0:164          'inF1' ( in 2-component vector of float)
+0:164          sine ( temp 2-component vector of float)
+0:164            'inF0' ( in 2-component vector of float)
+0:164        move second child to first child ( temp 2-component vector of float)
+0:164          'inF2' ( in 2-component vector of float)
+0:164          cosine ( temp 2-component vector of float)
 0:164            'inF0' ( in 2-component vector of float)
 0:165      Sequence
 0:165        move second child to first child ( temp 2-component vector of float)
-0:165          'r061' ( temp 2-component vector of float)
-0:165          smoothstep ( temp 2-component vector of float)
+0:165          'r060' ( temp 2-component vector of float)
+0:165          hyp. sine ( temp 2-component vector of float)
 0:165            'inF0' ( in 2-component vector of float)
-0:165            'inF1' ( in 2-component vector of float)
-0:165            'inF2' ( in 2-component vector of float)
 0:166      Sequence
 0:166        move second child to first child ( temp 2-component vector of float)
-0:166          'r062' ( temp 2-component vector of float)
-0:166          sqrt ( temp 2-component vector of float)
+0:166          'r061' ( temp 2-component vector of float)
+0:166          smoothstep ( temp 2-component vector of float)
 0:166            'inF0' ( in 2-component vector of float)
+0:166            'inF1' ( in 2-component vector of float)
+0:166            'inF2' ( in 2-component vector of float)
 0:167      Sequence
 0:167        move second child to first child ( temp 2-component vector of float)
-0:167          'r063' ( temp 2-component vector of float)
-0:167          step ( temp 2-component vector of float)
+0:167          'r062' ( temp 2-component vector of float)
+0:167          sqrt ( temp 2-component vector of float)
 0:167            'inF0' ( in 2-component vector of float)
-0:167            'inF1' ( in 2-component vector of float)
 0:168      Sequence
 0:168        move second child to first child ( temp 2-component vector of float)
-0:168          'r064' ( temp 2-component vector of float)
-0:168          tangent ( temp 2-component vector of float)
+0:168          'r063' ( temp 2-component vector of float)
+0:168          step ( temp 2-component vector of float)
 0:168            'inF0' ( in 2-component vector of float)
+0:168            'inF1' ( in 2-component vector of float)
 0:169      Sequence
 0:169        move second child to first child ( temp 2-component vector of float)
-0:169          'r065' ( temp 2-component vector of float)
-0:169          hyp. tangent ( temp 2-component vector of float)
+0:169          'r064' ( temp 2-component vector of float)
+0:169          tangent ( temp 2-component vector of float)
 0:169            'inF0' ( in 2-component vector of float)
-0:171      Sequence
-0:171        move second child to first child ( temp 2-component vector of float)
-0:171          'r066' ( temp 2-component vector of float)
-0:171          trunc ( temp 2-component vector of float)
-0:171            'inF0' ( in 2-component vector of float)
-0:174      Branch: Return with expression
+0:170      Sequence
+0:170        move second child to first child ( temp 2-component vector of float)
+0:170          'r065' ( temp 2-component vector of float)
+0:170          hyp. tangent ( temp 2-component vector of float)
+0:170            'inF0' ( in 2-component vector of float)
+0:172      Sequence
+0:172        move second child to first child ( temp 2-component vector of float)
+0:172          'r066' ( temp 2-component vector of float)
+0:172          trunc ( temp 2-component vector of float)
+0:172            'inF0' ( in 2-component vector of float)
+0:175      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:178  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
-0:178    Function Parameters: 
-0:178      'inF0' ( in 3-component vector of float)
-0:178      'inF1' ( in 3-component vector of float)
-0:178      'inF2' ( in 3-component vector of float)
-0:178      'inU0' ( in 3-component vector of uint)
-0:178      'inU1' ( in 3-component vector of uint)
+0:179  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
+0:179    Function Parameters: 
+0:179      'inF0' ( in 3-component vector of float)
+0:179      'inF1' ( in 3-component vector of float)
+0:179      'inF2' ( in 3-component vector of float)
+0:179      'inU0' ( in 3-component vector of uint)
+0:179      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
-0:181      Sequence
-0:181        move second child to first child ( temp bool)
-0:181          'r000' ( temp bool)
-0:181          all ( temp bool)
-0:181            Convert float to bool ( temp 3-component vector of bool)
-0:181              'inF0' ( in 3-component vector of float)
 0:182      Sequence
-0:182        move second child to first child ( temp 3-component vector of float)
-0:182          'r001' ( temp 3-component vector of float)
-0:182          Absolute value ( temp 3-component vector of float)
-0:182            'inF0' ( in 3-component vector of float)
+0:182        move second child to first child ( temp bool)
+0:182          'r000' ( temp bool)
+0:182          all ( temp bool)
+0:182            Convert float to bool ( temp 3-component vector of bool)
+0:182              'inF0' ( in 3-component vector of float)
 0:183      Sequence
 0:183        move second child to first child ( temp 3-component vector of float)
-0:183          'r002' ( temp 3-component vector of float)
-0:183          arc cosine ( temp 3-component vector of float)
+0:183          'r001' ( temp 3-component vector of float)
+0:183          Absolute value ( temp 3-component vector of float)
 0:183            'inF0' ( in 3-component vector of float)
 0:184      Sequence
-0:184        move second child to first child ( temp bool)
-0:184          'r003' ( temp bool)
-0:184          any ( temp bool)
-0:184            Convert float to bool ( temp 3-component vector of bool)
-0:184              'inF0' ( in 3-component vector of float)
+0:184        move second child to first child ( temp 3-component vector of float)
+0:184          'r002' ( temp 3-component vector of float)
+0:184          arc cosine ( temp 3-component vector of float)
+0:184            'inF0' ( in 3-component vector of float)
 0:185      Sequence
-0:185        move second child to first child ( temp 3-component vector of float)
-0:185          'r004' ( temp 3-component vector of float)
-0:185          arc sine ( temp 3-component vector of float)
-0:185            'inF0' ( in 3-component vector of float)
+0:185        move second child to first child ( temp bool)
+0:185          'r003' ( temp bool)
+0:185          any ( temp bool)
+0:185            Convert float to bool ( temp 3-component vector of bool)
+0:185              'inF0' ( in 3-component vector of float)
 0:186      Sequence
-0:186        move second child to first child ( temp 3-component vector of int)
-0:186          'r005' ( temp 3-component vector of int)
-0:186          floatBitsToInt ( temp 3-component vector of int)
+0:186        move second child to first child ( temp 3-component vector of float)
+0:186          'r004' ( temp 3-component vector of float)
+0:186          arc sine ( temp 3-component vector of float)
 0:186            'inF0' ( in 3-component vector of float)
 0:187      Sequence
-0:187        move second child to first child ( temp 3-component vector of uint)
-0:187          'r006' ( temp 3-component vector of uint)
-0:187          floatBitsToUint ( temp 3-component vector of uint)
+0:187        move second child to first child ( temp 3-component vector of int)
+0:187          'r005' ( temp 3-component vector of int)
+0:187          floatBitsToInt ( temp 3-component vector of int)
 0:187            'inF0' ( in 3-component vector of float)
 0:188      Sequence
-0:188        move second child to first child ( temp 3-component vector of float)
-0:188          'r007' ( temp 3-component vector of float)
-0:188          intBitsToFloat ( temp 3-component vector of float)
-0:188            'inU0' ( in 3-component vector of uint)
-0:190      Sequence
-0:190        move second child to first child ( temp 3-component vector of float)
-0:190          'r009' ( temp 3-component vector of float)
-0:190          arc tangent ( temp 3-component vector of float)
-0:190            'inF0' ( in 3-component vector of float)
+0:188        move second child to first child ( temp 3-component vector of uint)
+0:188          'r006' ( temp 3-component vector of uint)
+0:188          floatBitsToUint ( temp 3-component vector of uint)
+0:188            'inF0' ( in 3-component vector of float)
+0:189      Sequence
+0:189        move second child to first child ( temp 3-component vector of float)
+0:189          'r007' ( temp 3-component vector of float)
+0:189          intBitsToFloat ( temp 3-component vector of float)
+0:189            'inU0' ( in 3-component vector of uint)
 0:191      Sequence
 0:191        move second child to first child ( temp 3-component vector of float)
-0:191          'r010' ( temp 3-component vector of float)
+0:191          'r009' ( temp 3-component vector of float)
 0:191          arc tangent ( temp 3-component vector of float)
 0:191            'inF0' ( in 3-component vector of float)
-0:191            'inF1' ( in 3-component vector of float)
 0:192      Sequence
 0:192        move second child to first child ( temp 3-component vector of float)
-0:192          'r011' ( temp 3-component vector of float)
-0:192          Ceiling ( temp 3-component vector of float)
+0:192          'r010' ( temp 3-component vector of float)
+0:192          arc tangent ( temp 3-component vector of float)
 0:192            'inF0' ( in 3-component vector of float)
+0:192            'inF1' ( in 3-component vector of float)
 0:193      Sequence
 0:193        move second child to first child ( temp 3-component vector of float)
-0:193          'r012' ( temp 3-component vector of float)
-0:193          clamp ( temp 3-component vector of float)
+0:193          'r011' ( temp 3-component vector of float)
+0:193          Ceiling ( temp 3-component vector of float)
 0:193            'inF0' ( in 3-component vector of float)
-0:193            'inF1' ( in 3-component vector of float)
-0:193            'inF2' ( in 3-component vector of float)
-0:194      Test condition and select ( temp void)
-0:194        Condition
-0:194        any ( temp bool)
-0:194          Compare Less Than ( temp 3-component vector of bool)
+0:194      Sequence
+0:194        move second child to first child ( temp 3-component vector of float)
+0:194          'r012' ( temp 3-component vector of float)
+0:194          clamp ( temp 3-component vector of float)
 0:194            'inF0' ( in 3-component vector of float)
-0:194            Constant:
-0:194              0.000000
-0:194              0.000000
-0:194              0.000000
-0:194        true case
-0:194        Branch: Kill
+0:194            'inF1' ( in 3-component vector of float)
+0:194            'inF2' ( in 3-component vector of float)
 0:195      Test condition and select ( temp void)
 0:195        Condition
 0:195        any ( temp bool)
 0:195          Compare Less Than ( temp 3-component vector of bool)
-0:195            'inU0' ( in 3-component vector of uint)
+0:195            'inF0' ( in 3-component vector of float)
 0:195            Constant:
 0:195              0.000000
 0:195              0.000000
 0:195              0.000000
 0:195        true case
 0:195        Branch: Kill
-0:196      Sequence
-0:196        move second child to first child ( temp 3-component vector of float)
-0:196          'r013' ( temp 3-component vector of float)
-0:196          cosine ( temp 3-component vector of float)
-0:196            'inF0' ( in 3-component vector of float)
+0:196      Test condition and select ( temp void)
+0:196        Condition
+0:196        any ( temp bool)
+0:196          Compare Less Than ( temp 3-component vector of bool)
+0:196            'inU0' ( in 3-component vector of uint)
+0:196            Constant:
+0:196              0.000000
+0:196              0.000000
+0:196              0.000000
+0:196        true case
+0:196        Branch: Kill
 0:197      Sequence
 0:197        move second child to first child ( temp 3-component vector of float)
-0:197          'r014' ( temp 3-component vector of float)
-0:197          hyp. cosine ( temp 3-component vector of float)
+0:197          'r013' ( temp 3-component vector of float)
+0:197          cosine ( temp 3-component vector of float)
 0:197            'inF0' ( in 3-component vector of float)
 0:198      Sequence
-0:198        move second child to first child ( temp 3-component vector of uint)
-0:198          'r015' ( temp 3-component vector of uint)
+0:198        move second child to first child ( temp 3-component vector of float)
+0:198          'r014' ( temp 3-component vector of float)
+0:198          hyp. cosine ( temp 3-component vector of float)
+0:198            'inF0' ( in 3-component vector of float)
+0:199      Sequence
+0:199        move second child to first child ( temp 3-component vector of uint)
+0:199          'r015' ( temp 3-component vector of uint)
 0:?           bitCount ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
-0:199      Sequence
-0:199        move second child to first child ( temp 3-component vector of float)
-0:199          'r016' ( temp 3-component vector of float)
-0:199          cross-product ( temp 3-component vector of float)
-0:199            'inF0' ( in 3-component vector of float)
-0:199            'inF1' ( in 3-component vector of float)
 0:200      Sequence
 0:200        move second child to first child ( temp 3-component vector of float)
-0:200          'r017' ( temp 3-component vector of float)
-0:200          dPdx ( temp 3-component vector of float)
+0:200          'r016' ( temp 3-component vector of float)
+0:200          cross-product ( temp 3-component vector of float)
 0:200            'inF0' ( in 3-component vector of float)
+0:200            'inF1' ( in 3-component vector of float)
 0:201      Sequence
 0:201        move second child to first child ( temp 3-component vector of float)
-0:201          'r018' ( temp 3-component vector of float)
-0:201          dPdxCoarse ( temp 3-component vector of float)
+0:201          'r017' ( temp 3-component vector of float)
+0:201          dPdx ( temp 3-component vector of float)
 0:201            'inF0' ( in 3-component vector of float)
 0:202      Sequence
 0:202        move second child to first child ( temp 3-component vector of float)
-0:202          'r019' ( temp 3-component vector of float)
-0:202          dPdxFine ( temp 3-component vector of float)
+0:202          'r018' ( temp 3-component vector of float)
+0:202          dPdxCoarse ( temp 3-component vector of float)
 0:202            'inF0' ( in 3-component vector of float)
 0:203      Sequence
 0:203        move second child to first child ( temp 3-component vector of float)
-0:203          'r020' ( temp 3-component vector of float)
-0:203          dPdy ( temp 3-component vector of float)
+0:203          'r019' ( temp 3-component vector of float)
+0:203          dPdxFine ( temp 3-component vector of float)
 0:203            'inF0' ( in 3-component vector of float)
 0:204      Sequence
 0:204        move second child to first child ( temp 3-component vector of float)
-0:204          'r021' ( temp 3-component vector of float)
-0:204          dPdyCoarse ( temp 3-component vector of float)
+0:204          'r020' ( temp 3-component vector of float)
+0:204          dPdy ( temp 3-component vector of float)
 0:204            'inF0' ( in 3-component vector of float)
 0:205      Sequence
 0:205        move second child to first child ( temp 3-component vector of float)
-0:205          'r022' ( temp 3-component vector of float)
-0:205          dPdyFine ( temp 3-component vector of float)
+0:205          'r021' ( temp 3-component vector of float)
+0:205          dPdyCoarse ( temp 3-component vector of float)
 0:205            'inF0' ( in 3-component vector of float)
 0:206      Sequence
 0:206        move second child to first child ( temp 3-component vector of float)
-0:206          'r023' ( temp 3-component vector of float)
-0:206          degrees ( temp 3-component vector of float)
+0:206          'r022' ( temp 3-component vector of float)
+0:206          dPdyFine ( temp 3-component vector of float)
 0:206            'inF0' ( in 3-component vector of float)
 0:207      Sequence
-0:207        move second child to first child ( temp float)
-0:207          'r024' ( temp float)
-0:207          distance ( temp float)
+0:207        move second child to first child ( temp 3-component vector of float)
+0:207          'r023' ( temp 3-component vector of float)
+0:207          degrees ( temp 3-component vector of float)
 0:207            'inF0' ( in 3-component vector of float)
-0:207            'inF1' ( in 3-component vector of float)
 0:208      Sequence
 0:208        move second child to first child ( temp float)
-0:208          'r025' ( temp float)
-0:208          dot-product ( temp float)
+0:208          'r024' ( temp float)
+0:208          distance ( temp float)
 0:208            'inF0' ( in 3-component vector of float)
 0:208            'inF1' ( in 3-component vector of float)
-0:212      Sequence
-0:212        move second child to first child ( temp 3-component vector of float)
-0:212          'r029' ( temp 3-component vector of float)
-0:212          exp ( temp 3-component vector of float)
-0:212            'inF0' ( in 3-component vector of float)
+0:209      Sequence
+0:209        move second child to first child ( temp float)
+0:209          'r025' ( temp float)
+0:209          dot-product ( temp float)
+0:209            'inF0' ( in 3-component vector of float)
+0:209            'inF1' ( in 3-component vector of float)
 0:213      Sequence
 0:213        move second child to first child ( temp 3-component vector of float)
-0:213          'r030' ( temp 3-component vector of float)
-0:213          exp2 ( temp 3-component vector of float)
+0:213          'r029' ( temp 3-component vector of float)
+0:213          exp ( temp 3-component vector of float)
 0:213            'inF0' ( in 3-component vector of float)
 0:214      Sequence
 0:214        move second child to first child ( temp 3-component vector of float)
-0:214          'r031' ( temp 3-component vector of float)
-0:214          face-forward ( temp 3-component vector of float)
+0:214          'r030' ( temp 3-component vector of float)
+0:214          exp2 ( temp 3-component vector of float)
 0:214            'inF0' ( in 3-component vector of float)
-0:214            'inF1' ( in 3-component vector of float)
-0:214            'inF2' ( in 3-component vector of float)
 0:215      Sequence
-0:215        move second child to first child ( temp 3-component vector of uint)
-0:215          'r032' ( temp 3-component vector of uint)
+0:215        move second child to first child ( temp 3-component vector of float)
+0:215          'r031' ( temp 3-component vector of float)
+0:215          face-forward ( temp 3-component vector of float)
+0:215            'inF0' ( in 3-component vector of float)
+0:215            'inF1' ( in 3-component vector of float)
+0:215            'inF2' ( in 3-component vector of float)
+0:216      Sequence
+0:216        move second child to first child ( temp 3-component vector of uint)
+0:216          'r032' ( temp 3-component vector of uint)
 0:?           findMSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:216      Sequence
-0:216        move second child to first child ( temp 3-component vector of uint)
-0:216          'r033' ( temp 3-component vector of uint)
+0:217      Sequence
+0:217        move second child to first child ( temp 3-component vector of uint)
+0:217          'r033' ( temp 3-component vector of uint)
 0:?           findLSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:217      Sequence
-0:217        move second child to first child ( temp 3-component vector of float)
-0:217          'r034' ( temp 3-component vector of float)
-0:217          Floor ( temp 3-component vector of float)
-0:217            'inF0' ( in 3-component vector of float)
-0:219      Sequence
-0:219        move second child to first child ( temp 3-component vector of float)
-0:219          'r036' ( temp 3-component vector of float)
-0:219          mod ( temp 3-component vector of float)
-0:219            'inF0' ( in 3-component vector of float)
-0:219            'inF1' ( in 3-component vector of float)
+0:218      Sequence
+0:218        move second child to first child ( temp 3-component vector of float)
+0:218          'r034' ( temp 3-component vector of float)
+0:218          Floor ( temp 3-component vector of float)
+0:218            'inF0' ( in 3-component vector of float)
 0:220      Sequence
 0:220        move second child to first child ( temp 3-component vector of float)
-0:220          'r037' ( temp 3-component vector of float)
-0:220          Fraction ( temp 3-component vector of float)
+0:220          'r036' ( temp 3-component vector of float)
+0:220          mod ( temp 3-component vector of float)
 0:220            'inF0' ( in 3-component vector of float)
+0:220            'inF1' ( in 3-component vector of float)
 0:221      Sequence
 0:221        move second child to first child ( temp 3-component vector of float)
-0:221          'r039' ( temp 3-component vector of float)
-0:221          fwidth ( temp 3-component vector of float)
+0:221          'r037' ( temp 3-component vector of float)
+0:221          Fraction ( temp 3-component vector of float)
 0:221            'inF0' ( in 3-component vector of float)
 0:222      Sequence
-0:222        move second child to first child ( temp 3-component vector of bool)
-0:222          'r040' ( temp 3-component vector of bool)
-0:222          isinf ( temp 3-component vector of bool)
+0:222        move second child to first child ( temp 3-component vector of float)
+0:222          'r039' ( temp 3-component vector of float)
+0:222          fwidth ( temp 3-component vector of float)
 0:222            'inF0' ( in 3-component vector of float)
 0:223      Sequence
 0:223        move second child to first child ( temp 3-component vector of bool)
-0:223          'r041' ( temp 3-component vector of bool)
-0:223          isnan ( temp 3-component vector of bool)
+0:223          'r040' ( temp 3-component vector of bool)
+0:223          isinf ( temp 3-component vector of bool)
 0:223            'inF0' ( in 3-component vector of float)
 0:224      Sequence
-0:224        move second child to first child ( temp 3-component vector of float)
-0:224          'r042' ( temp 3-component vector of float)
-0:224          ldexp ( temp 3-component vector of float)
+0:224        move second child to first child ( temp 3-component vector of bool)
+0:224          'r041' ( temp 3-component vector of bool)
+0:224          isnan ( temp 3-component vector of bool)
 0:224            'inF0' ( in 3-component vector of float)
-0:224            'inF1' ( in 3-component vector of float)
 0:225      Sequence
 0:225        move second child to first child ( temp 3-component vector of float)
-0:225          'r039a' ( temp 3-component vector of float)
-0:225          mix ( temp 3-component vector of float)
+0:225          'r042' ( temp 3-component vector of float)
+0:225          ldexp ( temp 3-component vector of float)
 0:225            'inF0' ( in 3-component vector of float)
 0:225            'inF1' ( in 3-component vector of float)
-0:225            'inF2' ( in 3-component vector of float)
 0:226      Sequence
 0:226        move second child to first child ( temp 3-component vector of float)
-0:226          'r039b' ( temp 3-component vector of float)
+0:226          'r039a' ( temp 3-component vector of float)
 0:226          mix ( temp 3-component vector of float)
 0:226            'inF0' ( in 3-component vector of float)
 0:226            'inF1' ( in 3-component vector of float)
-0:226            Constant:
-0:226              0.300000
+0:226            'inF2' ( in 3-component vector of float)
 0:227      Sequence
-0:227        move second child to first child ( temp float)
-0:227          'r043' ( temp float)
-0:227          length ( temp float)
+0:227        move second child to first child ( temp 3-component vector of float)
+0:227          'r039b' ( temp 3-component vector of float)
+0:227          mix ( temp 3-component vector of float)
 0:227            'inF0' ( in 3-component vector of float)
+0:227            'inF1' ( in 3-component vector of float)
+0:227            Constant:
+0:227              0.300000
 0:228      Sequence
-0:228        move second child to first child ( temp 3-component vector of float)
-0:228          'r044' ( temp 3-component vector of float)
-0:228          log ( temp 3-component vector of float)
+0:228        move second child to first child ( temp float)
+0:228          'r043' ( temp float)
+0:228          length ( temp float)
 0:228            'inF0' ( in 3-component vector of float)
 0:229      Sequence
 0:229        move second child to first child ( temp 3-component vector of float)
-0:229          'r045' ( temp 3-component vector of float)
-0:229          vector-scale ( temp 3-component vector of float)
-0:229            log2 ( temp 3-component vector of float)
-0:229              'inF0' ( in 3-component vector of float)
-0:229            Constant:
-0:229              0.301030
+0:229          'r044' ( temp 3-component vector of float)
+0:229          log ( temp 3-component vector of float)
+0:229            'inF0' ( in 3-component vector of float)
 0:230      Sequence
 0:230        move second child to first child ( temp 3-component vector of float)
-0:230          'r046' ( temp 3-component vector of float)
-0:230          log2 ( temp 3-component vector of float)
-0:230            'inF0' ( in 3-component vector of float)
+0:230          'r045' ( temp 3-component vector of float)
+0:230          vector-scale ( temp 3-component vector of float)
+0:230            log2 ( temp 3-component vector of float)
+0:230              'inF0' ( in 3-component vector of float)
+0:230            Constant:
+0:230              0.301030
 0:231      Sequence
 0:231        move second child to first child ( temp 3-component vector of float)
-0:231          'r047' ( temp 3-component vector of float)
-0:231          max ( temp 3-component vector of float)
+0:231          'r046' ( temp 3-component vector of float)
+0:231          log2 ( temp 3-component vector of float)
 0:231            'inF0' ( in 3-component vector of float)
-0:231            'inF1' ( in 3-component vector of float)
 0:232      Sequence
 0:232        move second child to first child ( temp 3-component vector of float)
-0:232          'r048' ( temp 3-component vector of float)
-0:232          min ( temp 3-component vector of float)
+0:232          'r047' ( temp 3-component vector of float)
+0:232          max ( temp 3-component vector of float)
 0:232            'inF0' ( in 3-component vector of float)
 0:232            'inF1' ( in 3-component vector of float)
 0:233      Sequence
 0:233        move second child to first child ( temp 3-component vector of float)
-0:233          'r049' ( temp 3-component vector of float)
-0:233          normalize ( temp 3-component vector of float)
+0:233          'r048' ( temp 3-component vector of float)
+0:233          min ( temp 3-component vector of float)
 0:233            'inF0' ( in 3-component vector of float)
+0:233            'inF1' ( in 3-component vector of float)
 0:234      Sequence
 0:234        move second child to first child ( temp 3-component vector of float)
-0:234          'r050' ( temp 3-component vector of float)
-0:234          pow ( temp 3-component vector of float)
+0:234          'r049' ( temp 3-component vector of float)
+0:234          normalize ( temp 3-component vector of float)
 0:234            'inF0' ( in 3-component vector of float)
-0:234            'inF1' ( in 3-component vector of float)
 0:235      Sequence
 0:235        move second child to first child ( temp 3-component vector of float)
-0:235          'r051' ( temp 3-component vector of float)
-0:235          radians ( temp 3-component vector of float)
+0:235          'r050' ( temp 3-component vector of float)
+0:235          pow ( temp 3-component vector of float)
 0:235            'inF0' ( in 3-component vector of float)
+0:235            'inF1' ( in 3-component vector of float)
 0:236      Sequence
 0:236        move second child to first child ( temp 3-component vector of float)
-0:236          'r052' ( temp 3-component vector of float)
-0:236          divide ( temp 3-component vector of float)
-0:236            Constant:
-0:236              1.000000
+0:236          'r051' ( temp 3-component vector of float)
+0:236          radians ( temp 3-component vector of float)
 0:236            'inF0' ( in 3-component vector of float)
 0:237      Sequence
 0:237        move second child to first child ( temp 3-component vector of float)
-0:237          'r053' ( temp 3-component vector of float)
-0:237          reflect ( temp 3-component vector of float)
+0:237          'r052' ( temp 3-component vector of float)
+0:237          divide ( temp 3-component vector of float)
+0:237            Constant:
+0:237              1.000000
 0:237            'inF0' ( in 3-component vector of float)
-0:237            'inF1' ( in 3-component vector of float)
 0:238      Sequence
 0:238        move second child to first child ( temp 3-component vector of float)
-0:238          'r054' ( temp 3-component vector of float)
-0:238          refract ( temp 3-component vector of float)
+0:238          'r053' ( temp 3-component vector of float)
+0:238          reflect ( temp 3-component vector of float)
 0:238            'inF0' ( in 3-component vector of float)
 0:238            'inF1' ( in 3-component vector of float)
-0:238            Constant:
-0:238              2.000000
 0:239      Sequence
-0:239        move second child to first child ( temp 3-component vector of uint)
-0:239          'r055' ( temp 3-component vector of uint)
+0:239        move second child to first child ( temp 3-component vector of float)
+0:239          'r054' ( temp 3-component vector of float)
+0:239          refract ( temp 3-component vector of float)
+0:239            'inF0' ( in 3-component vector of float)
+0:239            'inF1' ( in 3-component vector of float)
+0:239            Constant:
+0:239              2.000000
+0:240      Sequence
+0:240        move second child to first child ( temp 3-component vector of uint)
+0:240          'r055' ( temp 3-component vector of uint)
 0:?           bitFieldReverse ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
-0:240      Sequence
-0:240        move second child to first child ( temp 3-component vector of float)
-0:240          'r056' ( temp 3-component vector of float)
-0:240          roundEven ( temp 3-component vector of float)
-0:240            'inF0' ( in 3-component vector of float)
 0:241      Sequence
 0:241        move second child to first child ( temp 3-component vector of float)
-0:241          'r057' ( temp 3-component vector of float)
-0:241          inverse sqrt ( temp 3-component vector of float)
+0:241          'r056' ( temp 3-component vector of float)
+0:241          roundEven ( temp 3-component vector of float)
 0:241            'inF0' ( in 3-component vector of float)
 0:242      Sequence
 0:242        move second child to first child ( temp 3-component vector of float)
-0:242          'r058' ( temp 3-component vector of float)
-0:242          clamp ( temp 3-component vector of float)
+0:242          'r057' ( temp 3-component vector of float)
+0:242          inverse sqrt ( temp 3-component vector of float)
 0:242            'inF0' ( in 3-component vector of float)
-0:242            Constant:
-0:242              0.000000
-0:242            Constant:
-0:242              1.000000
 0:243      Sequence
 0:243        move second child to first child ( temp 3-component vector of float)
-0:243          'r059' ( temp 3-component vector of float)
-0:243          Sign ( temp 3-component vector of float)
+0:243          'r058' ( temp 3-component vector of float)
+0:243          clamp ( temp 3-component vector of float)
 0:243            'inF0' ( in 3-component vector of float)
+0:243            Constant:
+0:243              0.000000
+0:243            Constant:
+0:243              1.000000
 0:244      Sequence
 0:244        move second child to first child ( temp 3-component vector of float)
-0:244          'r060' ( temp 3-component vector of float)
-0:244          sine ( temp 3-component vector of float)
+0:244          'r059' ( temp 3-component vector of float)
+0:244          Sign ( temp 3-component vector of float)
 0:244            'inF0' ( in 3-component vector of float)
 0:245      Sequence
 0:245        move second child to first child ( temp 3-component vector of float)
-0:245          'inF1' ( in 3-component vector of float)
+0:245          'r060' ( temp 3-component vector of float)
 0:245          sine ( temp 3-component vector of float)
 0:245            'inF0' ( in 3-component vector of float)
-0:245        move second child to first child ( temp 3-component vector of float)
-0:245          'inF2' ( in 3-component vector of float)
-0:245          cosine ( temp 3-component vector of float)
-0:245            'inF0' ( in 3-component vector of float)
 0:246      Sequence
 0:246        move second child to first child ( temp 3-component vector of float)
-0:246          'r061' ( temp 3-component vector of float)
-0:246          hyp. sine ( temp 3-component vector of float)
+0:246          'inF1' ( in 3-component vector of float)
+0:246          sine ( temp 3-component vector of float)
+0:246            'inF0' ( in 3-component vector of float)
+0:246        move second child to first child ( temp 3-component vector of float)
+0:246          'inF2' ( in 3-component vector of float)
+0:246          cosine ( temp 3-component vector of float)
 0:246            'inF0' ( in 3-component vector of float)
 0:247      Sequence
 0:247        move second child to first child ( temp 3-component vector of float)
-0:247          'r062' ( temp 3-component vector of float)
-0:247          smoothstep ( temp 3-component vector of float)
+0:247          'r061' ( temp 3-component vector of float)
+0:247          hyp. sine ( temp 3-component vector of float)
 0:247            'inF0' ( in 3-component vector of float)
-0:247            'inF1' ( in 3-component vector of float)
-0:247            'inF2' ( in 3-component vector of float)
 0:248      Sequence
 0:248        move second child to first child ( temp 3-component vector of float)
-0:248          'r063' ( temp 3-component vector of float)
-0:248          sqrt ( temp 3-component vector of float)
+0:248          'r062' ( temp 3-component vector of float)
+0:248          smoothstep ( temp 3-component vector of float)
 0:248            'inF0' ( in 3-component vector of float)
+0:248            'inF1' ( in 3-component vector of float)
+0:248            'inF2' ( in 3-component vector of float)
 0:249      Sequence
 0:249        move second child to first child ( temp 3-component vector of float)
-0:249          'r064' ( temp 3-component vector of float)
-0:249          step ( temp 3-component vector of float)
+0:249          'r063' ( temp 3-component vector of float)
+0:249          sqrt ( temp 3-component vector of float)
 0:249            'inF0' ( in 3-component vector of float)
-0:249            'inF1' ( in 3-component vector of float)
 0:250      Sequence
 0:250        move second child to first child ( temp 3-component vector of float)
-0:250          'r065' ( temp 3-component vector of float)
-0:250          tangent ( temp 3-component vector of float)
+0:250          'r064' ( temp 3-component vector of float)
+0:250          step ( temp 3-component vector of float)
 0:250            'inF0' ( in 3-component vector of float)
+0:250            'inF1' ( in 3-component vector of float)
 0:251      Sequence
 0:251        move second child to first child ( temp 3-component vector of float)
-0:251          'r066' ( temp 3-component vector of float)
-0:251          hyp. tangent ( temp 3-component vector of float)
+0:251          'r065' ( temp 3-component vector of float)
+0:251          tangent ( temp 3-component vector of float)
 0:251            'inF0' ( in 3-component vector of float)
-0:253      Sequence
-0:253        move second child to first child ( temp 3-component vector of float)
-0:253          'r067' ( temp 3-component vector of float)
-0:253          trunc ( temp 3-component vector of float)
-0:253            'inF0' ( in 3-component vector of float)
-0:256      Branch: Return with expression
+0:252      Sequence
+0:252        move second child to first child ( temp 3-component vector of float)
+0:252          'r066' ( temp 3-component vector of float)
+0:252          hyp. tangent ( temp 3-component vector of float)
+0:252            'inF0' ( in 3-component vector of float)
+0:254      Sequence
+0:254        move second child to first child ( temp 3-component vector of float)
+0:254          'r067' ( temp 3-component vector of float)
+0:254          trunc ( temp 3-component vector of float)
+0:254            'inF0' ( in 3-component vector of float)
+0:257      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:260  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
-0:260    Function Parameters: 
-0:260      'inF0' ( in 4-component vector of float)
-0:260      'inF1' ( in 4-component vector of float)
-0:260      'inF2' ( in 4-component vector of float)
-0:260      'inU0' ( in 4-component vector of uint)
-0:260      'inU1' ( in 4-component vector of uint)
+0:261  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
+0:261    Function Parameters: 
+0:261      'inF0' ( in 4-component vector of float)
+0:261      'inF1' ( in 4-component vector of float)
+0:261      'inF2' ( in 4-component vector of float)
+0:261      'inU0' ( in 4-component vector of uint)
+0:261      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
-0:263      Sequence
-0:263        move second child to first child ( temp bool)
-0:263          'r000' ( temp bool)
-0:263          all ( temp bool)
-0:263            Convert float to bool ( temp 4-component vector of bool)
-0:263              'inF0' ( in 4-component vector of float)
 0:264      Sequence
-0:264        move second child to first child ( temp 4-component vector of float)
-0:264          'r001' ( temp 4-component vector of float)
-0:264          Absolute value ( temp 4-component vector of float)
-0:264            'inF0' ( in 4-component vector of float)
+0:264        move second child to first child ( temp bool)
+0:264          'r000' ( temp bool)
+0:264          all ( temp bool)
+0:264            Convert float to bool ( temp 4-component vector of bool)
+0:264              'inF0' ( in 4-component vector of float)
 0:265      Sequence
 0:265        move second child to first child ( temp 4-component vector of float)
-0:265          'r002' ( temp 4-component vector of float)
-0:265          arc cosine ( temp 4-component vector of float)
+0:265          'r001' ( temp 4-component vector of float)
+0:265          Absolute value ( temp 4-component vector of float)
 0:265            'inF0' ( in 4-component vector of float)
 0:266      Sequence
-0:266        move second child to first child ( temp bool)
-0:266          'r003' ( temp bool)
-0:266          any ( temp bool)
-0:266            Convert float to bool ( temp 4-component vector of bool)
-0:266              'inF0' ( in 4-component vector of float)
+0:266        move second child to first child ( temp 4-component vector of float)
+0:266          'r002' ( temp 4-component vector of float)
+0:266          arc cosine ( temp 4-component vector of float)
+0:266            'inF0' ( in 4-component vector of float)
 0:267      Sequence
-0:267        move second child to first child ( temp 4-component vector of float)
-0:267          'r004' ( temp 4-component vector of float)
-0:267          arc sine ( temp 4-component vector of float)
-0:267            'inF0' ( in 4-component vector of float)
+0:267        move second child to first child ( temp bool)
+0:267          'r003' ( temp bool)
+0:267          any ( temp bool)
+0:267            Convert float to bool ( temp 4-component vector of bool)
+0:267              'inF0' ( in 4-component vector of float)
 0:268      Sequence
-0:268        move second child to first child ( temp 4-component vector of int)
-0:268          'r005' ( temp 4-component vector of int)
-0:268          floatBitsToInt ( temp 4-component vector of int)
+0:268        move second child to first child ( temp 4-component vector of float)
+0:268          'r004' ( temp 4-component vector of float)
+0:268          arc sine ( temp 4-component vector of float)
 0:268            'inF0' ( in 4-component vector of float)
 0:269      Sequence
-0:269        move second child to first child ( temp 4-component vector of uint)
-0:269          'r006' ( temp 4-component vector of uint)
-0:269          floatBitsToUint ( temp 4-component vector of uint)
+0:269        move second child to first child ( temp 4-component vector of int)
+0:269          'r005' ( temp 4-component vector of int)
+0:269          floatBitsToInt ( temp 4-component vector of int)
 0:269            'inF0' ( in 4-component vector of float)
 0:270      Sequence
-0:270        move second child to first child ( temp 4-component vector of float)
-0:270          'r007' ( temp 4-component vector of float)
-0:270          intBitsToFloat ( temp 4-component vector of float)
-0:270            'inU0' ( in 4-component vector of uint)
-0:272      Sequence
-0:272        move second child to first child ( temp 4-component vector of float)
-0:272          'r009' ( temp 4-component vector of float)
-0:272          arc tangent ( temp 4-component vector of float)
-0:272            'inF0' ( in 4-component vector of float)
+0:270        move second child to first child ( temp 4-component vector of uint)
+0:270          'r006' ( temp 4-component vector of uint)
+0:270          floatBitsToUint ( temp 4-component vector of uint)
+0:270            'inF0' ( in 4-component vector of float)
+0:271      Sequence
+0:271        move second child to first child ( temp 4-component vector of float)
+0:271          'r007' ( temp 4-component vector of float)