shader_recompiler: Add subpixel offset for correct rounding at ImageGather

On AMD a subpixel offset of 1/512 of the texel size is applied to the texture coordinates at a ImageGather call to ensure the rounding at the texel centers is done the same way as in Maxwell or other Nvidia architectures.
See https://www.reedbeta.com/blog/texture-gathers-and-coordinate-precision/ for more details why this might be necessary.

This should fix shadow artifacts at object edges in Zelda: Breath of the Wild (#9957, #6956).
This commit is contained in:
Wollnashorn
2023-04-05 01:29:46 +02:00
parent bbdfe1fab1
commit 780240e697
9 changed files with 86 additions and 0 deletions

View File

@ -52,6 +52,10 @@ struct Profile {
bool need_declared_frag_colors{};
/// Prevents fast math optimizations that may cause inaccuracies
bool need_fastmath_off{};
/// Some GPU vendors use a lower fixed point format of 16.8 when calculating pixel coordinates
/// in the ImageGather instruction than the Maxwell architecture does. Applying an offset does
/// fix this mismatching rounding behaviour.
bool need_gather_subpixel_offset{};
/// OpFClamp is broken and OpFMax + OpFMin should be used instead
bool has_broken_spirv_clamp{};