Merge pull request #12825 from iwubcode/texture_cache_sampler_split
VideoCommon: pull texture sampler out of texture cache for later reuse
This commit is contained in:
commit
a57962cedb
|
@ -1012,8 +1012,8 @@ static bool IsAnisostropicEnhancementSafe(const TexMode0& tm0)
|
||||||
return !(tm0.min_filter == FilterMode::Near && tm0.mag_filter == FilterMode::Near);
|
return !(tm0.min_filter == FilterMode::Near && tm0.mag_filter == FilterMode::Near);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetSamplerState(u32 index, float custom_tex_scale, bool custom_tex,
|
SamplerState TextureCacheBase::GetSamplerState(u32 index, float custom_tex_scale, bool custom_tex,
|
||||||
bool has_arbitrary_mips)
|
bool has_arbitrary_mips)
|
||||||
{
|
{
|
||||||
const TexMode0& tm0 = bpmem.tex.GetUnit(index).texMode0;
|
const TexMode0& tm0 = bpmem.tex.GetUnit(index).texMode0;
|
||||||
|
|
||||||
|
@ -1073,13 +1073,11 @@ static void SetSamplerState(u32 index, float custom_tex_scale, bool custom_tex,
|
||||||
state.tm0.anisotropic_filtering = false;
|
state.tm0.anisotropic_filtering = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_gfx->SetSamplerState(index, state);
|
return state;
|
||||||
auto& system = Core::System::GetInstance();
|
|
||||||
auto& pixel_shader_manager = system.GetPixelShaderManager();
|
|
||||||
pixel_shader_manager.SetSamplerState(index, state.tm0.hex, state.tm1.hex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCacheBase::BindTextures(BitSet32 used_textures)
|
void TextureCacheBase::BindTextures(BitSet32 used_textures,
|
||||||
|
const std::array<SamplerState, 8>& samplers)
|
||||||
{
|
{
|
||||||
auto& system = Core::System::GetInstance();
|
auto& system = Core::System::GetInstance();
|
||||||
auto& pixel_shader_manager = system.GetPixelShaderManager();
|
auto& pixel_shader_manager = system.GetPixelShaderManager();
|
||||||
|
@ -1091,8 +1089,9 @@ void TextureCacheBase::BindTextures(BitSet32 used_textures)
|
||||||
g_gfx->SetTexture(i, tentry->texture.get());
|
g_gfx->SetTexture(i, tentry->texture.get());
|
||||||
pixel_shader_manager.SetTexDims(i, tentry->native_width, tentry->native_height);
|
pixel_shader_manager.SetTexDims(i, tentry->native_width, tentry->native_height);
|
||||||
|
|
||||||
const float custom_tex_scale = tentry->GetWidth() / float(tentry->native_width);
|
auto& state = samplers[i];
|
||||||
SetSamplerState(i, custom_tex_scale, tentry->is_custom_tex, tentry->has_arbitrary_mips);
|
g_gfx->SetSamplerState(i, state);
|
||||||
|
pixel_shader_manager.SetSamplerState(i, state.tm0.hex, state.tm1.hex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
class AbstractFramebuffer;
|
class AbstractFramebuffer;
|
||||||
class AbstractStagingTexture;
|
class AbstractStagingTexture;
|
||||||
class PointerWrap;
|
class PointerWrap;
|
||||||
|
struct SamplerState;
|
||||||
struct VideoConfig;
|
struct VideoConfig;
|
||||||
|
|
||||||
namespace VideoCommon
|
namespace VideoCommon
|
||||||
|
@ -282,7 +283,7 @@ public:
|
||||||
RcTcacheEntry GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
|
RcTcacheEntry GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
|
||||||
MathUtil::Rectangle<int>* display_rect);
|
MathUtil::Rectangle<int>* display_rect);
|
||||||
|
|
||||||
virtual void BindTextures(BitSet32 used_textures);
|
virtual void BindTextures(BitSet32 used_textures, const std::array<SamplerState, 8>& samplers);
|
||||||
void CopyRenderTargetToTexture(u32 dstAddr, EFBCopyFormat dstFormat, u32 width, u32 height,
|
void CopyRenderTargetToTexture(u32 dstAddr, EFBCopyFormat dstFormat, u32 width, u32 height,
|
||||||
u32 dstStride, bool is_depth_copy,
|
u32 dstStride, bool is_depth_copy,
|
||||||
const MathUtil::Rectangle<int>& srcRect, bool isIntensity,
|
const MathUtil::Rectangle<int>& srcRect, bool isIntensity,
|
||||||
|
@ -308,6 +309,10 @@ public:
|
||||||
static bool AllCopyFilterCoefsNeeded(const std::array<u32, 3>& coefficients);
|
static bool AllCopyFilterCoefsNeeded(const std::array<u32, 3>& coefficients);
|
||||||
static bool CopyFilterCanOverflow(const std::array<u32, 3>& coefficients);
|
static bool CopyFilterCanOverflow(const std::array<u32, 3>& coefficients);
|
||||||
|
|
||||||
|
// Get a new sampler state
|
||||||
|
static SamplerState GetSamplerState(u32 index, float custom_tex_scale, bool custom_tex,
|
||||||
|
bool has_arbitrary_mips);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Decodes the specified data to the GPU texture specified by entry.
|
// Decodes the specified data to the GPU texture specified by entry.
|
||||||
// Returns false if the configuration is not supported.
|
// Returns false if the configuration is not supported.
|
||||||
|
|
|
@ -563,13 +563,19 @@ void VertexManagerBase::Flush()
|
||||||
const auto used_textures = UsedTextures();
|
const auto used_textures = UsedTextures();
|
||||||
std::vector<std::string> texture_names;
|
std::vector<std::string> texture_names;
|
||||||
Common::SmallVector<u32, 8> texture_units;
|
Common::SmallVector<u32, 8> texture_units;
|
||||||
|
std::array<SamplerState, 8> samplers;
|
||||||
if (!m_cull_all)
|
if (!m_cull_all)
|
||||||
{
|
{
|
||||||
if (!g_ActiveConfig.bGraphicMods)
|
if (!g_ActiveConfig.bGraphicMods)
|
||||||
{
|
{
|
||||||
for (const u32 i : used_textures)
|
for (const u32 i : used_textures)
|
||||||
{
|
{
|
||||||
g_texture_cache->Load(TextureInfo::FromStage(i));
|
const auto cache_entry = g_texture_cache->Load(TextureInfo::FromStage(i));
|
||||||
|
if (!cache_entry)
|
||||||
|
continue;
|
||||||
|
const float custom_tex_scale = cache_entry->GetWidth() / float(cache_entry->native_width);
|
||||||
|
samplers[i] = TextureCacheBase::GetSamplerState(
|
||||||
|
i, custom_tex_scale, cache_entry->is_custom_tex, cache_entry->has_arbitrary_mips);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -585,6 +591,10 @@ void VertexManagerBase::Flush()
|
||||||
texture_names.push_back(cache_entry->texture_info_name);
|
texture_names.push_back(cache_entry->texture_info_name);
|
||||||
texture_units.push_back(i);
|
texture_units.push_back(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const float custom_tex_scale = cache_entry->GetWidth() / float(cache_entry->native_width);
|
||||||
|
samplers[i] = TextureCacheBase::GetSamplerState(
|
||||||
|
i, custom_tex_scale, cache_entry->is_custom_tex, cache_entry->has_arbitrary_mips);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -633,7 +643,7 @@ void VertexManagerBase::Flush()
|
||||||
// Texture loading can cause palettes to be applied (-> uniforms -> draws).
|
// Texture loading can cause palettes to be applied (-> uniforms -> draws).
|
||||||
// Palette application does not use vertices, only a full-screen quad, so this is okay.
|
// Palette application does not use vertices, only a full-screen quad, so this is okay.
|
||||||
// Same with GPU texture decoding, which uses compute shaders.
|
// Same with GPU texture decoding, which uses compute shaders.
|
||||||
g_texture_cache->BindTextures(used_textures);
|
g_texture_cache->BindTextures(used_textures, samplers);
|
||||||
|
|
||||||
if (PerfQueryBase::ShouldEmulate())
|
if (PerfQueryBase::ShouldEmulate())
|
||||||
g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
|
g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
|
||||||
|
|
Loading…
Reference in New Issue