From 633746b5e4c635574408ca6210021b5c30483055 Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Sun, 21 Feb 2016 15:38:10 -0600 Subject: [PATCH] Actually preserve pv/ps if predicate fails --- src/xenia/gpu/spirv_shader_translator.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/xenia/gpu/spirv_shader_translator.cc b/src/xenia/gpu/spirv_shader_translator.cc index 5684a24e3..a36b8dfca 100644 --- a/src/xenia/gpu/spirv_shader_translator.cc +++ b/src/xenia/gpu/spirv_shader_translator.cc @@ -720,7 +720,7 @@ void SpirvShaderTranslator::ProcessVectorAluInstruction( dest, b.createLoad(pv_)); } - b.createStore(dest, pv_); + b.createStore(pv_dest, pv_); StoreToResult(dest, instr.result, pred_cond); } } @@ -970,7 +970,7 @@ void SpirvShaderTranslator::ProcessScalarAluInstruction( b.createLoad(ps_)); } - b.createStore(dest, ps_); + b.createStore(ps_dest, ps_); StoreToResult(dest, instr.result, pred_cond); } } @@ -1200,7 +1200,12 @@ void SpirvShaderTranslator::StoreToResult(Id source_value_id, storage_pointer = b.createAccessChain(storage_class, storage_pointer, storage_offsets); } - auto storage_value = b.createLoad(storage_pointer); + + // Only load from storage if we need it later. + Id storage_value = 0; + if (!result.has_all_writes() || predicate_cond) { + b.createLoad(storage_pointer); + } // Convert to the appropriate type, if needed. if (b.getTypeId(source_value_id) != storage_type) {