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