Browse Source
[shader_recompiler] Fix Shuffle handling for Position attributes (#3406)
This fixes the rescaling path to properly convert to F32, matching native 1x behavior for any resolution.
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3406
Reviewed-by: DraVee <dravee@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
descriptor_pool_opt
MaranBr
3 days ago
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
2 changed files with
8 additions and
12 deletions
-
src/shader_recompiler/frontend/maxwell/translate_program.cpp
-
src/shader_recompiler/ir_opt/rescaling_pass.cpp
|
|
|
@ -304,17 +304,9 @@ IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Blo |
|
|
|
Optimization::GlobalMemoryToStorageBufferPass(program, host_info); |
|
|
|
Optimization::TexturePass(env, program, host_info); |
|
|
|
|
|
|
|
bool should_rescale = |
|
|
|
#ifdef __ANDROID__
|
|
|
|
Settings::values.resolution_info.active; |
|
|
|
#else
|
|
|
|
true; |
|
|
|
#endif
|
|
|
|
|
|
|
|
if (should_rescale) { |
|
|
|
if (Settings::values.resolution_info.active) { |
|
|
|
Optimization::RescalingPass(program); |
|
|
|
} |
|
|
|
|
|
|
|
Optimization::DeadCodeEliminationPass(program); |
|
|
|
if (Settings::values.renderer_debug) { |
|
|
|
Optimization::VerificationPass(program); |
|
|
|
|
|
|
|
@ -1,3 +1,6 @@ |
|
|
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
@ -63,10 +66,11 @@ void VisitMark(IR::Block& block, IR::Inst& inst) { |
|
|
|
} |
|
|
|
if (must_patch_outside) { |
|
|
|
const auto it{IR::Block::InstructionList::s_iterator_to(inst)}; |
|
|
|
IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; |
|
|
|
const IR::F32 new_inst{&*block.PrependNewInst(it, inst)}; |
|
|
|
IR::IREmitter ir{block, it}; |
|
|
|
IR::Inst* const new_inst{&*block.PrependNewInst(it, inst)}; |
|
|
|
const IR::F32 new_bitcast{ir.ConvertUToF(32, 32, IR::Value{new_inst})}; |
|
|
|
const IR::F32 up_factor{ir.FPRecip(ir.ResolutionDownFactor())}; |
|
|
|
const IR::Value converted{ir.FPMul(new_inst, up_factor)}; |
|
|
|
const IR::Value converted{ir.FPMul(new_bitcast, up_factor)}; |
|
|
|
inst.ReplaceUsesWith(converted); |
|
|
|
} |
|
|
|
break; |
|
|
|
|