mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Apply the scoring model when creating/updating framebuffers too.
Reuses the same mechanism. This is the second part of the Test Drive fix.
This commit is contained in:
parent
a70ea98475
commit
4252036d89
2 changed files with 32 additions and 14 deletions
|
@ -550,12 +550,6 @@ void TextureCacheCommon::SetTexture(bool force) {
|
||||||
bool TextureCacheCommon::AttachFramebufferToEntry(TexCacheEntry *entry, u32 texAddrOffset) {
|
bool TextureCacheCommon::AttachFramebufferToEntry(TexCacheEntry *entry, u32 texAddrOffset) {
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
struct AttachCandidate {
|
|
||||||
FramebufferMatchInfo match;
|
|
||||||
TexCacheEntry *entry;
|
|
||||||
VirtualFramebuffer *fb;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<AttachCandidate> candidates;
|
std::vector<AttachCandidate> candidates;
|
||||||
|
|
||||||
bool anyIgnores = false;
|
bool anyIgnores = false;
|
||||||
|
@ -565,7 +559,7 @@ bool TextureCacheCommon::AttachFramebufferToEntry(TexCacheEntry *entry, u32 texA
|
||||||
auto framebuffer = fbCache_[i];
|
auto framebuffer = fbCache_[i];
|
||||||
FramebufferMatchInfo match = MatchFramebuffer(entry, framebuffer->fb_address, framebuffer, texAddrOffset, channel);
|
FramebufferMatchInfo match = MatchFramebuffer(entry, framebuffer->fb_address, framebuffer, texAddrOffset, channel);
|
||||||
if (match.match != FramebufferMatch::IGNORE && match.match != FramebufferMatch::NO_MATCH) {
|
if (match.match != FramebufferMatch::IGNORE && match.match != FramebufferMatch::NO_MATCH) {
|
||||||
candidates.push_back(AttachCandidate{ match, entry, framebuffer });
|
candidates.push_back(AttachCandidate{ match, entry, framebuffer, channel });
|
||||||
} else if (match.match == FramebufferMatch::IGNORE) {
|
} else if (match.match == FramebufferMatch::IGNORE) {
|
||||||
anyIgnores = true;
|
anyIgnores = true;
|
||||||
}
|
}
|
||||||
|
@ -585,9 +579,15 @@ bool TextureCacheCommon::AttachFramebufferToEntry(TexCacheEntry *entry, u32 texA
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AttachBestCandidate(candidates);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TextureCacheCommon::AttachBestCandidate(const std::vector<AttachCandidate> &candidates) {
|
||||||
|
_dbg_assert_(!candidates.empty());
|
||||||
|
|
||||||
if (candidates.size() == 1) {
|
if (candidates.size() == 1) {
|
||||||
VirtualFramebuffer *framebuffer = candidates[0].fb;
|
VirtualFramebuffer *framebuffer = candidates[0].fb;
|
||||||
return ApplyFramebufferMatch(candidates[0].match, entry, framebuffer->fb_address, framebuffer, channel);
|
return ApplyFramebufferMatch(candidates[0].match, candidates[0].entry, framebuffer->fb_address, framebuffer, candidates[0].channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// OK, multiple possible candidates. Will need to figure out which one is the most relevant.
|
// OK, multiple possible candidates. Will need to figure out which one is the most relevant.
|
||||||
|
@ -608,7 +608,7 @@ bool TextureCacheCommon::AttachFramebufferToEntry(TexCacheEntry *entry, u32 texA
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bonus point for matching stride.
|
// Bonus point for matching stride.
|
||||||
if (channel == NOTIFY_FB_COLOR && candidate.fb->fb_stride == candidate.entry->bufw) {
|
if (candidate.channel == NOTIFY_FB_COLOR && candidate.fb->fb_stride == candidate.entry->bufw) {
|
||||||
relevancy += 10;
|
relevancy += 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,10 +619,9 @@ bool TextureCacheCommon::AttachFramebufferToEntry(TexCacheEntry *entry, u32 texA
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFramebuffer *framebuffer = candidates[bestIndex].fb;
|
VirtualFramebuffer *framebuffer = candidates[bestIndex].fb;
|
||||||
return ApplyFramebufferMatch(candidates[bestIndex].match, candidates[bestIndex].entry, framebuffer->fb_address, framebuffer, channel);
|
return ApplyFramebufferMatch(candidates[bestIndex].match, candidates[bestIndex].entry, framebuffer->fb_address, framebuffer, candidates[bestIndex].channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Removes old textures.
|
// Removes old textures.
|
||||||
void TextureCacheCommon::Decimate(bool forcePressure) {
|
void TextureCacheCommon::Decimate(bool forcePressure) {
|
||||||
if (--decimationCounter_ <= 0) {
|
if (--decimationCounter_ <= 0) {
|
||||||
|
@ -737,6 +736,7 @@ void TextureCacheCommon::NotifyFramebuffer(u32 address, VirtualFramebuffer *fram
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
case NOTIFY_FB_CREATED:
|
case NOTIFY_FB_CREATED:
|
||||||
case NOTIFY_FB_UPDATED:
|
case NOTIFY_FB_UPDATED:
|
||||||
|
{
|
||||||
// Try to match the new framebuffer to existing textures.
|
// Try to match the new framebuffer to existing textures.
|
||||||
// Backwards from the "usual" texturing case so can't share a utility function.
|
// Backwards from the "usual" texturing case so can't share a utility function.
|
||||||
|
|
||||||
|
@ -748,11 +748,15 @@ void TextureCacheCommon::NotifyFramebuffer(u32 address, VirtualFramebuffer *fram
|
||||||
fbCache_.push_back(framebuffer);
|
fbCache_.push_back(framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<AttachCandidate> candidates;
|
||||||
|
|
||||||
// TODO: Rework this to not try to "apply" all matches, only the best one.
|
// TODO: Rework this to not try to "apply" all matches, only the best one.
|
||||||
for (auto it = cache_.lower_bound(cacheKey), end = cache_.upper_bound(cacheKeyEnd); it != end; ++it) {
|
for (auto it = cache_.lower_bound(cacheKey), end = cache_.upper_bound(cacheKeyEnd); it != end; ++it) {
|
||||||
TexCacheEntry *entry = it->second.get();
|
TexCacheEntry *entry = it->second.get();
|
||||||
FramebufferMatchInfo match = MatchFramebuffer(entry, addr, framebuffer, 0, channel);
|
FramebufferMatchInfo match = MatchFramebuffer(entry, addr, framebuffer, 0, channel);
|
||||||
ApplyFramebufferMatch(match, entry, addr, framebuffer, channel);
|
if (match.match != FramebufferMatch::IGNORE && match.match != FramebufferMatch::NO_MATCH) {
|
||||||
|
candidates.push_back(AttachCandidate{ match, entry, framebuffer, channel });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's assume anything in mirrors is fair game to check.
|
// Let's assume anything in mirrors is fair game to check.
|
||||||
|
@ -763,11 +767,17 @@ void TextureCacheCommon::NotifyFramebuffer(u32 address, VirtualFramebuffer *fram
|
||||||
if (mirrorlessKey >= cacheKey && mirrorlessKey <= cacheKeyEnd) {
|
if (mirrorlessKey >= cacheKey && mirrorlessKey <= cacheKeyEnd) {
|
||||||
TexCacheEntry *entry = it->second.get();
|
TexCacheEntry *entry = it->second.get();
|
||||||
FramebufferMatchInfo match = MatchFramebuffer(entry, addr, framebuffer, 0, channel);
|
FramebufferMatchInfo match = MatchFramebuffer(entry, addr, framebuffer, 0, channel);
|
||||||
ApplyFramebufferMatch(match, entry, addr, framebuffer, channel);
|
if (match.match != FramebufferMatch::IGNORE && match.match != FramebufferMatch::NO_MATCH) {
|
||||||
|
candidates.push_back(AttachCandidate{ match, entry, framebuffer, channel });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
|
if (!candidates.empty()) {
|
||||||
|
AttachBestCandidate(candidates);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case NOTIFY_FB_DESTROYED:
|
case NOTIFY_FB_DESTROYED:
|
||||||
fbCache_.erase(std::remove(fbCache_.begin(), fbCache_.end(), framebuffer), fbCache_.end());
|
fbCache_.erase(std::remove(fbCache_.begin(), fbCache_.end(), framebuffer), fbCache_.end());
|
||||||
|
|
||||||
|
|
|
@ -207,6 +207,13 @@ struct FramebufferMatchInfo {
|
||||||
u32 yOffset;
|
u32 yOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AttachCandidate {
|
||||||
|
FramebufferMatchInfo match;
|
||||||
|
TexCacheEntry *entry;
|
||||||
|
VirtualFramebuffer *fb;
|
||||||
|
FramebufferNotificationChannel channel;
|
||||||
|
};
|
||||||
|
|
||||||
class TextureCacheCommon {
|
class TextureCacheCommon {
|
||||||
public:
|
public:
|
||||||
TextureCacheCommon(Draw::DrawContext *draw);
|
TextureCacheCommon(Draw::DrawContext *draw);
|
||||||
|
@ -278,6 +285,7 @@ protected:
|
||||||
|
|
||||||
// Temporary utility during conversion
|
// Temporary utility during conversion
|
||||||
bool ApplyFramebufferMatch(FramebufferMatchInfo match, TexCacheEntry *entry, u32 address, VirtualFramebuffer *framebuffer, FramebufferNotificationChannel channel);
|
bool ApplyFramebufferMatch(FramebufferMatchInfo match, TexCacheEntry *entry, u32 address, VirtualFramebuffer *framebuffer, FramebufferNotificationChannel channel);
|
||||||
|
bool AttachBestCandidate(const std::vector<AttachCandidate> &candidates);
|
||||||
|
|
||||||
void AttachFramebufferValid(TexCacheEntry *entry, VirtualFramebuffer *framebuffer, const FramebufferMatchInfo &fbInfo, FramebufferNotificationChannel channel);
|
void AttachFramebufferValid(TexCacheEntry *entry, VirtualFramebuffer *framebuffer, const FramebufferMatchInfo &fbInfo, FramebufferNotificationChannel channel);
|
||||||
void AttachFramebufferInvalid(TexCacheEntry *entry, VirtualFramebuffer *framebuffer, const FramebufferMatchInfo &fbInfo, FramebufferNotificationChannel channel);
|
void AttachFramebufferInvalid(TexCacheEntry *entry, VirtualFramebuffer *framebuffer, const FramebufferMatchInfo &fbInfo, FramebufferNotificationChannel channel);
|
||||||
|
|
Loading…
Add table
Reference in a new issue