summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2014-06-05 10:12:05 +0200
committerdegasus <wickmarkus@web.de>2014-06-05 14:53:09 +0200
commit9566dcf0da26720ee806cfdfca60d913f9faec0a (patch)
tree6f158271fb726128236b18f6e3b7da46581bad9a /Source/Core/VideoBackends
parent40031c9a724c19d0e82faf297a369ca53b574209 (diff)
OGL: speed up the EFB cache
gcc doesn't optimize this loops with -O2, so using memset now. A flag to skip the clear funktion was added as the cache is already cleared most of the time.
Diffstat (limited to 'Source/Core/VideoBackends')
-rw-r--r--Source/Core/VideoBackends/OGL/Render.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp
index acb3152fcd..f264db9a6d 100644
--- a/Source/Core/VideoBackends/OGL/Render.cpp
+++ b/Source/Core/VideoBackends/OGL/Render.cpp
@@ -110,6 +110,7 @@ static const u32 EFB_CACHE_RECT_SIZE = 64; // Cache 64x64 blocks.
static const u32 EFB_CACHE_WIDTH = (EFB_WIDTH + EFB_CACHE_RECT_SIZE - 1) / EFB_CACHE_RECT_SIZE; // round up
static const u32 EFB_CACHE_HEIGHT = (EFB_HEIGHT + EFB_CACHE_RECT_SIZE - 1) / EFB_CACHE_RECT_SIZE;
static bool s_efbCacheValid[2][EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT];
+static bool s_efbCacheIsCleared = false;
static std::vector<u32> s_efbCache[2][EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT]; // 2 for PEEK_Z and PEEK_COLOR
int GetNumMSAASamples(int MSAAMode)
@@ -615,6 +616,7 @@ Renderer::Renderer()
}
}
UpdateActiveConfig();
+ ClearEFBCache();
}
Renderer::~Renderer()
@@ -882,11 +884,11 @@ void Renderer::SetColorMask()
void ClearEFBCache()
{
- for (u32 i = 0; i < EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT; ++i)
- s_efbCacheValid[0][i] = false;
-
- for (u32 i = 0; i < EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT; ++i)
- s_efbCacheValid[1][i] = false;
+ if (!s_efbCacheIsCleared)
+ {
+ s_efbCacheIsCleared = true;
+ memset(s_efbCacheValid, 0, sizeof(s_efbCacheValid));
+ }
}
void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const u32* data)
@@ -916,6 +918,7 @@ void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRec
}
s_efbCacheValid[cacheType][cacheRectIdx] = true;
+ s_efbCacheIsCleared = false;
}
// This function allows the CPU to directly access the EFB.