mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Rather than only enlarging, watch for persistence.
If the game keeps using something at a new size, we know it's time to make some adjustments.
This commit is contained in:
parent
1a53be45cc
commit
f462721394
2 changed files with 25 additions and 17 deletions
|
@ -708,30 +708,19 @@ void FramebufferManager::DoSetRenderFrameBuffer() {
|
|||
|
||||
int buffer_width = drawing_width;
|
||||
int buffer_height = drawing_height;
|
||||
bool embiggened = false;
|
||||
|
||||
// Find a matching framebuffer
|
||||
VirtualFramebuffer *vfb = 0;
|
||||
for (size_t i = 0; i < vfbs_.size(); ++i) {
|
||||
size_t i;
|
||||
for (i = 0; i < vfbs_.size(); ++i) {
|
||||
VirtualFramebuffer *v = vfbs_[i];
|
||||
if (MaskedEqual(v->fb_address, fb_address)) {
|
||||
vfb = v;
|
||||
// Update fb stride in case it changed
|
||||
vfb->fb_stride = fb_stride;
|
||||
if (v->width < drawing_width && v->height < drawing_height) {
|
||||
// Embiggen if it gets bigger, but only once.
|
||||
// This prevents it happening over and over again.
|
||||
if (!v->embiggened) {
|
||||
// TODO: Could copy over the data.
|
||||
embiggened = true;
|
||||
vfb = NULL;
|
||||
DestroyFramebuf(v);
|
||||
vfbs_.erase(vfbs_.begin() + i);
|
||||
break;
|
||||
} else {
|
||||
v->width = drawing_width;
|
||||
v->height = drawing_height;
|
||||
}
|
||||
v->width = drawing_width;
|
||||
v->height = drawing_height;
|
||||
}
|
||||
if (v->format != fmt) {
|
||||
v->width = drawing_width;
|
||||
|
@ -742,6 +731,20 @@ void FramebufferManager::DoSetRenderFrameBuffer() {
|
|||
}
|
||||
}
|
||||
|
||||
if (vfb && (drawing_width != vfb->bufferWidth || drawing_height != vfb->bufferHeight)) {
|
||||
// If it's newly wrong, or changing every frame, just keep track.
|
||||
if (vfb->newWidth != drawing_width || vfb->newHeight != drawing_height) {
|
||||
vfb->newWidth = drawing_width;
|
||||
vfb->newHeight = drawing_height;
|
||||
vfb->lastFrameNewSize = gpuStats.numFlips;
|
||||
} else if (vfb->lastFrameNewSize + FBO_OLD_AGE <= gpuStats.numFlips) {
|
||||
// Okay, it's changed for a while (and stayed that way.) Let's start over.
|
||||
DestroyFramebuf(vfb);
|
||||
vfbs_.erase(vfbs_.begin() + i);
|
||||
vfb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
float renderWidthFactor = (float)PSP_CoreParameter().renderWidth / 480.0f;
|
||||
float renderHeightFactor = (float)PSP_CoreParameter().renderHeight / 272.0f;
|
||||
|
||||
|
@ -756,6 +759,9 @@ void FramebufferManager::DoSetRenderFrameBuffer() {
|
|||
vfb->z_stride = z_stride;
|
||||
vfb->width = drawing_width;
|
||||
vfb->height = drawing_height;
|
||||
vfb->newWidth = drawing_width;
|
||||
vfb->newHeight = drawing_height;
|
||||
vfb->lastFrameNewSize = gpuStats.numFlips;
|
||||
vfb->renderWidth = (u16)(drawing_width * renderWidthFactor);
|
||||
vfb->renderHeight = (u16)(drawing_height * renderHeightFactor);
|
||||
vfb->bufferWidth = buffer_width;
|
||||
|
@ -767,7 +773,6 @@ void FramebufferManager::DoSetRenderFrameBuffer() {
|
|||
vfb->reallyDirtyAfterDisplay = true;
|
||||
vfb->memoryUpdated = false;
|
||||
vfb->depthUpdated = false;
|
||||
vfb->embiggened = embiggened;
|
||||
|
||||
if (g_Config.bTrueColor) {
|
||||
vfb->colorDepth = FBO_8888;
|
||||
|
|
|
@ -79,13 +79,16 @@ struct VirtualFramebuffer {
|
|||
|
||||
u16 usageFlags;
|
||||
|
||||
u16 newWidth;
|
||||
u16 newHeight;
|
||||
int lastFrameNewSize;
|
||||
|
||||
GEBufferFormat format; // virtual, right now they are all RGBA8888
|
||||
FBOColorDepth colorDepth;
|
||||
FBO *fbo;
|
||||
|
||||
bool dirtyAfterDisplay;
|
||||
bool reallyDirtyAfterDisplay; // takes frame skipping into account
|
||||
bool embiggened;
|
||||
};
|
||||
|
||||
void CenterRect(float *x, float *y, float *w, float *h,
|
||||
|
|
Loading…
Add table
Reference in a new issue