aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/shader_recompiler/frontend/ampere/lower_to_maxwell.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/shader_recompiler/frontend/ampere/lower_to_maxwell.h b/src/shader_recompiler/frontend/ampere/lower_to_maxwell.h
index 031f7fac75..6bc07638ea 100644
--- a/src/shader_recompiler/frontend/ampere/lower_to_maxwell.h
+++ b/src/shader_recompiler/frontend/ampere/lower_to_maxwell.h
@@ -614,8 +614,15 @@ inline LoweredProgram LowerToMaxwell(std::span<const Instruction> code) {
emit(0x5c30000000070000ULL | 250 | (u64{250} << 20));
emit(0xef10000000070000ULL | 251 | (u64{insn.Bits(24, 8)} << 8) |
(u64{250} << 20) | (u64{1} << 29) | (u64{31} << 34) | (u64{7} << 48));
- emit(0x5ca0000000070000ULL | target | (u64{251} << 8) |
- (u64{target} << 20) | (u64{6} << 39));
+ if (native_predicate == 7) {
+ // Every lane executing it is in the ballot, so no lane-less fallback can be taken.
+ // Leaving the old value selectable would make it a source of the result for the
+ // texture and global memory tracking (a handle traced to the uniform's last load).
+ emit(0x5c98000000070000ULL | target | (u64{15} << 39) | (u64{251} << 20));
+ } else {
+ emit(0x5ca0000000070000ULL | target | (u64{251} << 8) |
+ (u64{target} << 20) | (u64{6} << 39));
+ }
restore_predicate();
break;
}