Generate separate stores for partially swizzled memory stores
authorJeremy Hayes <jeremy@lunarg.com>
Fri, 16 Jul 2021 21:07:16 +0000 (15:07 -0600)
committerJeremy Hayes <jeremy@lunarg.com>
Wed, 28 Jul 2021 20:55:45 +0000 (14:55 -0600)
commit6d5b40f0514582475b158b53353b6f46a2ca88b3
tree5bd3a4ec09d5f79b7f75f070e65f06c31280cb14
parent9158061398a96033c990e69156bd28c67114544b
Generate separate stores for partially swizzled memory stores

Full vector and fully specified vector swizzle stores are not affected by this change, only partial swizzles ie swizzles with fewer components than the vector being stored to.

Previously the vector being stored to loaded and any components not specified in the swizzle were used to create a full store to the vector.

While this change generates more SPIR-V instructions, it is necessary for correctness.

Fixes #2518.
50 files changed:
SPIRV/SpvBuilder.cpp
SPIRV/SpvBuilder.h
Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
Test/baseResults/hlsl.partialFlattenLocal.vert.out
Test/baseResults/hlsl.wavebroadcast.comp.out
Test/baseResults/hlsl.waveprefix.comp.out
Test/baseResults/hlsl.wavequad.comp.out
Test/baseResults/hlsl.wavereduction.comp.out
Test/baseResults/remap.uniformarray.everything.frag.out
Test/baseResults/remap.uniformarray.none.frag.out
Test/baseResults/spv.310.bitcast.frag.out
Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
Test/baseResults/spv.400.frag.nanclamp.out
Test/baseResults/spv.400.frag.out
Test/baseResults/spv.Operations.frag.out
Test/baseResults/spv.accessChain.frag.out
Test/baseResults/spv.bitCast.frag.out
Test/baseResults/spv.float16.frag.out
Test/baseResults/spv.float16Fetch.frag.out
Test/baseResults/spv.float32.frag.out
Test/baseResults/spv.float64.frag.out
Test/baseResults/spv.forLoop.frag.out
Test/baseResults/spv.image.frag.out
Test/baseResults/spv.int16.amd.frag.out
Test/baseResults/spv.int16.frag.out
Test/baseResults/spv.int32.frag.out
Test/baseResults/spv.int64.frag.out
Test/baseResults/spv.int8.frag.out
Test/baseResults/spv.intOps.vert.out
Test/baseResults/spv.interpOps.frag.out
Test/baseResults/spv.memoryQualifier.frag.out
Test/baseResults/spv.meshShaderUserDefined.mesh.out
Test/baseResults/spv.shaderBallot.comp.out
Test/baseResults/spv.subgroupArithmetic.comp.out
Test/baseResults/spv.subgroupBallot.comp.out
Test/baseResults/spv.subgroupClustered.comp.out
Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
Test/baseResults/spv.subgroupPartitioned.comp.out
Test/baseResults/spv.subgroupQuad.comp.out
Test/baseResults/spv.subgroupShuffle.comp.out
Test/baseResults/spv.subgroupShuffleRelative.comp.out
Test/baseResults/spv.swizzle.frag.out
Test/baseResults/spv.uniformArray.frag.out
Test/baseResults/spv.vulkan110.int16.frag.out