From 6b9cc0ed23b15a1b96b322b03feff2153e44a4a9 Mon Sep 17 00:00:00 2001 From: ameerj <52414509+ameerj@users.noreply.github.com> Date: Mon, 6 Mar 2023 21:16:17 -0500 Subject: Refactor AccelerateDMA code --- src/video_core/texture_cache/texture_cache.h | 86 ++++++++++++++++++----- src/video_core/texture_cache/texture_cache_base.h | 10 ++- 2 files changed, 76 insertions(+), 20 deletions(-) (limited to 'src/video_core/texture_cache') diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 335338434..8e8b9a5e6 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -744,6 +744,25 @@ void TextureCache
::PopAsyncFlushes() {
}
}
+template ::DmaImageId(const Tegra::DMA::ImageOperand& operand) {
+ const ImageInfo dst_info(operand);
+ const ImageId dst_id = FindDMAImage(dst_info, operand.address);
+ if (!dst_id) {
+ return NULL_IMAGE_ID;
+ }
+ const auto& image = slot_images[dst_id];
+ if (False(image.flags & ImageFlagBits::GpuModified)) {
+ // No need to waste time on an image that's synced with guest
+ return NULL_IMAGE_ID;
+ }
+ const auto base = image.TryFindBase(operand.address);
+ if (!base) {
+ return NULL_IMAGE_ID;
+ }
+ return dst_id;
+}
+
template ::IsRescaling() const noexcept {
return is_rescaling;
@@ -771,6 +790,49 @@ bool TextureCache ::IsRegionGpuModified(VAddr addr, size_t size) {
return is_modified;
}
+template ::DmaBufferImageCopy(
+ const Tegra::DMA::ImageCopy& copy_info, const Tegra::DMA::BufferOperand& buffer_operand,
+ const Tegra::DMA::ImageOperand& image_operand, ImageId image_id, bool modifies_image) {
+ const auto [level, base] = PrepareDmaImage(image_id, image_operand.address, modifies_image);
+ auto* image = &slot_images[image_id];
+ const u32 buffer_size = static_cast ::RefreshContents(Image& image, ImageId image_id) {
if (False(image.flags & ImageFlagBits::CpuModified)) {
@@ -1405,26 +1467,14 @@ ImageId TextureCache ::FindDMAImage(const ImageInfo& info, GPUVAddr gpu_addr)
}
template ::ObtainImage(const Tegra::DMA::ImageOperand& operand, bool mark_as_modified) {
- ImageInfo dst_info(operand);
- ImageId dst_id = FindDMAImage(dst_info, operand.address);
- if (!dst_id) {
- return std::nullopt;
- }
- auto& image = slot_images[dst_id];
- auto base = image.TryFindBase(operand.address);
- if (!base) {
- return std::nullopt;
- }
- if (False(image.flags & ImageFlagBits::GpuModified)) {
- // No need to waste time on an image that's synced with guest
- return std::nullopt;
- }
+std::pair ::PrepareDmaImage(ImageId dst_id, GPUVAddr base_addr,
+ bool mark_as_modified) {
+ const auto& image = slot_images[dst_id];
+ const auto base = image.TryFindBase(base_addr);
PrepareImage(dst_id, mark_as_modified, false);
- auto& new_image = slot_images[dst_id];
+ const auto& new_image = slot_images[dst_id];
lru_cache.Touch(new_image.lru_index, frame_tick);
- return std::make_pair(&new_image, std::make_pair(base->level, base->layer));
+ return std::make_pair(base->level, base->layer);
}
template