Avoid flicker by not throwing away the last 3 FBOs.

This commit is contained in:
Henrik Rydgard 2013-01-11 17:54:30 +01:00
parent 09eca7b044
commit 29e422cbf1
2 changed files with 19 additions and 1 deletions

View File

@ -147,6 +147,8 @@ const int flushBeforeCommandList[] = {
GLES_GPU::GLES_GPU(int renderWidth, int renderHeight)
: interruptsEnabled_(true),
displayFramebufPtr_(0),
prevDisplayFramebufPtr_(0),
prevPrevDisplayFramebufPtr_(0),
renderWidth_(renderWidth),
renderHeight_(renderHeight)
{
@ -235,6 +237,8 @@ void GLES_GPU::BeginFrame() {
void GLES_GPU::SetDisplayFramebuffer(u32 framebuf, u32 stride, int format) {
if (framebuf & 0x04000000) {
//DEBUG_LOG(G3D, "Switch display framebuffer %08x", framebuf);
prevPrevDisplayFramebufPtr_ = prevDisplayFramebufPtr_;
prevDisplayFramebufPtr_ = displayFramebufPtr_;
displayFramebufPtr_ = framebuf;
displayStride_ = stride;
displayFormat_ = format;
@ -283,8 +287,20 @@ void GLES_GPU::CopyDisplayToOutput() {
BeginDebugDraw();
}
static bool MaskedEqual(u32 addr1, u32 addr2) {
return (addr1 & 0x3FFFFFF) == (addr2 & 0x3FFFFFF);
}
void GLES_GPU::DecimateFBOs() {
for (auto iter = vfbs_.begin(); iter != vfbs_.end();) {
VirtualFramebuffer *v = *iter;
if (MaskedEqual(v->fb_address, displayFramebufPtr_) ||
MaskedEqual(v->fb_address, prevDisplayFramebufPtr_) ||
MaskedEqual(v->fb_address, prevPrevDisplayFramebufPtr_)) {
++iter;
continue;
}
if ((*iter)->last_frame_used + FBO_OLD_AGE < gpuStats.numFrames) {
fbo_destroy((*iter)->fbo);
vfbs_.erase(iter++);
@ -296,7 +312,7 @@ void GLES_GPU::DecimateFBOs() {
GLES_GPU::VirtualFramebuffer *GLES_GPU::GetDisplayFBO() {
for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) {
if (((*iter)->fb_address & 0x3FFFFFF) == (displayFramebufPtr_ & 0x3FFFFFF)) {
if (MaskedEqual((*iter)->fb_address, displayFramebufPtr_)) {
// Could check w to but whatever
return *iter;
}

View File

@ -73,6 +73,8 @@ private:
bool interruptsEnabled_;
u32 displayFramebufPtr_;
u32 prevDisplayFramebufPtr_;
u32 prevPrevDisplayFramebufPtr_;
u32 displayStride_;
int displayFormat_;