Merge pull request #1948 from magumagu/remove-efb-cache

Remove EFB to RAM cache, and simplify code.
This commit is contained in:
Markus Wick 2015-01-27 09:42:15 +01:00
commit 43605f8716
9 changed files with 73 additions and 139 deletions

View File

@ -1214,7 +1214,7 @@ void SaveRecording(const std::string& filename)
header.bEFBAccessEnable = g_ActiveConfig.bEFBAccessEnable; header.bEFBAccessEnable = g_ActiveConfig.bEFBAccessEnable;
header.bEFBCopyEnable = g_ActiveConfig.bEFBCopyEnable; header.bEFBCopyEnable = g_ActiveConfig.bEFBCopyEnable;
header.bCopyEFBToTexture = g_ActiveConfig.bCopyEFBToTexture; header.bCopyEFBToTexture = g_ActiveConfig.bCopyEFBToTexture;
header.bEFBCopyCacheEnable = g_ActiveConfig.bEFBCopyCacheEnable; header.bEFBCopyCacheEnable = false;
header.bEFBEmulateFormatChanges = g_ActiveConfig.bEFBEmulateFormatChanges; header.bEFBEmulateFormatChanges = g_ActiveConfig.bEFBEmulateFormatChanges;
header.bUseXFB = g_ActiveConfig.bUseXFB; header.bUseXFB = g_ActiveConfig.bUseXFB;
header.bUseRealXFB = g_ActiveConfig.bUseRealXFB; header.bUseRealXFB = g_ActiveConfig.bUseRealXFB;
@ -1276,7 +1276,6 @@ void SetGraphicsConfig()
g_Config.bEFBAccessEnable = tmpHeader.bEFBAccessEnable; g_Config.bEFBAccessEnable = tmpHeader.bEFBAccessEnable;
g_Config.bEFBCopyEnable = tmpHeader.bEFBCopyEnable; g_Config.bEFBCopyEnable = tmpHeader.bEFBCopyEnable;
g_Config.bCopyEFBToTexture = tmpHeader.bCopyEFBToTexture; g_Config.bCopyEFBToTexture = tmpHeader.bCopyEFBToTexture;
g_Config.bEFBCopyCacheEnable = tmpHeader.bEFBCopyCacheEnable;
g_Config.bEFBEmulateFormatChanges = tmpHeader.bEFBEmulateFormatChanges; g_Config.bEFBEmulateFormatChanges = tmpHeader.bEFBEmulateFormatChanges;
g_Config.bUseXFB = tmpHeader.bUseXFB; g_Config.bUseXFB = tmpHeader.bUseXFB;
g_Config.bUseRealXFB = tmpHeader.bUseRealXFB; g_Config.bUseRealXFB = tmpHeader.bUseRealXFB;

View File

@ -485,13 +485,11 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con
SettingCheckBox* efbcopy_disable = CreateCheckBox(page_hacks, _("Disable"), wxGetTranslation(efb_copy_desc), vconfig.bEFBCopyEnable, true); SettingCheckBox* efbcopy_disable = CreateCheckBox(page_hacks, _("Disable"), wxGetTranslation(efb_copy_desc), vconfig.bEFBCopyEnable, true);
efbcopy_texture = CreateRadioButton(page_hacks, _("Texture"), wxGetTranslation(efb_copy_texture_desc), vconfig.bCopyEFBToTexture, false, wxRB_GROUP); efbcopy_texture = CreateRadioButton(page_hacks, _("Texture"), wxGetTranslation(efb_copy_texture_desc), vconfig.bCopyEFBToTexture, false, wxRB_GROUP);
efbcopy_ram = CreateRadioButton(page_hacks, _("RAM"), wxGetTranslation(efb_copy_ram_desc), vconfig.bCopyEFBToTexture, true); efbcopy_ram = CreateRadioButton(page_hacks, _("RAM"), wxGetTranslation(efb_copy_ram_desc), vconfig.bCopyEFBToTexture, true);
cache_efb_copies = CreateCheckBox(page_hacks, _("Enable Cache"), wxGetTranslation(cache_efb_copies_desc), vconfig.bEFBCopyCacheEnable);
group_efbcopy->Add(efbcopy_disable, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5); group_efbcopy->Add(efbcopy_disable, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5);
group_efbcopy->AddStretchSpacer(1); group_efbcopy->AddStretchSpacer(1);
group_efbcopy->Add(efbcopy_texture, 0, wxRIGHT, 5); group_efbcopy->Add(efbcopy_texture, 0, wxRIGHT, 5);
group_efbcopy->Add(efbcopy_ram, 0, wxRIGHT, 5); group_efbcopy->Add(efbcopy_ram, 0, wxRIGHT, 5);
group_efbcopy->Add(cache_efb_copies, 0, wxRIGHT, 5);
szr_efb->Add(CreateCheckBox(page_hacks, _("Skip EFB Access from CPU"), wxGetTranslation(efb_access_desc), vconfig.bEFBAccessEnable, true), 0, wxBOTTOM | wxLEFT, 5); szr_efb->Add(CreateCheckBox(page_hacks, _("Skip EFB Access from CPU"), wxGetTranslation(efb_access_desc), vconfig.bEFBAccessEnable, true), 0, wxBOTTOM | wxLEFT, 5);
szr_efb->Add(CreateCheckBox(page_hacks, _("Ignore Format Changes"), wxGetTranslation(efb_emulate_format_changes_desc), vconfig.bEFBEmulateFormatChanges, true), 0, wxBOTTOM | wxLEFT, 5); szr_efb->Add(CreateCheckBox(page_hacks, _("Ignore Format Changes"), wxGetTranslation(efb_emulate_format_changes_desc), vconfig.bEFBEmulateFormatChanges, true), 0, wxBOTTOM | wxLEFT, 5);

View File

@ -203,7 +203,6 @@ protected:
// EFB copy // EFB copy
efbcopy_texture->Enable(vconfig.bEFBCopyEnable); efbcopy_texture->Enable(vconfig.bEFBCopyEnable);
efbcopy_ram->Enable(vconfig.bEFBCopyEnable); efbcopy_ram->Enable(vconfig.bEFBCopyEnable);
cache_efb_copies->Enable(vconfig.bEFBCopyEnable && !vconfig.bCopyEFBToTexture);
// XFB // XFB
virtual_xfb->Enable(vconfig.bUseXFB); virtual_xfb->Enable(vconfig.bUseXFB);
@ -271,7 +270,6 @@ protected:
SettingRadioButton* efbcopy_texture; SettingRadioButton* efbcopy_texture;
SettingRadioButton* efbcopy_ram; SettingRadioButton* efbcopy_ram;
SettingCheckBox* cache_efb_copies;
SettingRadioButton* virtual_xfb; SettingRadioButton* virtual_xfb;
SettingRadioButton* real_xfb; SettingRadioButton* real_xfb;

View File

@ -125,8 +125,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
bool isIntensity, bool scaleByHalf, unsigned int cbufid, bool isIntensity, bool scaleByHalf, unsigned int cbufid,
const float *colmat) const float *colmat)
{ {
if (type != TCET_EC_DYNAMIC || g_ActiveConfig.bCopyEFBToTexture)
{
g_renderer->ResetAPIState(); g_renderer->ResetAPIState();
// stretch picture with increased internal resolution // stretch picture with increased internal resolution
@ -155,10 +153,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
else else
D3D::SetPointCopySampler(); D3D::SetPointCopySampler();
// if texture is currently in use, it needs to be temporarily unset
u32 textureSlotMask = D3D::stateman->UnsetTexture(texture->GetSRV());
D3D::stateman->Apply();
D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr); D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr);
// Create texture copy // Create texture copy
@ -172,10 +166,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
// Restore old texture in all previously used slots, if any
D3D::stateman->SetTextureByMask(textureSlotMask, texture->GetSRV());
}
if (!g_ActiveConfig.bCopyEFBToTexture) if (!g_ActiveConfig.bCopyEFBToTexture)
{ {
u8* dst = Memory::GetPointer(dstAddr); u8* dst = Memory::GetPointer(dstAddr);
@ -185,10 +175,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
size_in_bytes = (u32)encoded_size; size_in_bytes = (u32)encoded_size;
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
if (!g_ActiveConfig.bEFBCopyCacheEnable)
TextureCache::MakeRangeDynamic(addr, (u32)encoded_size);
else if (!TextureCache::Find(addr, hash))
TextureCache::MakeRangeDynamic(addr, (u32)encoded_size); TextureCache::MakeRangeDynamic(addr, (u32)encoded_size);
this->hash = hash; this->hash = hash;

View File

@ -168,8 +168,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
FramebufferManager::ResolveAndGetDepthTarget(srcRect) : FramebufferManager::ResolveAndGetDepthTarget(srcRect) :
FramebufferManager::ResolveAndGetRenderTarget(srcRect); FramebufferManager::ResolveAndGetRenderTarget(srcRect);
if (type != TCET_EC_DYNAMIC || g_ActiveConfig.bCopyEFBToTexture)
{
FramebufferManager::SetFramebuffer(framebuffer); FramebufferManager::SetFramebuffer(framebuffer);
OpenGL_BindAttributelessVAO(); OpenGL_BindAttributelessVAO();
@ -202,7 +200,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
static_cast<float>(R.right), static_cast<float>(R.bottom)); static_cast<float>(R.right), static_cast<float>(R.bottom));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
if (false == g_ActiveConfig.bCopyEFBToTexture) if (false == g_ActiveConfig.bCopyEFBToTexture)
{ {
@ -220,10 +217,6 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
size_in_bytes = (u32)encoded_size; size_in_bytes = (u32)encoded_size;
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
if (!g_ActiveConfig.bEFBCopyCacheEnable)
TextureCache::MakeRangeDynamic(addr,encoded_size);
else if (!TextureCache::Find(addr, new_hash))
TextureCache::MakeRangeDynamic(addr,encoded_size); TextureCache::MakeRangeDynamic(addr,encoded_size);
hash = new_hash; hash = new_hash;

View File

@ -115,12 +115,6 @@ void TextureCache::OnConfigChanged(VideoConfig& config)
invalidate_texture_cache_requested = false; invalidate_texture_cache_requested = false;
} }
// 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?
{
g_texture_cache->ClearRenderTargets();
}
if ((config.iStereoMode > 0) != backup_config.s_stereo_3d || if ((config.iStereoMode > 0) != backup_config.s_stereo_3d ||
config.bStereoEFBMonoDepth != backup_config.s_efb_mono_depth) config.bStereoEFBMonoDepth != backup_config.s_efb_mono_depth)
{ {
@ -133,7 +127,6 @@ void TextureCache::OnConfigChanged(VideoConfig& config)
backup_config.s_texfmt_overlay = config.bTexFmtOverlayEnable; backup_config.s_texfmt_overlay = config.bTexFmtOverlayEnable;
backup_config.s_texfmt_overlay_center = config.bTexFmtOverlayCenter; backup_config.s_texfmt_overlay_center = config.bTexFmtOverlayCenter;
backup_config.s_hires_textures = config.bHiresTextures; backup_config.s_hires_textures = config.bHiresTextures;
backup_config.s_copy_cache_enable = config.bEFBCopyCacheEnable;
backup_config.s_stereo_3d = config.iStereoMode > 0; backup_config.s_stereo_3d = config.iStereoMode > 0;
backup_config.s_efb_mono_depth = config.bStereoEFBMonoDepth; backup_config.s_efb_mono_depth = config.bStereoEFBMonoDepth;
} }
@ -218,16 +211,6 @@ void TextureCache::MakeRangeDynamic(u32 start_address, u32 size)
} }
} }
bool TextureCache::Find(u32 start_address, u64 hash)
{
TexCache::iterator iter = textures.lower_bound(start_address);
if (iter->second->hash == hash)
return true;
return false;
}
bool TextureCache::TCacheEntryBase::OverlapsMemoryRange(u32 range_address, u32 range_size) const bool TextureCache::TCacheEntryBase::OverlapsMemoryRange(u32 range_address, u32 range_size) const
{ {
if (addr + size_in_bytes <= range_address) if (addr + size_in_bytes <= range_address)
@ -247,7 +230,7 @@ void TextureCache::ClearRenderTargets()
while (iter != tcend) while (iter != tcend)
{ {
if (iter->second->type == TCET_EC_VRAM) if (iter->second->IsEfbCopy())
{ {
FreeTexture(iter->second); FreeTexture(iter->second);
textures.erase(iter++); textures.erase(iter++);
@ -381,8 +364,6 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 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)
{ {
entry->type = TCET_EC_VRAM;
// TODO: Print a warning if the format changes! In this case, // TODO: Print a warning if the format changes! In this case,
// we could reinterpret the internal texture object data to the new pixel format // we could reinterpret the internal texture object data to the new pixel format
// (similar to what is already being done in Renderer::ReinterpretPixelFormat()) // (similar to what is already being done in Renderer::ReinterpretPixelFormat())
@ -451,7 +432,6 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
config.height = height; config.height = height;
config.levels = texLevels; config.levels = texLevels;
entry = AllocateTexture(config); entry = AllocateTexture(config);
entry->type = TCET_NORMAL;
GFX_DEBUGGER_PAUSE_AT(NEXT_NEW_TEXTURE, true); GFX_DEBUGGER_PAUSE_AT(NEXT_NEW_TEXTURE, true);
entry->SetGeneralParameters(address, texture_size, full_format); entry->SetGeneralParameters(address, texture_size, full_format);
@ -461,11 +441,6 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
// load texture // load texture
entry->Load(width, height, expandedWidth, 0); entry->Load(width, height, expandedWidth, 0);
if (entry->IsEfbCopy() && !g_ActiveConfig.bCopyEFBToTexture)
entry->type = TCET_EC_DYNAMIC;
else
entry->type = TCET_NORMAL;
std::string basename = ""; std::string basename = "";
if (g_ActiveConfig.bDumpTextures && !hires_tex) if (g_ActiveConfig.bDumpTextures && !hires_tex)
{ {
@ -833,7 +808,6 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat
entry->SetGeneralParameters(dstAddr, 0, dstFormat); entry->SetGeneralParameters(dstAddr, 0, dstFormat);
entry->SetDimensions(tex_w, tex_h, 1); entry->SetDimensions(tex_w, tex_h, 1);
entry->SetHashes(TEXHASH_INVALID); entry->SetHashes(TEXHASH_INVALID);
entry->type = TCET_EC_VRAM;
entry->frameCount = FRAMECOUNT_INVALID; entry->frameCount = FRAMECOUNT_INVALID;

View File

@ -20,13 +20,6 @@ struct VideoConfig;
class TextureCache class TextureCache
{ {
public: public:
enum TexCacheEntryType
{
TCET_NORMAL,
TCET_EC_VRAM, // EFB copy which sits in VRAM and is ready to be used
TCET_EC_DYNAMIC, // EFB copy which sits in RAM and needs to be decoded before being used
};
struct TCacheEntryConfig struct TCacheEntryConfig
{ {
TCacheEntryConfig() : width(0), height(0), levels(1), layers(1), rendertarget(false) {} TCacheEntryConfig() : width(0), height(0), levels(1), layers(1), rendertarget(false) {}
@ -61,8 +54,6 @@ public:
u64 hash; u64 hash;
u32 format; u32 format;
enum TexCacheEntryType type;
unsigned int native_width, native_height; // Texture dimensions from the GameCube's point of view unsigned int native_width, native_height; // Texture dimensions from the GameCube's point of view
unsigned int native_levels; unsigned int native_levels;
@ -104,7 +95,7 @@ public:
bool OverlapsMemoryRange(u32 range_address, u32 range_size) const; bool OverlapsMemoryRange(u32 range_address, u32 range_size) const;
bool IsEfbCopy() { return (type == TCET_EC_VRAM || type == TCET_EC_DYNAMIC); } bool IsEfbCopy() { return config.rendertarget; }
}; };
virtual ~TextureCache(); // needs virtual for DX11 dtor virtual ~TextureCache(); // needs virtual for DX11 dtor
@ -119,7 +110,6 @@ public:
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
static bool Find(u32 start_address, u64 hash);
virtual TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) = 0; virtual TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) = 0;

View File

@ -100,7 +100,6 @@ void VideoConfig::Load(const std::string& ini_file)
hacks->Get("EFBCopyEnable", &bEFBCopyEnable, true); hacks->Get("EFBCopyEnable", &bEFBCopyEnable, true);
hacks->Get("EFBToTextureEnable", &bCopyEFBToTexture, true); hacks->Get("EFBToTextureEnable", &bCopyEFBToTexture, true);
hacks->Get("EFBScaledCopy", &bCopyEFBScaled, true); hacks->Get("EFBScaledCopy", &bCopyEFBScaled, true);
hacks->Get("EFBCopyCacheEnable", &bEFBCopyCacheEnable, false);
hacks->Get("EFBEmulateFormatChanges", &bEFBEmulateFormatChanges, false); hacks->Get("EFBEmulateFormatChanges", &bEFBEmulateFormatChanges, false);
// Load common settings // Load common settings
@ -201,7 +200,6 @@ void VideoConfig::GameIniLoad()
CHECK_SETTING("Video_Hacks", "EFBCopyEnable", bEFBCopyEnable); CHECK_SETTING("Video_Hacks", "EFBCopyEnable", bEFBCopyEnable);
CHECK_SETTING("Video_Hacks", "EFBToTextureEnable", bCopyEFBToTexture); CHECK_SETTING("Video_Hacks", "EFBToTextureEnable", bCopyEFBToTexture);
CHECK_SETTING("Video_Hacks", "EFBScaledCopy", bCopyEFBScaled); CHECK_SETTING("Video_Hacks", "EFBScaledCopy", bCopyEFBScaled);
CHECK_SETTING("Video_Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable);
CHECK_SETTING("Video_Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges); CHECK_SETTING("Video_Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges);
CHECK_SETTING("Video", "ProjectionHack", iPhackvalue[0]); CHECK_SETTING("Video", "ProjectionHack", iPhackvalue[0]);
@ -290,7 +288,6 @@ void VideoConfig::Save(const std::string& ini_file)
hacks->Set("EFBCopyEnable", bEFBCopyEnable); hacks->Set("EFBCopyEnable", bEFBCopyEnable);
hacks->Set("EFBToTextureEnable", bCopyEFBToTexture); hacks->Set("EFBToTextureEnable", bCopyEFBToTexture);
hacks->Set("EFBScaledCopy", bCopyEFBScaled); hacks->Set("EFBScaledCopy", bCopyEFBScaled);
hacks->Set("EFBCopyCacheEnable", bEFBCopyCacheEnable);
hacks->Set("EFBEmulateFormatChanges", bEFBEmulateFormatChanges); hacks->Set("EFBEmulateFormatChanges", bEFBEmulateFormatChanges);
iniFile.Save(ini_file); iniFile.Save(ini_file);

View File

@ -114,7 +114,6 @@ struct VideoConfig final
bool bPerfQueriesEnable; bool bPerfQueriesEnable;
bool bEFBCopyEnable; bool bEFBCopyEnable;
bool bEFBCopyCacheEnable;
bool bEFBEmulateFormatChanges; bool bEFBEmulateFormatChanges;
bool bCopyEFBToTexture; bool bCopyEFBToTexture;
bool bCopyEFBScaled; bool bCopyEFBScaled;