mirror of https://github.com/PCSX2/pcsx2.git
GS: Fine gained change detection for mips/trifilter/anisotropy
This commit is contained in:
parent
0872d024f9
commit
ec0543335e
|
@ -731,7 +731,6 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config)
|
||||||
|
|
||||||
// Options which aren't using the global struct yet, so we need to recreate all GS objects.
|
// Options which aren't using the global struct yet, so we need to recreate all GS objects.
|
||||||
if (
|
if (
|
||||||
GSConfig.GPUPaletteConversion != old_config.GPUPaletteConversion ||
|
|
||||||
GSConfig.ConservativeFramebuffer != old_config.ConservativeFramebuffer ||
|
GSConfig.ConservativeFramebuffer != old_config.ConservativeFramebuffer ||
|
||||||
GSConfig.AutoFlushSW != old_config.AutoFlushSW ||
|
GSConfig.AutoFlushSW != old_config.AutoFlushSW ||
|
||||||
GSConfig.PreloadFrameWithGSData != old_config.PreloadFrameWithGSData ||
|
GSConfig.PreloadFrameWithGSData != old_config.PreloadFrameWithGSData ||
|
||||||
|
@ -754,9 +753,7 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config)
|
||||||
GSConfig.SaveDepth != old_config.SaveDepth ||
|
GSConfig.SaveDepth != old_config.SaveDepth ||
|
||||||
|
|
||||||
GSConfig.UpscaleMultiplier != old_config.UpscaleMultiplier ||
|
GSConfig.UpscaleMultiplier != old_config.UpscaleMultiplier ||
|
||||||
GSConfig.HWMipmap != old_config.HWMipmap ||
|
|
||||||
GSConfig.CRCHack != old_config.CRCHack ||
|
GSConfig.CRCHack != old_config.CRCHack ||
|
||||||
GSConfig.MaxAnisotropy != old_config.MaxAnisotropy ||
|
|
||||||
GSConfig.SWExtraThreads != old_config.SWExtraThreads ||
|
GSConfig.SWExtraThreads != old_config.SWExtraThreads ||
|
||||||
GSConfig.SWExtraThreadsHeight != old_config.SWExtraThreadsHeight ||
|
GSConfig.SWExtraThreadsHeight != old_config.SWExtraThreadsHeight ||
|
||||||
|
|
||||||
|
@ -781,6 +778,25 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config)
|
||||||
|
|
||||||
// This is where we would do finer-grained checks in the future.
|
// This is where we would do finer-grained checks in the future.
|
||||||
// For example, flushing the texture cache when mipmap settings change.
|
// For example, flushing the texture cache when mipmap settings change.
|
||||||
|
|
||||||
|
if (GSConfig.HWMipmap != old_config.HWMipmap || GSConfig.CRCHack != old_config.CRCHack)
|
||||||
|
{
|
||||||
|
// for automatic mipmaps, we need to reload the crc
|
||||||
|
s_gs->SetGameCRC(s_gs->GetGameCRC(), s_gs->GetGameCRCOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
// reload texture cache when trilinear filtering or mipmap options change
|
||||||
|
if (GSConfig.HWMipmap != old_config.HWMipmap ||
|
||||||
|
GSConfig.UserHacks_TriFilter != old_config.UserHacks_TriFilter ||
|
||||||
|
GSConfig.GPUPaletteConversion != old_config.GPUPaletteConversion)
|
||||||
|
{
|
||||||
|
s_gs->PurgeTextureCache();
|
||||||
|
s_gs->PurgePool();
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear out the sampler cache when AF options change, since the anisotropy gets baked into them
|
||||||
|
if (GSConfig.MaxAnisotropy != old_config.MaxAnisotropy)
|
||||||
|
g_gs_device->ClearSamplerCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSwitchRenderer(GSRendererType new_renderer)
|
void GSSwitchRenderer(GSRendererType new_renderer)
|
||||||
|
|
|
@ -566,6 +566,8 @@ void GSRenderer::KeyEvent(const HostKeyEvent& e)
|
||||||
#define VK_HOME XK_Home
|
#define VK_HOME XK_Home
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// NOTE: These are all BROKEN! They mess with GS thread state from the UI thread.
|
||||||
|
|
||||||
switch (e.key)
|
switch (e.key)
|
||||||
{
|
{
|
||||||
case VK_F5:
|
case VK_F5:
|
||||||
|
@ -593,6 +595,10 @@ void GSRenderer::PurgePool()
|
||||||
g_gs_device->PurgePool();
|
g_gs_device->PurgePool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GSRenderer::PurgeTextureCache()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
bool GSRenderer::SaveSnapshotToMemory(u32 width, u32 height, std::vector<u32>* pixels)
|
bool GSRenderer::SaveSnapshotToMemory(u32 width, u32 height, std::vector<u32>* pixels)
|
||||||
{
|
{
|
||||||
GSTexture* const current = g_gs_device->GetCurrent();
|
GSTexture* const current = g_gs_device->GetCurrent();
|
||||||
|
|
|
@ -56,7 +56,8 @@ public:
|
||||||
virtual bool BeginCapture(std::string& filename);
|
virtual bool BeginCapture(std::string& filename);
|
||||||
virtual void EndCapture();
|
virtual void EndCapture();
|
||||||
|
|
||||||
void PurgePool();
|
virtual void PurgePool() override;
|
||||||
|
virtual void PurgeTextureCache();
|
||||||
|
|
||||||
bool SaveSnapshotToMemory(u32 width, u32 height, std::vector<u32>* pixels);
|
bool SaveSnapshotToMemory(u32 width, u32 height, std::vector<u32>* pixels);
|
||||||
};
|
};
|
||||||
|
|
|
@ -192,6 +192,12 @@ void GSRendererHW::Destroy()
|
||||||
GSRenderer::Destroy();
|
GSRenderer::Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GSRendererHW::PurgeTextureCache()
|
||||||
|
{
|
||||||
|
GSRenderer::PurgeTextureCache();
|
||||||
|
m_tc->RemoveAll();
|
||||||
|
}
|
||||||
|
|
||||||
void GSRendererHW::SetGameCRC(u32 crc, int options)
|
void GSRendererHW::SetGameCRC(u32 crc, int options)
|
||||||
{
|
{
|
||||||
GSRenderer::SetGameCRC(crc, options);
|
GSRenderer::SetGameCRC(crc, options);
|
||||||
|
|
|
@ -191,6 +191,8 @@ public:
|
||||||
void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) override;
|
void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) override;
|
||||||
void Draw() override;
|
void Draw() override;
|
||||||
|
|
||||||
|
void PurgeTextureCache() override;
|
||||||
|
|
||||||
// Called by the texture cache to know if current texture is useful
|
// Called by the texture cache to know if current texture is useful
|
||||||
virtual bool IsDummyTexture() const { return false; }
|
virtual bool IsDummyTexture() const { return false; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#define XXH_INLINE_ALL 1
|
#define XXH_INLINE_ALL 1
|
||||||
#include "xxhash.h"
|
#include "xxhash.h"
|
||||||
|
|
||||||
bool GSTextureCache::m_paltex = false;
|
|
||||||
bool GSTextureCache::m_disable_partial_invalidation = false;
|
bool GSTextureCache::m_disable_partial_invalidation = false;
|
||||||
bool GSTextureCache::m_wrap_gs_mem = false;
|
bool GSTextureCache::m_wrap_gs_mem = false;
|
||||||
|
|
||||||
|
@ -53,8 +52,6 @@ GSTextureCache::GSTextureCache(GSRenderer* r)
|
||||||
m_wrap_gs_mem = false;
|
m_wrap_gs_mem = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_paltex = theApp.GetConfigB("paltex");
|
|
||||||
|
|
||||||
// In theory 4MB is enough but 9MB is safer for overflow (8MB
|
// In theory 4MB is enough but 9MB is safer for overflow (8MB
|
||||||
// isn't enough in custom resolution)
|
// isn't enough in custom resolution)
|
||||||
// Test: onimusha 3 PAL 60Hz
|
// Test: onimusha 3 PAL 60Hz
|
||||||
|
@ -1612,7 +1609,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_paltex && psm.pal > 0)
|
if (GSConfig.GPUPaletteConversion && psm.pal > 0)
|
||||||
{
|
{
|
||||||
src->m_texture = g_gs_device->CreateTexture(tw, th, false, GSTexture::Format::UNorm8);
|
src->m_texture = g_gs_device->CreateTexture(tw, th, false, GSTexture::Format::UNorm8);
|
||||||
AttachPaletteToSource(src, psm.pal, true);
|
AttachPaletteToSource(src, psm.pal, true);
|
||||||
|
|
|
@ -221,7 +221,6 @@ protected:
|
||||||
PaletteMap m_palette_map;
|
PaletteMap m_palette_map;
|
||||||
SourceMap m_src;
|
SourceMap m_src;
|
||||||
FastList<Target*> m_dst[2];
|
FastList<Target*> m_dst[2];
|
||||||
static bool m_paltex;
|
|
||||||
bool m_preload_frame;
|
bool m_preload_frame;
|
||||||
u8* m_temp;
|
u8* m_temp;
|
||||||
bool m_can_convert_depth;
|
bool m_can_convert_depth;
|
||||||
|
|
Loading…
Reference in New Issue