|
|
@ -1408,6 +1408,7 @@ void TextureCache<P>::QueueAsyncDecode(Image& image, ImageId image_id) { |
|
|
LOG_INFO(HW_GPU, "Queuing async texture decode"); |
|
|
LOG_INFO(HW_GPU, "Queuing async texture decode"); |
|
|
|
|
|
|
|
|
image.flags |= ImageFlagBits::IsDecoding; |
|
|
image.flags |= ImageFlagBits::IsDecoding; |
|
|
|
|
|
runtime.TransitionImageLayout(image); |
|
|
auto decode = std::make_unique<AsyncDecodeContext>(); |
|
|
auto decode = std::make_unique<AsyncDecodeContext>(); |
|
|
auto* decode_ptr = decode.get(); |
|
|
auto* decode_ptr = decode.get(); |
|
|
decode->image_id = image_id; |
|
|
decode->image_id = image_id; |
|
|
@ -1440,6 +1441,7 @@ void TextureCache<P>::QueueAsyncUnswizzle(Image& image, ImageId image_id) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
image.flags |= ImageFlagBits::IsDecoding; |
|
|
image.flags |= ImageFlagBits::IsDecoding; |
|
|
|
|
|
runtime.TransitionImageLayout(image); |
|
|
|
|
|
|
|
|
unswizzle_queue.push_back({ |
|
|
unswizzle_queue.push_back({ |
|
|
.image_id = image_id, |
|
|
.image_id = image_id, |
|
|
@ -1719,17 +1721,18 @@ ImageId TextureCache<P>::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, DA |
|
|
join_copies_to_do.emplace_back(JoinCopy{false, overlap_id}); |
|
|
join_copies_to_do.emplace_back(JoinCopy{false, overlap_id}); |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
LOG_WARNING(HW_GPU, |
|
|
|
|
|
"Dropping GPU modified overlap with no copy path: " |
|
|
|
|
|
"overlap{{gpu_addr=0x{:x} format={} size={}x{}x{} levels={} layers={}}} " |
|
|
|
|
|
"new{{gpu_addr=0x{:x} format={} size={}x{}x{} levels={} layers={}}}", |
|
|
|
|
|
overlap.gpu_addr, static_cast<int>(overlap.info.format), |
|
|
|
|
|
overlap.info.size.width, overlap.info.size.height, |
|
|
|
|
|
overlap.info.size.depth, overlap.info.resources.levels, |
|
|
|
|
|
overlap.info.resources.layers, new_image.gpu_addr, |
|
|
|
|
|
static_cast<int>(new_info.format), new_info.size.width, |
|
|
|
|
|
new_info.size.height, new_info.size.depth, new_info.resources.levels, |
|
|
|
|
|
new_info.resources.layers); |
|
|
|
|
|
|
|
|
if (overlap.IsSafeDownload() && False(overlap.flags & ImageFlagBits::BadOverlap) && |
|
|
|
|
|
gpu_memory->GpuToCpuAddress(overlap.gpu_addr).has_value()) { |
|
|
|
|
|
QueueEvictionDownload(overlap); |
|
|
|
|
|
} else { |
|
|
|
|
|
LOG_WARNING(HW_GPU, |
|
|
|
|
|
"Dropping GPU modified overlap, contents are not recoverable: " |
|
|
|
|
|
"gpu_addr=0x{:x} format={} size={}x{}x{} levels={} layers={}", |
|
|
|
|
|
overlap.gpu_addr, static_cast<int>(overlap.info.format), |
|
|
|
|
|
overlap.info.size.width, overlap.info.size.height, |
|
|
|
|
|
overlap.info.size.depth, overlap.info.resources.levels, |
|
|
|
|
|
overlap.info.resources.layers); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (True(overlap.flags & ImageFlagBits::Tracked)) { |
|
|
if (True(overlap.flags & ImageFlagBits::Tracked)) { |
|
|
UntrackImage(overlap, overlap_id); |
|
|
UntrackImage(overlap, overlap_id); |
|
|
|