Merge pull request #9988 from rschlaikjer/rs-gpu-page-table-copy-elision

Pass GPU page table by reference inside TextureCache::ForEachImageInRegionGPU
This commit is contained in:
Morph 2023-03-25 01:59:08 -04:00 committed by GitHub
commit 6892a0942f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 32 additions and 31 deletions

View File

@ -1616,37 +1616,38 @@ void TextureCache<P>::ForEachImageInRegionGPU(size_t as_id, GPUVAddr gpu_addr, s
return; return;
} }
auto& gpu_page_table = gpu_page_table_storage[*storage_id]; auto& gpu_page_table = gpu_page_table_storage[*storage_id];
ForEachGPUPage(gpu_addr, size, [this, gpu_page_table, &images, gpu_addr, size, func](u64 page) { ForEachGPUPage(gpu_addr, size,
const auto it = gpu_page_table.find(page); [this, &gpu_page_table, &images, gpu_addr, size, func](u64 page) {
if (it == gpu_page_table.end()) { const auto it = gpu_page_table.find(page);
if constexpr (BOOL_BREAK) { if (it == gpu_page_table.end()) {
return false; if constexpr (BOOL_BREAK) {
} else { return false;
return; } else {
} return;
} }
for (const ImageId image_id : it->second) { }
Image& image = slot_images[image_id]; for (const ImageId image_id : it->second) {
if (True(image.flags & ImageFlagBits::Picked)) { Image& image = slot_images[image_id];
continue; if (True(image.flags & ImageFlagBits::Picked)) {
} continue;
if (!image.OverlapsGPU(gpu_addr, size)) { }
continue; if (!image.OverlapsGPU(gpu_addr, size)) {
} continue;
image.flags |= ImageFlagBits::Picked; }
images.push_back(image_id); image.flags |= ImageFlagBits::Picked;
if constexpr (BOOL_BREAK) { images.push_back(image_id);
if (func(image_id, image)) { if constexpr (BOOL_BREAK) {
return true; if (func(image_id, image)) {
} return true;
} else { }
func(image_id, image); } else {
} func(image_id, image);
} }
if constexpr (BOOL_BREAK) { }
return false; if constexpr (BOOL_BREAK) {
} return false;
}); }
});
for (const ImageId image_id : images) { for (const ImageId image_id : images) {
slot_images[image_id].flags &= ~ImageFlagBits::Picked; slot_images[image_id].flags &= ~ImageFlagBits::Picked;
} }