mirror of https://github.com/PCSX2/pcsx2.git
GSDX: Add an enum for texture filtering
Also re-order the combobox to make it look consistent with the tooltip description.
This commit is contained in:
parent
cc4cc342c2
commit
45be4626f6
|
@ -1414,3 +1414,13 @@ enum class GSVideoMode : uint8
|
||||||
DTV_720P,
|
DTV_720P,
|
||||||
DTV_1080I
|
DTV_1080I
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class Filtering : uint8
|
||||||
|
{
|
||||||
|
Nearest,
|
||||||
|
Bilinear_Forced,
|
||||||
|
Bilinear_PS2,
|
||||||
|
Trilinear,
|
||||||
|
Trilinear_Bilinear_Forced,
|
||||||
|
Trilinear_Always
|
||||||
|
};
|
||||||
|
|
|
@ -75,7 +75,7 @@ GSDeviceOGL::GSDeviceOGL()
|
||||||
GLState::Clear();
|
GLState::Clear();
|
||||||
|
|
||||||
m_mipmap = theApp.GetConfigI("mipmap");
|
m_mipmap = theApp.GetConfigI("mipmap");
|
||||||
m_filter = theApp.GetConfigI("filter");
|
m_filter = static_cast<Filtering>(theApp.GetConfigI("filter"));
|
||||||
|
|
||||||
// Reset the debug file
|
// Reset the debug file
|
||||||
#ifdef ENABLE_OGL_DEBUG
|
#ifdef ENABLE_OGL_DEBUG
|
||||||
|
@ -228,8 +228,9 @@ GSTexture* GSDeviceOGL::CreateSurface(int type, int w, int h, bool msaa, int fmt
|
||||||
{
|
{
|
||||||
GL_PUSH("Create surface");
|
GL_PUSH("Create surface");
|
||||||
|
|
||||||
|
bool trilinear = m_filter == Filtering::Trilinear || m_filter == Filtering::Trilinear_Bilinear_Forced || m_filter == Filtering::Trilinear_Always;
|
||||||
// A wrapper to call GSTextureOGL, with the different kind of parameter
|
// A wrapper to call GSTextureOGL, with the different kind of parameter
|
||||||
GSTextureOGL* t = new GSTextureOGL(type, w, h, fmt, m_fbo_read, m_mipmap > 1 || m_filter > 2);
|
GSTextureOGL* t = new GSTextureOGL(type, w, h, fmt, m_fbo_read, m_mipmap > 1 || trilinear);
|
||||||
|
|
||||||
// NOTE: I'm not sure RenderTarget always need to be cleared. It could be costly for big upscale.
|
// NOTE: I'm not sure RenderTarget always need to be cleared. It could be costly for big upscale.
|
||||||
// FIXME: it will be more logical to do it in FetchSurface. This code is only called at first creation
|
// FIXME: it will be more logical to do it in FetchSurface. This code is only called at first creation
|
||||||
|
|
|
@ -406,7 +406,7 @@ public:
|
||||||
uint32 m_msaa; // Level of Msaa
|
uint32 m_msaa; // Level of Msaa
|
||||||
int m_force_texture_clear;
|
int m_force_texture_clear;
|
||||||
int m_mipmap;
|
int m_mipmap;
|
||||||
int m_filter;
|
Filtering m_filter;
|
||||||
|
|
||||||
static bool m_debug_gl_call;
|
static bool m_debug_gl_call;
|
||||||
static FILE* m_debug_gl_file;
|
static FILE* m_debug_gl_file;
|
||||||
|
|
|
@ -45,7 +45,7 @@ GSRenderer::GSRenderer()
|
||||||
m_interlace = theApp.GetConfigI("interlace") % s_interlace_nb;
|
m_interlace = theApp.GetConfigI("interlace") % s_interlace_nb;
|
||||||
m_aspectratio = theApp.GetConfigI("AspectRatio") % s_aspect_ratio_nb;
|
m_aspectratio = theApp.GetConfigI("AspectRatio") % s_aspect_ratio_nb;
|
||||||
m_shader = theApp.GetConfigI("TVShader") % s_post_shader_nb;
|
m_shader = theApp.GetConfigI("TVShader") % s_post_shader_nb;
|
||||||
m_filter = theApp.GetConfigI("filter");
|
m_filter = static_cast<Filtering>(theApp.GetConfigI("filter"));
|
||||||
m_vsync = theApp.GetConfigB("vsync");
|
m_vsync = theApp.GetConfigB("vsync");
|
||||||
m_aa1 = theApp.GetConfigB("aa1");
|
m_aa1 = theApp.GetConfigB("aa1");
|
||||||
m_fxaa = theApp.GetConfigB("fxaa");
|
m_fxaa = theApp.GetConfigB("fxaa");
|
||||||
|
|
|
@ -41,7 +41,6 @@ class GSRenderer : public GSState
|
||||||
protected:
|
protected:
|
||||||
int m_interlace;
|
int m_interlace;
|
||||||
int m_aspectratio;
|
int m_aspectratio;
|
||||||
int m_filter;
|
|
||||||
bool m_vsync;
|
bool m_vsync;
|
||||||
bool m_aa1;
|
bool m_aa1;
|
||||||
bool m_framelimit;
|
bool m_framelimit;
|
||||||
|
@ -49,6 +48,7 @@ protected:
|
||||||
bool m_fxaa;
|
bool m_fxaa;
|
||||||
bool m_shadeboost;
|
bool m_shadeboost;
|
||||||
bool m_texture_shuffle;
|
bool m_texture_shuffle;
|
||||||
|
Filtering m_filter;
|
||||||
GSVector2i m_real_size;
|
GSVector2i m_real_size;
|
||||||
|
|
||||||
virtual GSTexture* GetOutput(int i, int& y_offset) = 0;
|
virtual GSTexture* GetOutput(int i, int& y_offset) = 0;
|
||||||
|
|
|
@ -478,7 +478,7 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc
|
||||||
// After the conversion the texture will be RGBA8 (aka 32 bits) hence the 0 below
|
// After the conversion the texture will be RGBA8 (aka 32 bits) hence the 0 below
|
||||||
int gpu_tex_fmt = (tex->m_target) ? cpsm.fmt : 0;
|
int gpu_tex_fmt = (tex->m_target) ? cpsm.fmt : 0;
|
||||||
|
|
||||||
bool bilinear = m_filter == 2 || m_filter == 4 ? m_vt.IsLinear() : m_filter != 0;
|
bool bilinear = m_filter == Filtering::Bilinear_PS2 || m_filter == Filtering::Trilinear ? m_vt.IsLinear() : m_filter != Filtering::Nearest;
|
||||||
bool simple_sample = !tex->m_palette && gpu_tex_fmt == 0 && m_context->CLAMP.WMS < 2 && m_context->CLAMP.WMT < 2;
|
bool simple_sample = !tex->m_palette && gpu_tex_fmt == 0 && m_context->CLAMP.WMS < 2 && m_context->CLAMP.WMT < 2;
|
||||||
// Don't force extra filtering on sprite (it creates various upscaling issue)
|
// Don't force extra filtering on sprite (it creates various upscaling issue)
|
||||||
bilinear &= !((m_vt.m_primclass == GS_SPRITE_CLASS) && m_userhacks_round_sprite_offset && !m_vt.IsLinear());
|
bilinear &= !((m_vt.m_primclass == GS_SPRITE_CLASS) && m_userhacks_round_sprite_offset && !m_vt.IsLinear());
|
||||||
|
|
|
@ -754,29 +754,35 @@ void GSRendererOGL::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
||||||
bool bilinear = false;
|
bool bilinear = false;
|
||||||
int trilinear = 0;
|
int trilinear = 0;
|
||||||
bool trilinear_auto = false;
|
bool trilinear_auto = false;
|
||||||
switch (m_filter) {
|
switch (m_filter)
|
||||||
case 0: // Nearest
|
{
|
||||||
|
case Filtering::Nearest:
|
||||||
bilinear = false;
|
bilinear = false;
|
||||||
break;
|
break;
|
||||||
case 1: // Forced Bilinear
|
|
||||||
|
case Filtering::Bilinear_Forced:
|
||||||
bilinear = true;
|
bilinear = true;
|
||||||
break;
|
break;
|
||||||
case 2: // Bilinear PS2
|
|
||||||
|
case Filtering::Bilinear_PS2:
|
||||||
bilinear = m_vt.IsLinear();
|
bilinear = m_vt.IsLinear();
|
||||||
break;
|
break;
|
||||||
case 3: // Trilinear Forced
|
|
||||||
|
case Filtering::Trilinear_Always:
|
||||||
bilinear = true;
|
bilinear = true;
|
||||||
trilinear = static_cast<uint8>(GS_MIN_FILTER::Linear_Mipmap_Linear);
|
trilinear = static_cast<uint8>(GS_MIN_FILTER::Linear_Mipmap_Linear);
|
||||||
trilinear_auto = m_mipmap != 2;
|
trilinear_auto = m_mipmap != 2;
|
||||||
break;
|
break;
|
||||||
case 4: // Trilinear
|
|
||||||
|
case Filtering::Trilinear:
|
||||||
bilinear = m_vt.IsLinear();
|
bilinear = m_vt.IsLinear();
|
||||||
if (need_mipmap && m_mipmap != 2) {
|
if (need_mipmap && m_mipmap != 2) {
|
||||||
trilinear = m_context->TEX1.MMIN;
|
trilinear = m_context->TEX1.MMIN;
|
||||||
trilinear_auto = true;
|
trilinear_auto = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5: // Trilinear (forced on linear)
|
|
||||||
|
case Filtering::Trilinear_Bilinear_Forced:
|
||||||
bilinear = true;
|
bilinear = true;
|
||||||
if (need_mipmap && m_mipmap != 2) {
|
if (need_mipmap && m_mipmap != 2) {
|
||||||
trilinear = (m_context->TEX1.MMIN | 4) & 0x5;
|
trilinear = (m_context->TEX1.MMIN | 4) & 0x5;
|
||||||
|
|
|
@ -33,8 +33,8 @@ const char* dialog_message(int ID, bool* updateText) {
|
||||||
case IDC_FILTER:
|
case IDC_FILTER:
|
||||||
return "Control the texture filtering of the emulation.\n\n"
|
return "Control the texture filtering of the emulation.\n\n"
|
||||||
"Nearest:\nAlways disable interpolation, rendering will be blocky.\n\n"
|
"Nearest:\nAlways disable interpolation, rendering will be blocky.\n\n"
|
||||||
"Bilinear PS2:\nUse same mode as the PS2. It is the more accurate option.\n\n"
|
|
||||||
"Bilinear Forced:\nAlways enable interpolation. Rendering is smoother but it could generate some glitches.\n\n"
|
"Bilinear Forced:\nAlways enable interpolation. Rendering is smoother but it could generate some glitches.\n\n"
|
||||||
|
"Bilinear PS2:\nUse same mode as the PS2. It is the more accurate option.\n\n"
|
||||||
"Trilinear:\nUse OpenGL trilinear interpolation when PS2 uses mipmaps.\n\n"
|
"Trilinear:\nUse OpenGL trilinear interpolation when PS2 uses mipmaps.\n\n"
|
||||||
"Trilinear Forced Bilinear:\nSame as above but always enable bilinear interpolation.\n\n"
|
"Trilinear Forced Bilinear:\nSame as above but always enable bilinear interpolation.\n\n"
|
||||||
"Trilinear Ultra:\nAlways enable full trilinear interpolation. Warning Slow!\n\n";
|
"Trilinear Ultra:\nAlways enable full trilinear interpolation. Warning Slow!\n\n";
|
||||||
|
|
|
@ -199,12 +199,12 @@ void GSdxApp::Init()
|
||||||
m_gs_max_anisotropy.push_back(GSSetting(8, "8x", ""));
|
m_gs_max_anisotropy.push_back(GSSetting(8, "8x", ""));
|
||||||
m_gs_max_anisotropy.push_back(GSSetting(16, "16x", ""));
|
m_gs_max_anisotropy.push_back(GSSetting(16, "16x", ""));
|
||||||
|
|
||||||
m_gs_filter.push_back(GSSetting(0, "Nearest", ""));
|
m_gs_filter.push_back(GSSetting(static_cast<uint32>(Filtering::Nearest), "Nearest", ""));
|
||||||
m_gs_filter.push_back(GSSetting(1, "Bilinear", "Forced"));
|
m_gs_filter.push_back(GSSetting(static_cast<uint32>(Filtering::Bilinear_Forced), "Bilinear", "Forced"));
|
||||||
m_gs_filter.push_back(GSSetting(2, "Bilinear", "PS2"));
|
m_gs_filter.push_back(GSSetting(static_cast<uint32>(Filtering::Bilinear_PS2), "Bilinear", "PS2"));
|
||||||
m_gs_filter.push_back(GSSetting(3, "Trilinear", "Ultra/Slow"));
|
m_gs_filter.push_back(GSSetting(static_cast<uint32>(Filtering::Trilinear), "Trilinear", ""));
|
||||||
m_gs_filter.push_back(GSSetting(4, "Trilinear", ""));
|
m_gs_filter.push_back(GSSetting(static_cast<uint32>(Filtering::Trilinear_Bilinear_Forced), "Trilinear", "Forced Bilinear"));
|
||||||
m_gs_filter.push_back(GSSetting(5, "Trilinear", "Forced Bilinear"));
|
m_gs_filter.push_back(GSSetting(static_cast<uint32>(Filtering::Trilinear_Always), "Trilinear", "Ultra/Slow"));
|
||||||
|
|
||||||
m_gs_gl_ext.push_back(GSSetting(-1, "Auto", ""));
|
m_gs_gl_ext.push_back(GSSetting(-1, "Auto", ""));
|
||||||
m_gs_gl_ext.push_back(GSSetting(0, "Force-Disabled", ""));
|
m_gs_gl_ext.push_back(GSSetting(0, "Force-Disabled", ""));
|
||||||
|
|
Loading…
Reference in New Issue