Merge branch 'awesome-texcache-cleanups-and-fixes'

This commit is contained in:
NeoBrainX 2012-06-21 22:20:48 +02:00
commit 29e21026e9
16 changed files with 90 additions and 50 deletions

View File

@ -334,7 +334,7 @@ void GFXDebuggerPanel::OnClearScreenButton(wxCommandEvent& event)
void GFXDebuggerPanel::OnClearTextureCacheButton(wxCommandEvent& event) void GFXDebuggerPanel::OnClearTextureCacheButton(wxCommandEvent& event)
{ {
TextureCache::Invalidate(false); TextureCache::Invalidate();
} }
void GFXDebuggerPanel::OnClearVertexShaderCacheButton(wxCommandEvent& event) void GFXDebuggerPanel::OnClearVertexShaderCacheButton(wxCommandEvent& event)

View File

@ -66,8 +66,6 @@ void VideoConfigDiag::Event_Close(wxCloseEvent& ev)
g_Config.Save((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str()); g_Config.Save((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str());
EndModal(wxID_OK); EndModal(wxID_OK);
TextureCache::InvalidateDefer(); // For settings like hi-res textures/texture format/etc.
} }
wxString backend_desc = wxTRANSLATE("Selects what graphics API to use internally.\nDirect3D 9 usually is the fastest one. OpenGL is more accurate though. Direct3D 11 is somewhere between the two.\nNote that the Direct3D backends are only available on Windows.\n\nIf unsure, use Direct3D 9."); wxString backend_desc = wxTRANSLATE("Selects what graphics API to use internally.\nDirect3D 9 usually is the fastest one. OpenGL is more accurate though. Direct3D 11 is somewhere between the two.\nNote that the Direct3D backends are only available on Windows.\n\nIf unsure, use Direct3D 9.");

View File

@ -203,7 +203,7 @@ void VideoBackendHardware::DoState(PointerWrap& p)
// Clear all caches that touch RAM // Clear all caches that touch RAM
// (? these don't appear to touch any emulation state that gets saved. moved to on load only.) // (? these don't appear to touch any emulation state that gets saved. moved to on load only.)
TextureCache::Invalidate(false); TextureCache::Invalidate();
VertexLoaderManager::MarkAllDirty(); VertexLoaderManager::MarkAllDirty();
} }
} }

View File

@ -82,9 +82,11 @@ bool Renderer::s_EnableDLCachingAfterRecording;
unsigned int Renderer::prev_efb_format = (unsigned int)-1; unsigned int Renderer::prev_efb_format = (unsigned int)-1;
Renderer::Renderer() : frame_data(NULL), bLastFrameDumped(false) Renderer::Renderer() : frame_data(NULL), bLastFrameDumped(false)
{ {
UpdateActiveConfig(); UpdateActiveConfig();
TextureCache::OnConfigChanged(g_ActiveConfig);
#if defined _WIN32 || defined HAVE_LIBAV #if defined _WIN32 || defined HAVE_LIBAV
bAVIDumping = false; bAVIDumping = false;
@ -130,11 +132,6 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
g_renderer->Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight,sourceRc,Gamma); g_renderer->Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight,sourceRc,Gamma);
Common::AtomicStoreRelease(s_swapRequested, false); Common::AtomicStoreRelease(s_swapRequested, false);
} }
if (TextureCache::DeferredInvalidate)
{
TextureCache::Invalidate(false);
}
} }
void Renderer::CalculateTargetScale(int x, int y, int &scaledX, int &scaledY) void Renderer::CalculateTargetScale(int x, int y, int &scaledX, int &scaledY)

View File

@ -42,7 +42,9 @@ GC_ALIGNED16(u8 *TextureCache::temp) = NULL;
unsigned int TextureCache::temp_size; unsigned int TextureCache::temp_size;
TextureCache::TexCache TextureCache::textures; TextureCache::TexCache TextureCache::textures;
bool TextureCache::DeferredInvalidate;
TextureCache::BackupConfig TextureCache::backup_config;
TextureCache::TCacheEntryBase::~TCacheEntryBase() TextureCache::TCacheEntryBase::~TCacheEntryBase()
{ {
@ -59,34 +61,19 @@ TextureCache::TextureCache()
SetHash64Function(g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures); SetHash64Function(g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures);
} }
void TextureCache::Invalidate(bool shutdown) void TextureCache::Invalidate()
{ {
TexCache::iterator TexCache::iterator
iter = textures.begin(), iter = textures.begin(),
tcend = textures.end(); tcend = textures.end();
for (; iter != tcend; ++iter) for (; iter != tcend; ++iter)
{
if (shutdown)
iter->second->addr = 0;
delete iter->second; delete iter->second;
}
textures.clear(); textures.clear();
if(g_ActiveConfig.bHiresTextures && !g_ActiveConfig.bDumpTextures)
HiresTextures::Init(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str());
SetHash64Function(g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures);
DeferredInvalidate = false;
}
void TextureCache::InvalidateDefer()
{
DeferredInvalidate = true;
} }
TextureCache::~TextureCache() TextureCache::~TextureCache()
{ {
Invalidate(true);
if (temp) if (temp)
{ {
FreeAlignedMemory(temp); FreeAlignedMemory(temp);
@ -94,6 +81,48 @@ TextureCache::~TextureCache()
} }
} }
void TextureCache::OnConfigChanged(VideoConfig& config)
{
if (!g_texture_cache)
goto skip_checks;
// TODO: Invalidating texcache is really stupid in some of these cases
if (config.iSafeTextureCache_ColorSamples != backup_config.s_colorsamples ||
config.bTexFmtOverlayEnable != backup_config.s_texfmt_overlay ||
config.bTexFmtOverlayCenter != backup_config.s_texfmt_overlay_center ||
config.bHiresTextures != backup_config.s_hires_textures)
{
g_texture_cache->Invalidate();
if(g_ActiveConfig.bHiresTextures)
HiresTextures::Init(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str());
SetHash64Function(g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures);
TexDecoder_SetTexFmtOverlayOptions(g_ActiveConfig.bTexFmtOverlayEnable, g_ActiveConfig.bTexFmtOverlayCenter);
}
// TODO: Probably shouldn't clear all render targets here, just mark them dirty or something.
if (config.bEFBCopyCacheEnable != backup_config.s_copy_cache_enable || // TODO: not sure if this is needed?
config.bCopyEFBToTexture != backup_config.s_copy_efb_to_texture ||
config.bCopyEFBScaled != backup_config.s_copy_efb_scaled ||
config.bEFBCopyEnable != backup_config.s_copy_efb ||
config.iEFBScale != backup_config.s_efb_scale)
{
g_texture_cache->ClearRenderTargets();
}
skip_checks:
backup_config.s_colorsamples = config.iSafeTextureCache_ColorSamples;
backup_config.s_copy_efb_to_texture = config.bCopyEFBToTexture;
backup_config.s_copy_efb_scaled = config.bCopyEFBScaled;
backup_config.s_copy_efb = config.bEFBCopyEnable;
backup_config.s_efb_scale = config.iEFBScale;
backup_config.s_texfmt_overlay = config.bTexFmtOverlayEnable;
backup_config.s_texfmt_overlay_center = config.bTexFmtOverlayCenter;
backup_config.s_hires_textures = config.bHiresTextures;
backup_config.s_copy_cache_enable = config.bEFBCopyCacheEnable;
}
void TextureCache::Cleanup() void TextureCache::Cleanup()
{ {
TexCache::iterator iter = textures.begin(); TexCache::iterator iter = textures.begin();
@ -326,8 +355,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int stage,
// 2. a) For EFB copies, only the hash and the texture address need to match // 2. a) For EFB copies, only the hash and the texture address need to match
if (entry->IsEfbCopy() && tex_hash == entry->hash && address == entry->addr) if (entry->IsEfbCopy() && tex_hash == entry->hash && address == entry->addr)
{ {
if (entry->type != TCET_EC_VRAM) entry->type = TCET_EC_VRAM;
entry->type = TCET_NORMAL;
// TODO: Print a warning if the format changes! In this case, we could reinterpret the internal texture object data to the new pixel format (similiar to what is already being done in Renderer::ReinterpretPixelFormat()) // TODO: Print a warning if the format changes! In this case, we could reinterpret the internal texture object data to the new pixel format (similiar to what is already being done in Renderer::ReinterpretPixelFormat())
goto return_entry; goto return_entry;
@ -734,16 +762,12 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat
TCacheEntryBase *entry = textures[dstAddr]; TCacheEntryBase *entry = textures[dstAddr];
if (entry) if (entry)
{ {
if ((entry->type == TCET_EC_VRAM && entry->virtual_width == scaled_tex_w && entry->virtual_height == scaled_tex_h) if (entry->type == TCET_EC_DYNAMIC && entry->native_width == tex_w && entry->native_height == tex_h)
|| (entry->type == TCET_EC_DYNAMIC && entry->native_width == tex_w && entry->native_height == tex_h))
{ {
if (entry->type == TCET_EC_DYNAMIC) scaled_tex_w = tex_w;
{ scaled_tex_h = tex_h;
scaled_tex_w = tex_w;
scaled_tex_h = tex_h;
}
} }
else else if (!(entry->type == TCET_EC_VRAM && entry->virtual_width == scaled_tex_w && entry->virtual_height == scaled_tex_h))
{ {
// remove it and recreate it as a render target // remove it and recreate it as a render target
delete entry; delete entry;

View File

@ -27,6 +27,8 @@
#include "CommonTypes.h" #include "CommonTypes.h"
struct VideoConfig;
class TextureCache class TextureCache
{ {
public: public:
@ -100,10 +102,10 @@ public:
virtual ~TextureCache(); // needs virtual for DX11 dtor virtual ~TextureCache(); // needs virtual for DX11 dtor
static void OnConfigChanged(VideoConfig& config);
static void Cleanup(); static void Cleanup();
static void Invalidate(bool shutdown); static void Invalidate();
static void InvalidateDefer();
static void InvalidateRange(u32 start_address, u32 size); static void InvalidateRange(u32 start_address, u32 size);
static void MakeRangeDynamic(u32 start_address, u32 size); static void MakeRangeDynamic(u32 start_address, u32 size);
static void ClearRenderTargets(); // currently only used by OGL static void ClearRenderTargets(); // currently only used by OGL
@ -118,8 +120,6 @@ public:
static void CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat, unsigned int srcFormat, static void CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat, unsigned int srcFormat,
const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf); const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf);
static bool DeferredInvalidate;
protected: protected:
TextureCache(); TextureCache();
@ -135,6 +135,19 @@ private:
typedef std::map<u32, TCacheEntryBase*> TexCache; typedef std::map<u32, TCacheEntryBase*> TexCache;
static TexCache textures; static TexCache textures;
// Backup configuration values
static struct BackupConfig {
int s_colorsamples;
bool s_copy_efb_to_texture;
bool s_copy_efb_scaled;
bool s_copy_efb;
int s_efb_scale;
bool s_texfmt_overlay;
bool s_texfmt_overlay_center;
bool s_hires_textures;
bool s_copy_cache_enable;
} backup_config;
}; };
extern TextureCache *g_texture_cache; extern TextureCache *g_texture_cache;

View File

@ -135,8 +135,8 @@ struct VideoConfig
bool bEnablePerPixelDepth; bool bEnablePerPixelDepth;
int iLog; // CONF_ bits int iLog; // CONF_ bits
int iSaveTargetId; int iSaveTargetId; // TODO: Should be dropped
//currently unused: //currently unused:
int iCompileDLsLevel; int iCompileDLsLevel;

View File

@ -1111,6 +1111,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
// Enable configuration changes // Enable configuration changes
UpdateActiveConfig(); UpdateActiveConfig();
TextureCache::OnConfigChanged(g_ActiveConfig);
SetWindowSize(fbWidth, fbHeight); SetWindowSize(fbWidth, fbHeight);

View File

@ -159,13 +159,15 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
u8* dst = Memory::GetPointer(dstAddr); u8* dst = Memory::GetPointer(dstAddr);
size_t encoded_size = g_encoder->Encode(dst, dstFormat, srcFormat, srcRect, isIntensity, scaleByHalf); size_t encoded_size = g_encoder->Encode(dst, dstFormat, srcFormat, srcRect, isIntensity, scaleByHalf);
hash = GetHash64(dst, (int)encoded_size, g_ActiveConfig.iSafeTextureCache_ColorSamples); u64 hash = GetHash64(dst, (int)encoded_size, g_ActiveConfig.iSafeTextureCache_ColorSamples);
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date // Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
if (!g_ActiveConfig.bEFBCopyCacheEnable) if (!g_ActiveConfig.bEFBCopyCacheEnable)
TextureCache::MakeRangeDynamic(addr, (u32)encoded_size); TextureCache::MakeRangeDynamic(addr, (u32)encoded_size);
else if (!TextureCache::Find(addr, hash)) else if (!TextureCache::Find(addr, hash))
TextureCache::MakeRangeDynamic(addr, (u32)encoded_size); TextureCache::MakeRangeDynamic(addr, (u32)encoded_size);
this->hash = hash;
} }
} }

View File

@ -230,6 +230,7 @@ void VideoBackend::Shutdown()
delete g_texture_cache; delete g_texture_cache;
delete g_renderer; delete g_renderer;
g_renderer = NULL; g_renderer = NULL;
g_texture_cache = NULL;
} }
} }

View File

@ -237,7 +237,7 @@ void TeardownDeviceObjects()
D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface()); D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface());
delete g_framebuffer_manager; delete g_framebuffer_manager;
D3D::font.Shutdown(); D3D::font.Shutdown();
TextureCache::Invalidate(false); TextureCache::Invalidate();
VertexLoaderManager::Shutdown(); VertexLoaderManager::Shutdown();
VertexShaderCache::Shutdown(); VertexShaderCache::Shutdown();
PixelShaderCache::Shutdown(); PixelShaderCache::Shutdown();
@ -1117,6 +1117,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
// Enable configuration changes // Enable configuration changes
UpdateActiveConfig(); UpdateActiveConfig();
TextureCache::OnConfigChanged(g_ActiveConfig);
SetWindowSize(fbWidth, fbHeight); SetWindowSize(fbWidth, fbHeight);

View File

@ -164,13 +164,15 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
srcRect); srcRect);
u8* dst = Memory::GetPointer(addr); u8* dst = Memory::GetPointer(addr);
hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples); u64 hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples);
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date // Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
if (!g_ActiveConfig.bEFBCopyCacheEnable) if (!g_ActiveConfig.bEFBCopyCacheEnable)
TextureCache::MakeRangeDynamic(addr,encoded_size); TextureCache::MakeRangeDynamic(addr,encoded_size);
else if (!TextureCache::Find(addr, hash)) else if (!TextureCache::Find(addr, hash))
TextureCache::MakeRangeDynamic(addr,encoded_size); TextureCache::MakeRangeDynamic(addr,encoded_size);
this->hash = hash;
} }
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);

