Texture cache: sync the first flush.

This commit is contained in:
Fernando Sahmkow 2023-05-01 17:34:03 +02:00
parent c6cac2ffaa
commit 0f4f18265f
2 changed files with 30 additions and 3 deletions

View file

@ -40,6 +40,7 @@ struct ImageInfo {
bool rescaleable = false; bool rescaleable = false;
bool downscaleable = false; bool downscaleable = false;
bool forced_flushed = false; bool forced_flushed = false;
bool dma_downloaded = false;
}; };
} // namespace VideoCommon } // namespace VideoCommon

View file

@ -709,18 +709,43 @@ void TextureCache<P>::CommitAsyncFlushes() {
download_info.async_buffer_id = last_async_buffer_id; download_info.async_buffer_id = last_async_buffer_id;
} }
} }
if (any_none_dma) { if (any_none_dma) {
bool all_pre_sync = true;
auto download_map = runtime.DownloadStagingBuffer(total_size_bytes, true); auto download_map = runtime.DownloadStagingBuffer(total_size_bytes, true);
for (const PendingDownload& download_info : download_ids) { for (const PendingDownload& download_info : download_ids) {
if (download_info.is_swizzle) { if (download_info.is_swizzle) {
Image& image = slot_images[download_info.object_id]; Image& image = slot_images[download_info.object_id];
all_pre_sync &= image.info.dma_downloaded;
image.info.dma_downloaded = true;
const auto copies = FullDownloadCopies(image.info); const auto copies = FullDownloadCopies(image.info);
image.DownloadMemory(download_map, copies); image.DownloadMemory(download_map, copies);
download_map.offset += Common::AlignUp(image.unswizzled_size_bytes, 64); download_map.offset += Common::AlignUp(image.unswizzled_size_bytes, 64);
} }
} }
uncommitted_async_buffers.emplace_back(download_map); if (!all_pre_sync) {
runtime.Finish();
auto it = download_ids.begin();
while (it != download_ids.end()) {
const PendingDownload& download_info = *it;
if (download_info.is_swizzle) {
const ImageBase& image = slot_images[download_info.object_id];
const auto copies = FullDownloadCopies(image.info);
download_map.offset -= Common::AlignUp(image.unswizzled_size_bytes, 64);
std::span<u8> download_span =
download_map.mapped_span.subspan(download_map.offset);
SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, download_span,
swizzle_data_buffer);
it = download_ids.erase(it);
} else {
it++;
}
}
} else {
uncommitted_async_buffers.emplace_back(download_map);
}
} }
async_buffers.emplace_back(std::move(uncommitted_async_buffers)); async_buffers.emplace_back(std::move(uncommitted_async_buffers));
uncommitted_async_buffers.clear(); uncommitted_async_buffers.clear();
} }
@ -820,8 +845,9 @@ ImageId TextureCache<P>::DmaImageId(const Tegra::DMA::ImageOperand& operand) {
// No need to waste time on an image that's synced with guest // No need to waste time on an image that's synced with guest
return NULL_IMAGE_ID; return NULL_IMAGE_ID;
} }
if (!image.info.forced_flushed) { if (!image.info.dma_downloaded) {
image.info.forced_flushed = true; // Force a full sync.
image.info.dma_downloaded = true;
return NULL_IMAGE_ID; return NULL_IMAGE_ID;
} }
const auto base = image.TryFindBase(operand.address); const auto base = image.TryFindBase(operand.address);