From 196d152ad761861dab000db87b90e10f62c6fb91 Mon Sep 17 00:00:00 2001 From: skidau Date: Sat, 8 Jun 2013 11:28:54 +1000 Subject: [PATCH] Invalidate the texture cache using the GPU thread when the CPU thread makes a request. Fixes issue 6350. --- Source/Core/Core/Src/HLE/HLE_Misc.cpp | 2 +- Source/Core/VideoCommon/Src/TextureCacheBase.cpp | 13 ++++++++++++- Source/Core/VideoCommon/Src/TextureCacheBase.h | 3 ++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/Src/HLE/HLE_Misc.cpp b/Source/Core/Core/Src/HLE/HLE_Misc.cpp index 6db9704be8..c8323ca6c4 100644 --- a/Source/Core/Core/Src/HLE/HLE_Misc.cpp +++ b/Source/Core/Core/Src/HLE/HLE_Misc.cpp @@ -311,7 +311,7 @@ void ExecuteDOL(u8* dolFile, u32 fileSize) } PowerPC::ppcState.iCache.Reset(); - TextureCache::Invalidate(); + TextureCache::RequestInvalidateTextureCache(); CWII_IPC_HLE_Device_usb_oh1_57e_305* s_Usb = GetUsbPointer(); size_t size = s_Usb->m_WiiMotes.size(); diff --git a/Source/Core/VideoCommon/Src/TextureCacheBase.cpp b/Source/Core/VideoCommon/Src/TextureCacheBase.cpp index d5d21f89d0..7d5b9354ad 100644 --- a/Source/Core/VideoCommon/Src/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/Src/TextureCacheBase.cpp @@ -32,6 +32,7 @@ TextureCache::TexCache TextureCache::textures; TextureCache::BackupConfig TextureCache::backup_config; +bool invalidate_texture_cache_requested; TextureCache::TCacheEntryBase::~TCacheEntryBase() { @@ -49,6 +50,13 @@ TextureCache::TextureCache() HiresTextures::Init(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); SetHash64Function(g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures); + + invalidate_texture_cache_requested = false; +} + +void TextureCache::RequestInvalidateTextureCache() +{ + invalidate_texture_cache_requested = true; } void TextureCache::Invalidate() @@ -80,7 +88,8 @@ void TextureCache::OnConfigChanged(VideoConfig& config) 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) + config.bHiresTextures != backup_config.s_hires_textures || + invalidate_texture_cache_requested) { g_texture_cache->Invalidate(); @@ -89,6 +98,8 @@ void TextureCache::OnConfigChanged(VideoConfig& config) SetHash64Function(g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures); TexDecoder_SetTexFmtOverlayOptions(g_ActiveConfig.bTexFmtOverlayEnable, g_ActiveConfig.bTexFmtOverlayCenter); + + invalidate_texture_cache_requested = false; } // TODO: Probably shouldn't clear all render targets here, just mark them dirty or something. diff --git a/Source/Core/VideoCommon/Src/TextureCacheBase.h b/Source/Core/VideoCommon/Src/TextureCacheBase.h index acfb2e94b2..1afcb8cd2d 100644 --- a/Source/Core/VideoCommon/Src/TextureCacheBase.h +++ b/Source/Core/VideoCommon/Src/TextureCacheBase.h @@ -107,6 +107,8 @@ public: static void CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat, unsigned int srcFormat, const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf); + static void RequestInvalidateTextureCache(); + protected: TextureCache(); @@ -118,7 +120,6 @@ private: static PC_TexFormat LoadCustomTexture(u64 tex_hash, int texformat, unsigned int level, unsigned int& width, unsigned int& height); static void DumpTexture(TCacheEntryBase* entry, unsigned int level); - typedef std::map TexCache; static TexCache textures;