View File

@ -212,6 +212,7 @@ void VideoBackend::Shutdown()
delete g_texture_cache; delete g_texture_cache;
delete g_renderer; delete g_renderer;
g_renderer = NULL; g_renderer = NULL;
g_texture_cache = NULL;
} }
D3D::Shutdown(); D3D::Shutdown();
} }

View File

@ -1437,11 +1437,8 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();
g_Config.iSaveTargetId = 0; g_Config.iSaveTargetId = 0;
// reload textures if these settings changed
if (g_Config.bCopyEFBToTexture != g_ActiveConfig.bCopyEFBToTexture)
TextureCache::ClearRenderTargets();
UpdateActiveConfig(); UpdateActiveConfig();
TextureCache::OnConfigChanged(g_ActiveConfig);
// For testing zbuffer targets. // For testing zbuffer targets.
// Renderer::SetZBufferRender(); // Renderer::SetZBufferRender();

View File

@ -330,13 +330,15 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
srcRect); srcRect);
u8* dst = Memory::GetPointer(addr); u8* dst = Memory::GetPointer(addr);
hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples); u64 hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples);
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date // Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
if (!g_ActiveConfig.bEFBCopyCacheEnable) if (!g_ActiveConfig.bEFBCopyCacheEnable)
TextureCache::MakeRangeDynamic(addr,encoded_size); TextureCache::MakeRangeDynamic(addr,encoded_size);
else if (!TextureCache::Find(addr, hash)) else if (!TextureCache::Find(addr, hash))
TextureCache::MakeRangeDynamic(addr,encoded_size); TextureCache::MakeRangeDynamic(addr,encoded_size);
this->hash = hash;
} }
FramebufferManager::SetFramebuffer(0); FramebufferManager::SetFramebuffer(0);

View File

@ -235,6 +235,7 @@ void VideoBackend::Shutdown()
OpcodeDecoder_Shutdown(); OpcodeDecoder_Shutdown();
delete g_renderer; delete g_renderer;
g_renderer = NULL; g_renderer = NULL;
g_texture_cache = NULL;
} }
OpenGL_Shutdown(); OpenGL_Shutdown();
} }