Rework max anisotropy override to sampler creation (D3D12/Vulkan)
Revert ac6fd65 fetch additions and implement context-sensitive AF override.
This commit is contained in:
committed by
Radosław Gliński
parent
60ffc2e83f
commit
1a9613705d
@@ -696,41 +696,55 @@ D3D12TextureCache::SamplerParameters D3D12TextureCache::GetSamplerParameters(
|
|||||||
parameters.border_color = xenos::BorderColor::k_ABGR_Black;
|
parameters.border_color = xenos::BorderColor::k_ABGR_Black;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t mip_min_level;
|
uint32_t mip_min_level, mip_max_level;
|
||||||
texture_util::GetSubresourcesFromFetchConstant(fetch, nullptr, nullptr,
|
texture_util::GetSubresourcesFromFetchConstant(
|
||||||
nullptr, nullptr, nullptr,
|
fetch, nullptr, nullptr, nullptr, nullptr, nullptr, &mip_min_level,
|
||||||
&mip_min_level, nullptr);
|
&mip_max_level);
|
||||||
parameters.mip_min_level = mip_min_level;
|
parameters.mip_min_level = mip_min_level;
|
||||||
|
bool has_mips = mip_max_level > mip_min_level;
|
||||||
|
xenos::TextureFilter mag_filter =
|
||||||
|
binding.mag_filter == xenos::TextureFilter::kUseFetchConst
|
||||||
|
? fetch.mag_filter
|
||||||
|
: binding.mag_filter;
|
||||||
|
xenos::TextureFilter min_filter =
|
||||||
|
binding.min_filter == xenos::TextureFilter::kUseFetchConst
|
||||||
|
? fetch.min_filter
|
||||||
|
: binding.min_filter;
|
||||||
|
xenos::TextureFilter mip_filter =
|
||||||
|
binding.mip_filter == xenos::TextureFilter::kUseFetchConst
|
||||||
|
? fetch.mip_filter
|
||||||
|
: binding.mip_filter;
|
||||||
|
bool min_mag_linear = (mag_filter == xenos::TextureFilter::kLinear) &&
|
||||||
|
(min_filter == xenos::TextureFilter::kLinear);
|
||||||
|
bool mip_filter_bilinear_or_trilinear =
|
||||||
|
mip_filter == xenos::TextureFilter::kPoint ||
|
||||||
|
mip_filter == xenos::TextureFilter::kLinear;
|
||||||
|
bool mip_base_map = mip_filter == xenos::TextureFilter::kBaseMap;
|
||||||
// high cache miss count here, prefetch fetch earlier
|
// high cache miss count here, prefetch fetch earlier
|
||||||
// TODO(Triang3l): Disable filtering for texture formats not supporting it.
|
// TODO(Triang3l): Disable filtering for texture formats not supporting it.
|
||||||
xenos::AnisoFilter aniso_filter =
|
xenos::AnisoFilter aniso_filter =
|
||||||
binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst
|
binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst
|
||||||
? fetch.aniso_filter
|
? fetch.aniso_filter
|
||||||
: binding.aniso_filter;
|
: binding.aniso_filter;
|
||||||
|
// Apply anisotropic override, but only for mipmapped textures
|
||||||
|
// that are already using bilinear/trilinear filtering.
|
||||||
|
if (cvars::anisotropic_override > -1 && cvars::anisotropic_override < 6 &&
|
||||||
|
has_mips && !mip_base_map && min_mag_linear &&
|
||||||
|
mip_filter_bilinear_or_trilinear) {
|
||||||
|
aniso_filter = xenos::AnisoFilter(cvars::anisotropic_override);
|
||||||
|
}
|
||||||
aniso_filter = std::min(aniso_filter, xenos::AnisoFilter::kMax_16_1);
|
aniso_filter = std::min(aniso_filter, xenos::AnisoFilter::kMax_16_1);
|
||||||
parameters.aniso_filter = aniso_filter;
|
parameters.aniso_filter = aniso_filter;
|
||||||
xenos::TextureFilter mip_filter =
|
|
||||||
binding.mip_filter == xenos::TextureFilter::kUseFetchConst
|
|
||||||
? fetch.mip_filter
|
|
||||||
: binding.mip_filter;
|
|
||||||
if (aniso_filter != xenos::AnisoFilter::kDisabled) {
|
if (aniso_filter != xenos::AnisoFilter::kDisabled) {
|
||||||
parameters.mag_linear = 1;
|
parameters.mag_linear = 1;
|
||||||
parameters.min_linear = 1;
|
parameters.min_linear = 1;
|
||||||
parameters.mip_linear = 1;
|
parameters.mip_linear = 1;
|
||||||
} else {
|
} else {
|
||||||
xenos::TextureFilter mag_filter =
|
|
||||||
binding.mag_filter == xenos::TextureFilter::kUseFetchConst
|
|
||||||
? fetch.mag_filter
|
|
||||||
: binding.mag_filter;
|
|
||||||
parameters.mag_linear = mag_filter == xenos::TextureFilter::kLinear;
|
parameters.mag_linear = mag_filter == xenos::TextureFilter::kLinear;
|
||||||
xenos::TextureFilter min_filter =
|
|
||||||
binding.min_filter == xenos::TextureFilter::kUseFetchConst
|
|
||||||
? fetch.min_filter
|
|
||||||
: binding.min_filter;
|
|
||||||
parameters.min_linear = min_filter == xenos::TextureFilter::kLinear;
|
parameters.min_linear = min_filter == xenos::TextureFilter::kLinear;
|
||||||
parameters.mip_linear = mip_filter == xenos::TextureFilter::kLinear;
|
parameters.mip_linear = mip_filter == xenos::TextureFilter::kLinear;
|
||||||
}
|
}
|
||||||
parameters.mip_base_map = mip_filter == xenos::TextureFilter::kBaseMap;
|
parameters.mip_base_map = mip_base_map;
|
||||||
|
|
||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
#include "xenia/base/cvar.h"
|
#include "xenia/base/cvar.h"
|
||||||
#include "xenia/base/math.h"
|
#include "xenia/base/math.h"
|
||||||
#include "xenia/gpu/dxbc_shader.h"
|
#include "xenia/gpu/dxbc_shader.h"
|
||||||
#include "xenia/gpu/gpu_flags.h"
|
|
||||||
#include "xenia/gpu/xenos.h"
|
#include "xenia/gpu/xenos.h"
|
||||||
#include "xenia/ui/graphics_provider.h"
|
#include "xenia/ui/graphics_provider.h"
|
||||||
|
|
||||||
@@ -1379,10 +1378,7 @@ void DxbcShaderTranslator::PostTranslation() {
|
|||||||
shader_binding.mag_filter = translator_binding.mag_filter;
|
shader_binding.mag_filter = translator_binding.mag_filter;
|
||||||
shader_binding.min_filter = translator_binding.min_filter;
|
shader_binding.min_filter = translator_binding.min_filter;
|
||||||
shader_binding.mip_filter = translator_binding.mip_filter;
|
shader_binding.mip_filter = translator_binding.mip_filter;
|
||||||
shader_binding.aniso_filter =
|
shader_binding.aniso_filter = translator_binding.aniso_filter;
|
||||||
cvars::anisotropic_override > -1 && cvars::anisotropic_override < 6
|
|
||||||
? xenos::AnisoFilter(cvars::anisotropic_override)
|
|
||||||
: translator_binding.aniso_filter;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,8 +72,10 @@ DEFINE_int32(
|
|||||||
"GPU");
|
"GPU");
|
||||||
|
|
||||||
DEFINE_int32(anisotropic_override, -1,
|
DEFINE_int32(anisotropic_override, -1,
|
||||||
"Level of anisotropic filtering enforced on all texture fetch "
|
"Forces anisotropic filtering (AF) for eligible textures.\n"
|
||||||
"instructions.\n"
|
"Higher values keep textures sharper at oblique angles at the "
|
||||||
|
"cost of GPU bandwidth, though most GPUs handle up to 16x fine.\n"
|
||||||
|
"In rare cases, forcing AF can introduce visual artifacts.\n"
|
||||||
" -1 = No override\n"
|
" -1 = No override\n"
|
||||||
" 0 = Disable anisotropic filtering\n"
|
" 0 = Disable anisotropic filtering\n"
|
||||||
" 1 = Force 1x anisotropic filtering\n"
|
" 1 = Force 1x anisotropic filtering\n"
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
#include "xenia/base/assert.h"
|
#include "xenia/base/assert.h"
|
||||||
#include "xenia/base/math.h"
|
#include "xenia/base/math.h"
|
||||||
#include "xenia/base/string_buffer.h"
|
#include "xenia/base/string_buffer.h"
|
||||||
#include "xenia/gpu/gpu_flags.h"
|
|
||||||
#include "xenia/gpu/spirv_shader.h"
|
#include "xenia/gpu/spirv_shader.h"
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
@@ -808,10 +807,7 @@ void SpirvShaderTranslator::PostTranslation() {
|
|||||||
shader_binding.mag_filter = translator_binding.mag_filter;
|
shader_binding.mag_filter = translator_binding.mag_filter;
|
||||||
shader_binding.min_filter = translator_binding.min_filter;
|
shader_binding.min_filter = translator_binding.min_filter;
|
||||||
shader_binding.mip_filter = translator_binding.mip_filter;
|
shader_binding.mip_filter = translator_binding.mip_filter;
|
||||||
shader_binding.aniso_filter =
|
shader_binding.aniso_filter = translator_binding.aniso_filter;
|
||||||
cvars::anisotropic_override > -1 && cvars::anisotropic_override < 6
|
|
||||||
? xenos::AnisoFilter(cvars::anisotropic_override)
|
|
||||||
: translator_binding.aniso_filter;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -680,14 +680,24 @@ VulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters(
|
|||||||
binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst
|
binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst
|
||||||
? fetch.aniso_filter
|
? fetch.aniso_filter
|
||||||
: binding.aniso_filter;
|
: binding.aniso_filter;
|
||||||
parameters.aniso_filter = std::min(aniso_filter, max_anisotropy_);
|
|
||||||
parameters.mip_base_map = mip_filter == xenos::TextureFilter::kBaseMap;
|
parameters.mip_base_map = mip_filter == xenos::TextureFilter::kBaseMap;
|
||||||
|
|
||||||
uint32_t mip_min_level;
|
uint32_t mip_min_level, mip_max_level;
|
||||||
texture_util::GetSubresourcesFromFetchConstant(fetch, nullptr, nullptr,
|
texture_util::GetSubresourcesFromFetchConstant(
|
||||||
nullptr, nullptr, nullptr,
|
fetch, nullptr, nullptr, nullptr, nullptr, nullptr, &mip_min_level,
|
||||||
&mip_min_level, nullptr);
|
&mip_max_level);
|
||||||
parameters.mip_min_level = mip_min_level;
|
parameters.mip_min_level = mip_min_level;
|
||||||
|
bool has_mips = mip_max_level > mip_min_level;
|
||||||
|
// Apply anisotropic override, but only for mipmapped textures
|
||||||
|
// that are already using bilinear/trilinear filtering.
|
||||||
|
if (cvars::anisotropic_override > -1 && cvars::anisotropic_override < 6 &&
|
||||||
|
has_mips && !parameters.mip_base_map && parameters.mag_linear &&
|
||||||
|
parameters.min_linear &&
|
||||||
|
(mip_filter == xenos::TextureFilter::kPoint ||
|
||||||
|
mip_filter == xenos::TextureFilter::kLinear)) {
|
||||||
|
aniso_filter = xenos::AnisoFilter(cvars::anisotropic_override);
|
||||||
|
}
|
||||||
|
parameters.aniso_filter = std::min(aniso_filter, max_anisotropy_);
|
||||||
|
|
||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user