rsx: Improve accuracy of shadow compare Ops when non-integer depth formats are used

- The fixed-point D24S8 format does special Z clamping during compare which matches PS3 behaviour
- D32S8 is a floating point format and comparison with Dref > 1 always fails causing black edges/borders
This commit is contained in:
kd-11 2019-04-15 20:39:42 +03:00 committed by kd-11
parent 7ad1646c2c
commit 463b1b220d
12 changed files with 192 additions and 53 deletions

View file

@ -1555,11 +1555,14 @@ namespace rsx
case CELL_GCM_TEXTURE_DEPTH24_D8:
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
{
const auto compare_mode = (rsx::comparison_function)tex.zfunc();
const auto compare_mode = tex.zfunc();
if (result.textures_alpha_kill[i] == 0 &&
compare_mode < rsx::comparison_function::always &&
compare_mode > rsx::comparison_function::never)
{
result.shadow_textures |= (1 << i);
texture_control |= u32(tex.zfunc()) << 8;
}
break;
}
default:
@ -1652,7 +1655,7 @@ namespace rsx
if (tex.alpha_kill_enabled())
{
//alphakill can be ignored unless a valid comparison function is set
const rsx::comparison_function func = (rsx::comparison_function)tex.zfunc();
const auto func = tex.zfunc();
if (func < rsx::comparison_function::always && func > rsx::comparison_function::never)
{
result.textures_alpha_kill[i] = 1;
@ -1708,7 +1711,7 @@ namespace rsx
case CELL_GCM_TEXTURE_DEPTH24_D8:
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
{
const auto compare_mode = (rsx::comparison_function)tex.zfunc();
const auto compare_mode = tex.zfunc();
if (result.textures_alpha_kill[i] == 0 &&
compare_mode < rsx::comparison_function::always &&
compare_mode > rsx::comparison_function::never)