From b4019f325cd63860e89d9d2c979538e860e104ef Mon Sep 17 00:00:00 2001 From: Stenzek Date: Mon, 21 Apr 2025 13:06:01 +1000 Subject: [PATCH] GPU/HW: Fix black dots with some texture filters JINC2 specifically ended up with NaNs propagating through. --- src/core/gpu_hw_shadergen.cpp | 7 ++++--- src/core/shader_cache_version.h | 2 +- src/util/shadergen.cpp | 8 +++++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/core/gpu_hw_shadergen.cpp b/src/core/gpu_hw_shadergen.cpp index 2e1d54f51..691ba5254 100644 --- a/src/core/gpu_hw_shadergen.cpp +++ b/src/core/gpu_hw_shadergen.cpp @@ -309,9 +309,10 @@ float4 resampler(float4 x) // res = (x==float4(0.0, 0.0, 0.0, 0.0)) ? float4(wa*wb) : sin(x*wa)*sin(x*wb)/(x*x); // Need to use mix(.., equal(..)) since we want zero check to be component wise - res = lerp(sin(x*wa)*sin(x*wb)/(x*x), float4(wa*wb, wa*wb, wa*wb, wa*wb), VECTOR_COMP_EQ(x,float4(0.0, 0.0, 0.0, 0.0))); - - return res; + float4 a = sin(x * wa) * sin(x * wb) / (x * x); + float4 b = float4(wa*wb, wa*wb, wa*wb, wa*wb); + bool4 s = VECTOR_COMP_EQ(x, float4(0.0, 0.0, 0.0, 0.0)); + return float4(s.x ? b.x : a.x, s.y ? b.y : a.y, s.z ? b.z : a.z, s.w ? b.w : a.w); } void FilteredSampleFromVRAM(TEXPAGE_VALUE texpage, float2 coords, float4 uv_limits, diff --git a/src/core/shader_cache_version.h b/src/core/shader_cache_version.h index 70cf220fb..c11676b3f 100644 --- a/src/core/shader_cache_version.h +++ b/src/core/shader_cache_version.h @@ -5,4 +5,4 @@ #include "common/types.h" -static constexpr u32 SHADER_CACHE_VERSION = 31; +static constexpr u32 SHADER_CACHE_VERSION = 32; diff --git a/src/util/shadergen.cpp b/src/util/shadergen.cpp index a746dc01b..bc4d18462 100644 --- a/src/util/shadergen.cpp +++ b/src/util/shadergen.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin // SPDX-License-Identifier: CC-BY-NC-ND-4.0 #include "shadergen.h" @@ -272,6 +272,9 @@ void ShaderGen::WriteHeader(std::stringstream& ss, bool enable_rov /* = false */ ss << "#define uint2 uvec2\n"; ss << "#define uint3 uvec3\n"; ss << "#define uint4 uvec4\n"; + ss << "#define bool2 bvec2\n"; + ss << "#define bool3 bvec3\n"; + ss << "#define bool4 bvec4\n"; ss << "#define float2x2 mat2\n"; ss << "#define float3x3 mat3\n"; ss << "#define float4x4 mat4\n"; @@ -324,6 +327,9 @@ void ShaderGen::WriteHeader(std::stringstream& ss, bool enable_rov /* = false */ ss << "#define uivec2 uint2\n"; ss << "#define uivec3 uint3\n"; ss << "#define uivec4 uint4\n"; + ss << "#define bvec2 bool2\n"; + ss << "#define bvec3 bool3\n"; + ss << "#define bvec4 bool4\n"; ss << "#define mat2 float2x2\n"; ss << "#define mat3 float3x3\n"; ss << "#define mat4 float4x4\n";