Fixed threading issue pointed out by unknownbrackets and made texture scaling changes apply immediately
This commit is contained in:
parent
37a33d9daf
commit
2212e7f609
7 changed files with 26 additions and 3 deletions
|
@ -997,6 +997,11 @@ void GLES_GPU::InvalidateCacheHint(u32 addr, int size) {
|
|||
textureCache_.InvalidateAll(false);
|
||||
}
|
||||
|
||||
void GLES_GPU::ClearCacheNextFrame() {
|
||||
textureCache_.ClearNextFrame();
|
||||
}
|
||||
|
||||
|
||||
void GLES_GPU::Flush() {
|
||||
transformDraw_.Flush();
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ public:
|
|||
virtual void UpdateStats();
|
||||
virtual void InvalidateCache(u32 addr, int size);
|
||||
virtual void InvalidateCacheHint(u32 addr, int size);
|
||||
virtual void ClearCacheNextFrame();
|
||||
virtual void DeviceLost(); // Only happens on Android. Drop all textures and shaders.
|
||||
|
||||
virtual void DumpNextFrame();
|
||||
|
|
|
@ -44,7 +44,7 @@ u32 RoundUpToPowerOf2(u32 v)
|
|||
return v;
|
||||
}
|
||||
|
||||
TextureCache::TextureCache() {
|
||||
TextureCache::TextureCache() : clearCacheNextFrame_(false) {
|
||||
lastBoundTexture = -1;
|
||||
// This is 5MB of temporary storage. Might be possible to shrink it.
|
||||
tmpTexBuf32.resize(1024 * 512); // 2MB
|
||||
|
@ -120,6 +120,11 @@ void TextureCache::InvalidateAll(bool force) {
|
|||
Invalidate(0, 0xFFFFFFFF, force);
|
||||
}
|
||||
|
||||
void TextureCache::ClearNextFrame() {
|
||||
clearCacheNextFrame_ = true;
|
||||
}
|
||||
|
||||
|
||||
TextureCache::TexCacheEntry *TextureCache::GetEntryAt(u32 texaddr) {
|
||||
// If no CLUT, as in framebuffer textures, cache key is simply texaddr.
|
||||
auto iter = cache.find(texaddr);
|
||||
|
@ -654,7 +659,12 @@ static void convertColors(u8 *finalBuf, GLuint dstFmt, int numPixels) {
|
|||
|
||||
void TextureCache::StartFrame() {
|
||||
lastBoundTexture = -1;
|
||||
if(clearCacheNextFrame_) {
|
||||
Clear(true);
|
||||
clearCacheNextFrame_ = false;
|
||||
} else {
|
||||
Decimate();
|
||||
}
|
||||
}
|
||||
|
||||
static const u8 bitsPerPixel[11] = {
|
||||
|
|
|
@ -36,6 +36,7 @@ public:
|
|||
void StartFrame();
|
||||
void Invalidate(u32 addr, int size, bool force);
|
||||
void InvalidateAll(bool force);
|
||||
void ClearNextFrame();
|
||||
|
||||
// FramebufferManager keeps TextureCache updated about what regions of memory
|
||||
// are being rendered to. This is barebones so far.
|
||||
|
@ -100,6 +101,8 @@ private:
|
|||
typedef std::map<u64, TexCacheEntry> TexCache;
|
||||
TexCache cache;
|
||||
|
||||
bool clearCacheNextFrame_;
|
||||
|
||||
template <typename T>
|
||||
class SimpleBuf {
|
||||
public:
|
||||
|
|
|
@ -174,6 +174,9 @@ public:
|
|||
virtual void InvalidateCache(u32 addr, int size) = 0;
|
||||
virtual void InvalidateCacheHint(u32 addr, int size) = 0;
|
||||
|
||||
// Will cause the texture cache to be cleared at the start of the next frame.
|
||||
virtual void ClearCacheNextFrame() = 0;
|
||||
|
||||
// Internal hack to avoid interrupts from "PPGe" drawing (utility UI, etc)
|
||||
virtual void EnableInterrupts(bool enable) = 0;
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ public:
|
|||
virtual void UpdateStats();
|
||||
virtual void InvalidateCache(u32 addr, int size);
|
||||
virtual void InvalidateCacheHint(u32 addr, int size);
|
||||
virtual void ClearCacheNextFrame() {};
|
||||
virtual void Flush() {}
|
||||
|
||||
virtual void DeviceLost() {}
|
||||
|
|
|
@ -177,7 +177,7 @@ namespace MainWindow
|
|||
|
||||
void setXbrzTexScaling(int num) {
|
||||
g_Config.iXBRZTexScalingLevel = num;
|
||||
if(gpu) gpu->InvalidateCache(0,0);
|
||||
if(gpu) gpu->ClearCacheNextFrame();
|
||||
}
|
||||
|
||||
BOOL Show(HINSTANCE hInstance, int nCmdShow)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue