Texture Cache: Improve accuracy of sparse texture detection.
This commit is contained in:
parent
38165fb7e3
commit
fd98fcf7f0
6 changed files with 346 additions and 135 deletions
|
@ -786,37 +786,20 @@ std::vector<ImageCopy> MakeShrinkImageCopies(const ImageInfo& dst, const ImageIn
|
|||
return copies;
|
||||
}
|
||||
|
||||
bool IsValidAddress(const Tegra::MemoryManager& gpu_memory, GPUVAddr gpu_addr) {
|
||||
if (gpu_addr == 0) {
|
||||
return false;
|
||||
}
|
||||
if (gpu_addr > (u64(1) << 48)) {
|
||||
return false;
|
||||
}
|
||||
const auto cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr);
|
||||
return cpu_addr.has_value() && *cpu_addr != 0;
|
||||
}
|
||||
|
||||
bool IsValidEntry(const Tegra::MemoryManager& gpu_memory, const TICEntry& config) {
|
||||
const GPUVAddr gpu_addr = config.Address();
|
||||
if (IsValidAddress(gpu_memory, gpu_addr)) {
|
||||
const GPUVAddr address = config.Address();
|
||||
if (address == 0) {
|
||||
return false;
|
||||
}
|
||||
if (address > (1ULL << 48)) {
|
||||
return false;
|
||||
}
|
||||
if (gpu_memory.GpuToCpuAddress(address).has_value()) {
|
||||
return true;
|
||||
}
|
||||
if (!config.IsBlockLinear()) {
|
||||
return false;
|
||||
}
|
||||
const size_t levels = config.max_mip_level + 1;
|
||||
if (levels <= 1) {
|
||||
return false;
|
||||
}
|
||||
const ImageInfo info{config};
|
||||
const LevelArray offsets = CalculateMipLevelOffsets(info);
|
||||
for (size_t level = 1; level < levels; level++) {
|
||||
if (IsValidAddress(gpu_memory, static_cast<GPUVAddr>(gpu_addr + offsets[level]))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
const size_t guest_size_bytes = CalculateGuestSizeInBytes(info);
|
||||
return gpu_memory.GpuToCpuAddress(address, guest_size_bytes).has_value();
|
||||
}
|
||||
|
||||
std::vector<BufferImageCopy> UnswizzleImage(Tegra::MemoryManager& gpu_memory, GPUVAddr gpu_addr,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue