texture_cache: Use unordered_map::find instead of operator[] on hot code
This commit is contained in:
parent
d2b2557542
commit
b8b6f94ba9
1 changed files with 20 additions and 16 deletions
|
@ -310,18 +310,20 @@ public:
|
||||||
dst_surface.first->MarkAsModified(true, Tick());
|
dst_surface.first->MarkAsModified(true, Tick());
|
||||||
}
|
}
|
||||||
|
|
||||||
TSurface TryFindFramebufferSurface(VAddr addr) {
|
TSurface TryFindFramebufferSurface(VAddr addr) const {
|
||||||
if (!addr) {
|
if (!addr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
const VAddr page = addr >> registry_page_bits;
|
const VAddr page = addr >> registry_page_bits;
|
||||||
std::vector<TSurface>& list = registry[page];
|
const auto it = registry.find(page);
|
||||||
for (auto& surface : list) {
|
if (it == registry.end()) {
|
||||||
if (surface->GetCpuAddr() == addr) {
|
return nullptr;
|
||||||
return surface;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
const auto& list = it->second;
|
||||||
|
const auto found = std::find_if(list.begin(), list.end(), [addr](const auto& surface) {
|
||||||
|
return surface->GetCpuAddr() == addr;
|
||||||
|
});
|
||||||
|
return found != list.end() ? *found : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 Tick() {
|
u64 Tick() {
|
||||||
|
@ -1130,18 +1132,20 @@ private:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
const VAddr cpu_addr_end = cpu_addr + size;
|
const VAddr cpu_addr_end = cpu_addr + size;
|
||||||
VAddr start = cpu_addr >> registry_page_bits;
|
|
||||||
const VAddr end = (cpu_addr_end - 1) >> registry_page_bits;
|
const VAddr end = (cpu_addr_end - 1) >> registry_page_bits;
|
||||||
VectorSurface surfaces;
|
VectorSurface surfaces;
|
||||||
while (start <= end) {
|
for (VAddr start = cpu_addr >> registry_page_bits; start <= end; ++start) {
|
||||||
std::vector<TSurface>& list = registry[start];
|
const auto it = registry.find(start);
|
||||||
for (auto& surface : list) {
|
if (it == registry.end()) {
|
||||||
if (!surface->IsPicked() && surface->Overlaps(cpu_addr, cpu_addr_end)) {
|
continue;
|
||||||
surface->MarkAsPicked(true);
|
}
|
||||||
surfaces.push_back(surface);
|
for (auto& surface : it->second) {
|
||||||
}
|
if (surface->IsPicked() || !surface->Overlaps(cpu_addr, cpu_addr_end)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
surface->MarkAsPicked(true);
|
||||||
|
surfaces.push_back(surface);
|
||||||
}
|
}
|
||||||
start++;
|
|
||||||
}
|
}
|
||||||
for (auto& surface : surfaces) {
|
for (auto& surface : surfaces) {
|
||||||
surface->MarkAsPicked(false);
|
surface->MarkAsPicked(false);
|
||||||
|
|
Loading…
Reference in a new issue