GPU/HW: Add 'Disable Edge Blending' variants of texture filters

This commit is contained in:
Connor McLaughlin 2020-11-01 22:54:03 +10:00
parent 6ddf6784ab
commit 858f39827d
3 changed files with 27 additions and 6 deletions

View File

@ -167,8 +167,9 @@ std::string GPU_HW_ShaderGen::GenerateBatchVertexShader(bool textured)
void GPU_HW_ShaderGen::WriteBatchTextureFilter(std::stringstream& ss, GPUTextureFilter texture_filter) void GPU_HW_ShaderGen::WriteBatchTextureFilter(std::stringstream& ss, GPUTextureFilter texture_filter)
{ {
// JINC2 and xBRZ shaders originally from beetle-psx, modified to support filtering mask channel. // JINC2 and xBRZ shaders originally from beetle-psx, modified to support filtering mask channel.
if (texture_filter == GPUTextureFilter::Bilinear) if (texture_filter == GPUTextureFilter::Bilinear || texture_filter == GPUTextureFilter::BilinearBinAlpha)
{ {
DefineMacro(ss, "BINALPHA", texture_filter == GPUTextureFilter::BilinearBinAlpha);
ss << R"( ss << R"(
void FilteredSampleFromVRAM(uint4 texpage, float2 coords, float4 uv_limits, void FilteredSampleFromVRAM(uint4 texpage, float2 coords, float4 uv_limits,
out float4 texcol, out float ialpha) out float4 texcol, out float ialpha)
@ -200,11 +201,16 @@ void FilteredSampleFromVRAM(uint4 texpage, float2 coords, float4 uv_limits,
// Compensate for partially transparent sampling. // Compensate for partially transparent sampling.
if (ialpha > 0.0) if (ialpha > 0.0)
texcol.rgb /= float3(ialpha, ialpha, ialpha); texcol.rgb /= float3(ialpha, ialpha, ialpha);
#if BINALPHA
ialpha = (ialpha >= 0.5) ? 1.0 : 0.0;
#endif
} }
)"; )";
} }
else if (texture_filter == GPUTextureFilter::JINC2) else if (texture_filter == GPUTextureFilter::JINC2 || texture_filter == GPUTextureFilter::JINC2BinAlpha)
{ {
DefineMacro(ss, "BINALPHA", texture_filter == GPUTextureFilter::JINC2BinAlpha);
ss << R"( ss << R"(
CONSTANT float JINC2_WINDOW_SINC = 0.44; CONSTANT float JINC2_WINDOW_SINC = 0.44;
CONSTANT float JINC2_SINC = 0.82; CONSTANT float JINC2_SINC = 0.82;
@ -347,11 +353,16 @@ void FilteredSampleFromVRAM(uint4 texpage, float2 coords, float4 uv_limits,
// Compensate for partially transparent sampling. // Compensate for partially transparent sampling.
if (ialpha > 0.0) if (ialpha > 0.0)
texcol.rgb /= float3(ialpha, ialpha, ialpha); texcol.rgb /= float3(ialpha, ialpha, ialpha);
#if BINALPHA
ialpha = (ialpha >= 0.5) ? 1.0 : 0.0;
#endif
} }
)"; )";
} }
else if (texture_filter == GPUTextureFilter::xBR) else if (texture_filter == GPUTextureFilter::xBR || texture_filter == GPUTextureFilter::xBRBinAlpha)
{ {
DefineMacro(ss, "BINALPHA", texture_filter == GPUTextureFilter::xBRBinAlpha);
ss << R"( ss << R"(
CONSTANT int BLEND_NONE = 0; CONSTANT int BLEND_NONE = 0;
CONSTANT int BLEND_NORMAL = 1; CONSTANT int BLEND_NORMAL = 1;
@ -626,6 +637,10 @@ void FilteredSampleFromVRAM(uint4 texpage, float2 coords, float4 uv_limits,
// Compensate for partially transparent sampling. // Compensate for partially transparent sampling.
if (ialpha > 0.0) if (ialpha > 0.0)
texcol.rgb /= float3(ialpha, ialpha, ialpha); texcol.rgb /= float3(ialpha, ialpha, ialpha);
#if BINALPHA
ialpha = (ialpha >= 0.5) ? 1.0 : 0.0;
#endif
} }
#undef P #undef P
@ -1172,7 +1187,7 @@ std::string GPU_HW_ShaderGen::GenerateVRAMCopyFragmentShader()
{ {
// TODO: This won't currently work because we can't bind the texture to both the shader and framebuffer. // TODO: This won't currently work because we can't bind the texture to both the shader and framebuffer.
const bool msaa = false; const bool msaa = false;
std::stringstream ss; std::stringstream ss;
WriteHeader(ss); WriteHeader(ss);
WriteCommonFunctions(ss); WriteCommonFunctions(ss);

View File

@ -513,10 +513,13 @@ const char* Settings::GetRendererDisplayName(GPURenderer renderer)
return s_gpu_renderer_display_names[static_cast<int>(renderer)]; return s_gpu_renderer_display_names[static_cast<int>(renderer)];
} }
static constexpr auto s_texture_filter_names = make_array("Nearest", "Bilinear", "JINC2", "xBR"); static constexpr auto s_texture_filter_names =
make_array("Nearest", "Bilinear", "BilinearBinAlpha", "JINC2", "JINC2BinAlpha", "xBR", "xBRBinAlpha");
static constexpr auto s_texture_filter_display_names = static constexpr auto s_texture_filter_display_names =
make_array(TRANSLATABLE("GPUTextureFilter", "Nearest-Neighbor"), TRANSLATABLE("GPUTextureFilter", "Bilinear"), make_array(TRANSLATABLE("GPUTextureFilter", "Nearest-Neighbor"), TRANSLATABLE("GPUTextureFilter", "Bilinear"),
TRANSLATABLE("GPUTextureFilter", "JINC2"), TRANSLATABLE("GPUTextureFilter", "xBR")); TRANSLATABLE("GPUTextureFilter", "Bilinear (No Edge Blending)"), TRANSLATABLE("GPUTextureFilter", "JINC2"),
TRANSLATABLE("GPUTextureFilter", "JINC2 (No Edge Blending)"), TRANSLATABLE("GPUTextureFilter", "xBR"),
TRANSLATABLE("GPUTextureFilter", "xBR (No Edge Blending)"));
std::optional<GPUTextureFilter> Settings::ParseTextureFilterName(const char* str) std::optional<GPUTextureFilter> Settings::ParseTextureFilterName(const char* str)
{ {

View File

@ -67,8 +67,11 @@ enum class GPUTextureFilter : u8
{ {
Nearest, Nearest,
Bilinear, Bilinear,
BilinearBinAlpha,
JINC2, JINC2,
JINC2BinAlpha,
xBR, xBR,
xBRBinAlpha,
Count Count
}; };