mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-03-06 14:27:44 +00:00
GPU/HW: Add 'Disable Edge Blending' variants of texture filters
This commit is contained in:
parent
6ddf6784ab
commit
858f39827d
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,8 +67,11 @@ enum class GPUTextureFilter : u8
|
||||||
{
|
{
|
||||||
Nearest,
|
Nearest,
|
||||||
Bilinear,
|
Bilinear,
|
||||||
|
BilinearBinAlpha,
|
||||||
JINC2,
|
JINC2,
|
||||||
|
JINC2BinAlpha,
|
||||||
xBR,
|
xBR,
|
||||||
|
xBRBinAlpha,
|
||||||
Count
|
Count
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue