summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMarkus Wick <markus+github@selfnet.de>2015-01-27 09:42:15 +0100
committerMarkus Wick <markus+github@selfnet.de>2015-01-27 09:42:15 +0100
commit43605f87166cc4bc5e76cec016076aeb6103e24f (patch)
treec1e741a89e03fc6b4e0256c179f69b91829e76a4 /Source/Core
parent8eda3ca844ca9b05682ec57aa3be2cbe07e19d28 (diff)
parent6659c15bedd4add4bd536394900e74ab6b7d6648 (diff)
Merge pull request #1948 from magumagu/remove-efb-cache
Remove EFB to RAM cache, and simplify code.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Movie.cpp3
-rw-r--r--Source/Core/DolphinWX/VideoConfigDiag.cpp2
-rw-r--r--Source/Core/DolphinWX/VideoConfigDiag.h2
-rw-r--r--Source/Core/VideoBackends/D3D/TextureCache.cpp80
-rw-r--r--Source/Core/VideoBackends/OGL/TextureCache.cpp61
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.cpp28
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.h12
-rw-r--r--Source/Core/VideoCommon/VideoConfig.cpp3
-rw-r--r--Source/Core/VideoCommon/VideoConfig.h1
9 files changed, 63 insertions, 129 deletions
diff --git a/Source/Core/Core/Movie.cpp b/Source/Core/Core/Movie.cpp
index 846a2ec547..8540133f0a 100644
--- a/Source/Core/Core/Movie.cpp
+++ b/Source/Core/Core/Movie.cpp
@@ -1214,7 +1214,7 @@ void SaveRecording(const std::string& filename)
header.bEFBAccessEnable = g_ActiveConfig.bEFBAccessEnable;
header.bEFBCopyEnable = g_ActiveConfig.bEFBCopyEnable;
header.bCopyEFBToTexture = g_ActiveConfig.bCopyEFBToTexture;
- header.bEFBCopyCacheEnable = g_ActiveConfig.bEFBCopyCacheEnable;
+ header.bEFBCopyCacheEnable = false;
header.bEFBEmulateFormatChanges = g_ActiveConfig.bEFBEmulateFormatChanges;
header.bUseXFB = g_ActiveConfig.bUseXFB;
header.bUseRealXFB = g_ActiveConfig.bUseRealXFB;
@@ -1276,7 +1276,6 @@ void SetGraphicsConfig()
g_Config.bEFBAccessEnable = tmpHeader.bEFBAccessEnable;
g_Config.bEFBCopyEnable = tmpHeader.bEFBCopyEnable;
g_Config.bCopyEFBToTexture = tmpHeader.bCopyEFBToTexture;
- g_Config.bEFBCopyCacheEnable = tmpHeader.bEFBCopyCacheEnable;
g_Config.bEFBEmulateFormatChanges = tmpHeader.bEFBEmulateFormatChanges;
g_Config.bUseXFB = tmpHeader.bUseXFB;
g_Config.bUseRealXFB = tmpHeader.bUseRealXFB;
diff --git a/Source/Core/DolphinWX/VideoConfigDiag.cpp b/Source/Core/DolphinWX/VideoConfigDiag.cpp
index 4e3ec0deb9..def83b465e 100644
--- a/Source/Core/DolphinWX/VideoConfigDiag.cpp
+++ b/Source/Core/DolphinWX/VideoConfigDiag.cpp
@@ -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);
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);
- 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->AddStretchSpacer(1);
group_efbcopy->Add(efbcopy_texture, 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, _("Ignore Format Changes"), wxGetTranslation(efb_emulate_format_changes_desc), vconfig.bEFBEmulateFormatChanges, true), 0, wxBOTTOM | wxLEFT, 5);
diff --git a/Source/Core/DolphinWX/VideoConfigDiag.h b/Source/Core/DolphinWX/VideoConfigDiag.h
index 4d2d98adaa..4f54eb214c 100644
--- a/Source/Core/DolphinWX/VideoConfigDiag.h
+++ b/Source/Core/DolphinWX/VideoConfigDiag.h
@@ -203,7 +203,6 @@ protected:
// EFB copy
efbcopy_texture->Enable(vconfig.bEFBCopyEnable);
efbcopy_ram->Enable(vconfig.bEFBCopyEnable);
- cache_efb_copies->Enable(vconfig.bEFBCopyEnable && !vconfig.bCopyEFBToTexture);
// XFB
virtual_xfb->Enable(vconfig.bUseXFB);
@@ -271,7 +270,6 @@ protected:
SettingRadioButton* efbcopy_texture;
SettingRadioButton* efbcopy_ram;
- SettingCheckBox* cache_efb_copies;
SettingRadioButton* virtual_xfb;
SettingRadioButton* real_xfb;
diff --git a/Source/Core/VideoBackends/D3D/TextureCache.cpp b/Source/Core/VideoBackends/D3D/TextureCache.cpp
index aab90e2560..488bc3ecc0 100644
--- a/Source/Core/VideoBackends/D3D/TextureCache.cpp
+++ b/Source/Core/VideoBackends/D3D/TextureCache.cpp
@@ -125,56 +125,46 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
bool isIntensity, bool scaleByHalf, unsigned int cbufid,
const float *colmat)
{
- if (type != TCET_EC_DYNAMIC || g_ActiveConfig.bCopyEFBToTexture)
- {
- g_renderer->ResetAPIState();
-
- // stretch picture with increased internal resolution
- const D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, (float)config.width, (float)config.height);
- D3D::context->RSSetViewports(1, &vp);
-
- // set transformation
- if (nullptr == efbcopycbuf[cbufid])
- {
- const D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(28 * sizeof(float), D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DEFAULT);
- D3D11_SUBRESOURCE_DATA data;
- data.pSysMem = colmat;
- HRESULT hr = D3D::device->CreateBuffer(&cbdesc, &data, &efbcopycbuf[cbufid]);
- CHECK(SUCCEEDED(hr), "Create efb copy constant buffer %d", cbufid);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)efbcopycbuf[cbufid], "a constant buffer used in TextureCache::CopyRenderTargetToTexture");
- }
- D3D::stateman->SetPixelConstants(efbcopycbuf[cbufid]);
+ g_renderer->ResetAPIState();
- const TargetRectangle targetSource = g_renderer->ConvertEFBRectangle(srcRect);
- // TODO: try targetSource.asRECT();
- const D3D11_RECT sourcerect = CD3D11_RECT(targetSource.left, targetSource.top, targetSource.right, targetSource.bottom);
+ // stretch picture with increased internal resolution
+ const D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, (float)config.width, (float)config.height);
+ D3D::context->RSSetViewports(1, &vp);
- // Use linear filtering if (bScaleByHalf), use point filtering otherwise
- if (scaleByHalf)
- D3D::SetLinearCopySampler();
- else
- D3D::SetPointCopySampler();
+ // set transformation
+ if (nullptr == efbcopycbuf[cbufid])
+ {
+ const D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(28 * sizeof(float), D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DEFAULT);
+ D3D11_SUBRESOURCE_DATA data;
+ data.pSysMem = colmat;
+ HRESULT hr = D3D::device->CreateBuffer(&cbdesc, &data, &efbcopycbuf[cbufid]);
+ CHECK(SUCCEEDED(hr), "Create efb copy constant buffer %d", cbufid);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)efbcopycbuf[cbufid], "a constant buffer used in TextureCache::CopyRenderTargetToTexture");
+ }
+ D3D::stateman->SetPixelConstants(efbcopycbuf[cbufid]);
- // if texture is currently in use, it needs to be temporarily unset
- u32 textureSlotMask = D3D::stateman->UnsetTexture(texture->GetSRV());
- D3D::stateman->Apply();
+ const TargetRectangle targetSource = g_renderer->ConvertEFBRectangle(srcRect);
+ // TODO: try targetSource.asRECT();
+ const D3D11_RECT sourcerect = CD3D11_RECT(targetSource.left, targetSource.top, targetSource.right, targetSource.bottom);
- D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr);
+ // Use linear filtering if (bScaleByHalf), use point filtering otherwise
+ if (scaleByHalf)
+ D3D::SetLinearCopySampler();
+ else
+ D3D::SetPointCopySampler();
- // Create texture copy
- D3D::drawShadedTexQuad(
- (srcFormat == PEControl::Z24) ? FramebufferManager::GetEFBDepthTexture()->GetSRV() : FramebufferManager::GetEFBColorTexture()->GetSRV(),
- &sourcerect, Renderer::GetTargetWidth(), Renderer::GetTargetHeight(),
- (srcFormat == PEControl::Z24) ? PixelShaderCache::GetDepthMatrixProgram(true) : PixelShaderCache::GetColorMatrixProgram(true),
- VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader());
+ D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr);
- D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
+ // Create texture copy
+ D3D::drawShadedTexQuad(
+ (srcFormat == PEControl::Z24) ? FramebufferManager::GetEFBDepthTexture()->GetSRV() : FramebufferManager::GetEFBColorTexture()->GetSRV(),
+ &sourcerect, Renderer::GetTargetWidth(), Renderer::GetTargetHeight(),
+ (srcFormat == PEControl::Z24) ? PixelShaderCache::GetDepthMatrixProgram(true) : PixelShaderCache::GetColorMatrixProgram(true),
+ VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader());
- g_renderer->RestoreAPIState();
+ D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
- // Restore old texture in all previously used slots, if any
- D3D::stateman->SetTextureByMask(textureSlotMask, texture->GetSRV());
- }
+ g_renderer->RestoreAPIState();
if (!g_ActiveConfig.bCopyEFBToTexture)
{
@@ -185,11 +175,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
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;
}
diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp
index 1f12d5c148..83c4af7a98 100644
--- a/Source/Core/VideoBackends/OGL/TextureCache.cpp
+++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp
@@ -168,41 +168,38 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
FramebufferManager::ResolveAndGetDepthTarget(srcRect) :
FramebufferManager::ResolveAndGetRenderTarget(srcRect);
- if (type != TCET_EC_DYNAMIC || g_ActiveConfig.bCopyEFBToTexture)
- {
- FramebufferManager::SetFramebuffer(framebuffer);
+ FramebufferManager::SetFramebuffer(framebuffer);
- OpenGL_BindAttributelessVAO();
+ OpenGL_BindAttributelessVAO();
- glActiveTexture(GL_TEXTURE0+9);
- glBindTexture(GL_TEXTURE_2D_ARRAY, read_texture);
+ glActiveTexture(GL_TEXTURE0+9);
+ glBindTexture(GL_TEXTURE_2D_ARRAY, read_texture);
- glViewport(0, 0, config.width, config.height);
+ glViewport(0, 0, config.width, config.height);
- GLuint uniform_location;
- if (srcFormat == PEControl::Z24)
- {
- s_DepthMatrixProgram.Bind();
- if (s_DepthCbufid != cbufid)
- glUniform4fv(s_DepthMatrixUniform, 5, colmat);
- s_DepthCbufid = cbufid;
- uniform_location = s_DepthCopyPositionUniform;
- }
- else
- {
- s_ColorMatrixProgram.Bind();
- if (s_ColorCbufid != cbufid)
- glUniform4fv(s_ColorMatrixUniform, 7, colmat);
- s_ColorCbufid = cbufid;
- uniform_location = s_ColorCopyPositionUniform;
- }
+ GLuint uniform_location;
+ if (srcFormat == PEControl::Z24)
+ {
+ s_DepthMatrixProgram.Bind();
+ if (s_DepthCbufid != cbufid)
+ glUniform4fv(s_DepthMatrixUniform, 5, colmat);
+ s_DepthCbufid = cbufid;
+ uniform_location = s_DepthCopyPositionUniform;
+ }
+ else
+ {
+ s_ColorMatrixProgram.Bind();
+ if (s_ColorCbufid != cbufid)
+ glUniform4fv(s_ColorMatrixUniform, 7, colmat);
+ s_ColorCbufid = cbufid;
+ uniform_location = s_ColorCopyPositionUniform;
+ }
- TargetRectangle R = g_renderer->ConvertEFBRectangle(srcRect);
- glUniform4f(uniform_location, static_cast<float>(R.left), static_cast<float>(R.top),
- static_cast<float>(R.right), static_cast<float>(R.bottom));
+ TargetRectangle R = g_renderer->ConvertEFBRectangle(srcRect);
+ glUniform4f(uniform_location, static_cast<float>(R.left), static_cast<float>(R.top),
+ 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)
{
@@ -220,11 +217,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
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;
}
diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp
index ea830c24fc..b40f9d0882 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.cpp
+++ b/Source/Core/VideoCommon/TextureCacheBase.cpp
@@ -115,12 +115,6 @@ void TextureCache::OnConfigChanged(VideoConfig& config)
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 ||
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_center = config.bTexFmtOverlayCenter;
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_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
{
if (addr + size_in_bytes <= range_address)
@@ -247,7 +230,7 @@ void TextureCache::ClearRenderTargets()
while (iter != tcend)
{
- if (iter->second->type == TCET_EC_VRAM)
+ if (iter->second->IsEfbCopy())
{
FreeTexture(iter->second);
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
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,
// we could reinterpret the internal texture object data to the new pixel format
// (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.levels = texLevels;
entry = AllocateTexture(config);
- entry->type = TCET_NORMAL;
GFX_DEBUGGER_PAUSE_AT(NEXT_NEW_TEXTURE, true);
entry->SetGeneralParameters(address, texture_size, full_format);
@@ -461,11 +441,6 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
// load texture
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 = "";
if (g_ActiveConfig.bDumpTextures && !hires_tex)
{
@@ -833,7 +808,6 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat
entry->SetGeneralParameters(dstAddr, 0, dstFormat);
entry->SetDimensions(tex_w, tex_h, 1);
entry->SetHashes(TEXHASH_INVALID);
- entry->type = TCET_EC_VRAM;
entry->frameCount = FRAMECOUNT_INVALID;
diff --git a/Source/Core/VideoCommon/TextureCacheBase.h b/Source/Core/VideoCommon/TextureCacheBase.h
index 52f9e04e16..1d4ebe9ba7 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.h
+++ b/Source/Core/VideoCommon/TextureCacheBase.h
@@ -20,13 +20,6 @@ struct VideoConfig;
class TextureCache
{
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
{
TCacheEntryConfig() : width(0), height(0), levels(1), layers(1), rendertarget(false) {}
@@ -61,8 +54,6 @@ public:
u64 hash;
u32 format;
- enum TexCacheEntryType type;
-
unsigned int native_width, native_height; // Texture dimensions from the GameCube's point of view
unsigned int native_levels;
@@ -104,7 +95,7 @@ public:
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
@@ -119,7 +110,6 @@ public:
static void InvalidateRange(u32 start_address, u32 size);
static void MakeRangeDynamic(u32 start_address, u32 size);
static void ClearRenderTargets(); // currently only used by OGL
- static bool Find(u32 start_address, u64 hash);
virtual TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) = 0;
diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp
index f6fe38d663..ef5fe26798 100644
--- a/Source/Core/VideoCommon/VideoConfig.cpp
+++ b/Source/Core/VideoCommon/VideoConfig.cpp
@@ -100,7 +100,6 @@ void VideoConfig::Load(const std::string& ini_file)
hacks->Get("EFBCopyEnable", &bEFBCopyEnable, true);
hacks->Get("EFBToTextureEnable", &bCopyEFBToTexture, true);
hacks->Get("EFBScaledCopy", &bCopyEFBScaled, true);
- hacks->Get("EFBCopyCacheEnable", &bEFBCopyCacheEnable, false);
hacks->Get("EFBEmulateFormatChanges", &bEFBEmulateFormatChanges, false);
// Load common settings
@@ -201,7 +200,6 @@ void VideoConfig::GameIniLoad()
CHECK_SETTING("Video_Hacks", "EFBCopyEnable", bEFBCopyEnable);
CHECK_SETTING("Video_Hacks", "EFBToTextureEnable", bCopyEFBToTexture);
CHECK_SETTING("Video_Hacks", "EFBScaledCopy", bCopyEFBScaled);
- CHECK_SETTING("Video_Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable);
CHECK_SETTING("Video_Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges);
CHECK_SETTING("Video", "ProjectionHack", iPhackvalue[0]);
@@ -290,7 +288,6 @@ void VideoConfig::Save(const std::string& ini_file)
hacks->Set("EFBCopyEnable", bEFBCopyEnable);
hacks->Set("EFBToTextureEnable", bCopyEFBToTexture);
hacks->Set("EFBScaledCopy", bCopyEFBScaled);
- hacks->Set("EFBCopyCacheEnable", bEFBCopyCacheEnable);
hacks->Set("EFBEmulateFormatChanges", bEFBEmulateFormatChanges);
iniFile.Save(ini_file);
diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h
index 69684557e8..38e8047f75 100644
--- a/Source/Core/VideoCommon/VideoConfig.h
+++ b/Source/Core/VideoCommon/VideoConfig.h
@@ -114,7 +114,6 @@ struct VideoConfig final
bool bPerfQueriesEnable;
bool bEFBCopyEnable;
- bool bEFBCopyCacheEnable;
bool bEFBEmulateFormatChanges;
bool bCopyEFBToTexture;
bool bCopyEFBScaled;