|
|
|
@ -802,104 +802,87 @@ bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config, |
|
|
|
|
|
|
|
void RasterizerOpenGL::SamplerInfo::Create() { |
|
|
|
sampler.Create(); |
|
|
|
mag_filter = min_filter = Tegra::Texture::TextureFilter::Linear; |
|
|
|
wrap_u = wrap_v = wrap_p = Tegra::Texture::WrapMode::Wrap; |
|
|
|
uses_depth_compare = false; |
|
|
|
mag_filter = Tegra::Texture::TextureFilter::Linear; |
|
|
|
min_filter = Tegra::Texture::TextureFilter::Linear; |
|
|
|
wrap_u = Tegra::Texture::WrapMode::Wrap; |
|
|
|
wrap_v = Tegra::Texture::WrapMode::Wrap; |
|
|
|
wrap_p = Tegra::Texture::WrapMode::Wrap; |
|
|
|
use_depth_compare = false; |
|
|
|
depth_compare_func = Tegra::Texture::DepthCompareFunc::Never; |
|
|
|
|
|
|
|
// default is GL_LINEAR_MIPMAP_LINEAR
|
|
|
|
// OpenGL's default is GL_LINEAR_MIPMAP_LINEAR
|
|
|
|
glSamplerParameteri(sampler.handle, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
|
|
|
// Other attributes have correct defaults
|
|
|
|
glSamplerParameteri(sampler.handle, GL_TEXTURE_COMPARE_FUNC, GL_NEVER); |
|
|
|
|
|
|
|
// Other attributes have correct defaults
|
|
|
|
} |
|
|
|
|
|
|
|
void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntry& config) { |
|
|
|
const GLuint s = sampler.handle; |
|
|
|
const GLuint sampler_id = sampler.handle; |
|
|
|
if (mag_filter != config.mag_filter) { |
|
|
|
mag_filter = config.mag_filter; |
|
|
|
glSamplerParameteri( |
|
|
|
s, GL_TEXTURE_MAG_FILTER, |
|
|
|
sampler_id, GL_TEXTURE_MAG_FILTER, |
|
|
|
MaxwellToGL::TextureFilterMode(mag_filter, Tegra::Texture::TextureMipmapFilter::None)); |
|
|
|
} |
|
|
|
if (min_filter != config.min_filter || mip_filter != config.mip_filter) { |
|
|
|
if (min_filter != config.min_filter || mipmap_filter != config.mipmap_filter) { |
|
|
|
min_filter = config.min_filter; |
|
|
|
mip_filter = config.mip_filter; |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER, |
|
|
|
MaxwellToGL::TextureFilterMode(min_filter, mip_filter)); |
|
|
|
mipmap_filter = config.mipmap_filter; |
|
|
|
glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, |
|
|
|
MaxwellToGL::TextureFilterMode(min_filter, mipmap_filter)); |
|
|
|
} |
|
|
|
|
|
|
|
if (wrap_u != config.wrap_u) { |
|
|
|
wrap_u = config.wrap_u; |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_WRAP_S, MaxwellToGL::WrapMode(wrap_u)); |
|
|
|
glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_S, MaxwellToGL::WrapMode(wrap_u)); |
|
|
|
} |
|
|
|
if (wrap_v != config.wrap_v) { |
|
|
|
wrap_v = config.wrap_v; |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_WRAP_T, MaxwellToGL::WrapMode(wrap_v)); |
|
|
|
glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_T, MaxwellToGL::WrapMode(wrap_v)); |
|
|
|
} |
|
|
|
if (wrap_p != config.wrap_p) { |
|
|
|
wrap_p = config.wrap_p; |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_WRAP_R, MaxwellToGL::WrapMode(wrap_p)); |
|
|
|
glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_R, MaxwellToGL::WrapMode(wrap_p)); |
|
|
|
} |
|
|
|
|
|
|
|
if (uses_depth_compare != (config.depth_compare_enabled == 1)) { |
|
|
|
uses_depth_compare = (config.depth_compare_enabled == 1); |
|
|
|
if (uses_depth_compare) { |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); |
|
|
|
} else { |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_COMPARE_MODE, GL_NONE); |
|
|
|
} |
|
|
|
if (const bool enabled = config.depth_compare_enabled == 1; use_depth_compare != enabled) { |
|
|
|
use_depth_compare = enabled; |
|
|
|
glSamplerParameteri(sampler_id, GL_TEXTURE_COMPARE_MODE, |
|
|
|
use_depth_compare ? GL_COMPARE_REF_TO_TEXTURE : GL_NONE); |
|
|
|
} |
|
|
|
|
|
|
|
if (depth_compare_func != config.depth_compare_func) { |
|
|
|
depth_compare_func = config.depth_compare_func; |
|
|
|
glSamplerParameteri(s, GL_TEXTURE_COMPARE_FUNC, |
|
|
|
glSamplerParameteri(sampler_id, GL_TEXTURE_COMPARE_FUNC, |
|
|
|
MaxwellToGL::DepthCompareFunc(depth_compare_func)); |
|
|
|
} |
|
|
|
|
|
|
|
GLvec4 new_border_color; |
|
|
|
if (config.srgb_conversion) { |
|
|
|
new_border_color[0] = config.srgb_border_color_r / 255.0f; |
|
|
|
new_border_color[1] = config.srgb_border_color_g / 255.0f; |
|
|
|
new_border_color[2] = config.srgb_border_color_g / 255.0f; |
|
|
|
} else { |
|
|
|
new_border_color[0] = config.border_color_r; |
|
|
|
new_border_color[1] = config.border_color_g; |
|
|
|
new_border_color[2] = config.border_color_b; |
|
|
|
} |
|
|
|
new_border_color[3] = config.border_color_a; |
|
|
|
|
|
|
|
if (border_color != new_border_color) { |
|
|
|
if (const auto new_border_color = config.GetBorderColor(); border_color != new_border_color) { |
|
|
|
border_color = new_border_color; |
|
|
|
glSamplerParameterfv(s, GL_TEXTURE_BORDER_COLOR, border_color.data()); |
|
|
|
glSamplerParameterfv(sampler_id, GL_TEXTURE_BORDER_COLOR, border_color.data()); |
|
|
|
} |
|
|
|
|
|
|
|
const float anisotropic_max = static_cast<float>(1 << config.max_anisotropy.Value()); |
|
|
|
if (anisotropic_max != max_anisotropic) { |
|
|
|
max_anisotropic = anisotropic_max; |
|
|
|
if (const float anisotropic = config.GetMaxAnisotropy(); max_anisotropic != anisotropic) { |
|
|
|
max_anisotropic = anisotropic; |
|
|
|
if (GLAD_GL_ARB_texture_filter_anisotropic) { |
|
|
|
glSamplerParameterf(s, GL_TEXTURE_MAX_ANISOTROPY, max_anisotropic); |
|
|
|
glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_ANISOTROPY, max_anisotropic); |
|
|
|
} else if (GLAD_GL_EXT_texture_filter_anisotropic) { |
|
|
|
glSamplerParameterf(s, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropic); |
|
|
|
glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropic); |
|
|
|
} |
|
|
|
} |
|
|
|
const float lod_min = static_cast<float>(config.min_lod_clamp.Value()) / 256.0f; |
|
|
|
if (lod_min != min_lod) { |
|
|
|
min_lod = lod_min; |
|
|
|
glSamplerParameterf(s, GL_TEXTURE_MIN_LOD, min_lod); |
|
|
|
} |
|
|
|
|
|
|
|
const float lod_max = static_cast<float>(config.max_lod_clamp.Value()) / 256.0f; |
|
|
|
if (lod_max != max_lod) { |
|
|
|
max_lod = lod_max; |
|
|
|
glSamplerParameterf(s, GL_TEXTURE_MAX_LOD, max_lod); |
|
|
|
if (const float min = config.GetMinLod(); min_lod != min) { |
|
|
|
min_lod = min; |
|
|
|
glSamplerParameterf(sampler_id, GL_TEXTURE_MIN_LOD, min_lod); |
|
|
|
} |
|
|
|
const u32 bias = config.mip_lod_bias.Value(); |
|
|
|
// Sign extend the 13-bit value.
|
|
|
|
constexpr u32 mask = 1U << (13 - 1); |
|
|
|
const float bias_lod = static_cast<s32>((bias ^ mask) - mask) / 256.f; |
|
|
|
if (lod_bias != bias_lod) { |
|
|
|
lod_bias = bias_lod; |
|
|
|
glSamplerParameterf(s, GL_TEXTURE_LOD_BIAS, lod_bias); |
|
|
|
if (const float max = config.GetMaxLod(); max_lod != max) { |
|
|
|
max_lod = max; |
|
|
|
glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_LOD, max_lod); |
|
|
|
} |
|
|
|
|
|
|
|
if (const float bias = config.GetLodBias(); lod_bias != bias) { |
|
|
|
lod_bias = bias; |
|
|
|
glSamplerParameterf(sampler_id, GL_TEXTURE_LOD_BIAS, lod_bias); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|