diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-06-29 13:20:35 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-06-29 13:20:35 +0300 |
commit | 3afbfdb0909e218b7c6b66bafa367dfc9a0e387e (patch) | |
tree | bb9a020068fd5c586ac7859a9065ce78f6f3f356 /reference/shaders-ue4 | |
parent | 05188aca692924a6c5ad312fc819fa1d5aa9c787 (diff) |
Implement context-sensitive expression read tracking.
When inside a loop, treat any read of outer expressions to happen
multiple times, forcing a temporary of said outer expressions.
This avoids the problem where we can end up relying on loop-invariant code motion to happen in the
compiler when converting optimized shaders.
Diffstat (limited to 'reference/shaders-ue4')
-rw-r--r-- | reference/shaders-ue4/asm/frag/texture-atomics.asm.frag | 3 | ||||
-rw-r--r-- | reference/shaders-ue4/asm/frag/texture-atomics.asm.graphics-robust-access.frag | 3 |
2 files changed, 4 insertions, 2 deletions
diff --git a/reference/shaders-ue4/asm/frag/texture-atomics.asm.frag b/reference/shaders-ue4/asm/frag/texture-atomics.asm.frag index 98cdda44..d73c30cb 100644 --- a/reference/shaders-ue4/asm/frag/texture-atomics.asm.frag +++ b/reference/shaders-ue4/asm/frag/texture-atomics.asm.frag @@ -84,6 +84,7 @@ fragment main0_out main0(main0_in in [[stage_in]], const device type_StructuredB uint _107 = _103 + 1u; if (all(CulledObjectBoxBounds._m0[_107].xy > _96.xy) && all(CulledObjectBoxBounds._m0[_103].xyz < _102)) { + float3 _121 = float3(0.5) * (CulledObjectBoxBounds._m0[_103].xyz + CulledObjectBoxBounds._m0[_107].xyz); float _122 = _96.x; float _123 = _96.y; spvUnsafeArray<float3, 8> _73; @@ -103,7 +104,7 @@ fragment main0_out main0(main0_in in [[stage_in]], const device type_StructuredB _158 = float3(500000.0); for (int _160 = 0; _160 < 8; ) { - float3 _166 = _73[_160] - (float3(0.5) * (CulledObjectBoxBounds._m0[_103].xyz + CulledObjectBoxBounds._m0[_107].xyz)); + float3 _166 = _73[_160] - _121; float3 _170 = float3(dot(_166, CulledObjectBoxBounds._m0[_103 + 2u].xyz), dot(_166, CulledObjectBoxBounds._m0[_103 + 3u].xyz), dot(_166, CulledObjectBoxBounds._m0[_103 + 4u].xyz)); _155 = fast::max(_155, _170); _158 = fast::min(_158, _170); diff --git a/reference/shaders-ue4/asm/frag/texture-atomics.asm.graphics-robust-access.frag b/reference/shaders-ue4/asm/frag/texture-atomics.asm.graphics-robust-access.frag index 98cdda44..d73c30cb 100644 --- a/reference/shaders-ue4/asm/frag/texture-atomics.asm.graphics-robust-access.frag +++ b/reference/shaders-ue4/asm/frag/texture-atomics.asm.graphics-robust-access.frag @@ -84,6 +84,7 @@ fragment main0_out main0(main0_in in [[stage_in]], const device type_StructuredB uint _107 = _103 + 1u; if (all(CulledObjectBoxBounds._m0[_107].xy > _96.xy) && all(CulledObjectBoxBounds._m0[_103].xyz < _102)) { + float3 _121 = float3(0.5) * (CulledObjectBoxBounds._m0[_103].xyz + CulledObjectBoxBounds._m0[_107].xyz); float _122 = _96.x; float _123 = _96.y; spvUnsafeArray<float3, 8> _73; @@ -103,7 +104,7 @@ fragment main0_out main0(main0_in in [[stage_in]], const device type_StructuredB _158 = float3(500000.0); for (int _160 = 0; _160 < 8; ) { - float3 _166 = _73[_160] - (float3(0.5) * (CulledObjectBoxBounds._m0[_103].xyz + CulledObjectBoxBounds._m0[_107].xyz)); + float3 _166 = _73[_160] - _121; float3 _170 = float3(dot(_166, CulledObjectBoxBounds._m0[_103 + 2u].xyz), dot(_166, CulledObjectBoxBounds._m0[_103 + 3u].xyz), dot(_166, CulledObjectBoxBounds._m0[_103 + 4u].xyz)); _155 = fast::max(_155, _170); _158 = fast::min(_158, _170); |