|
|
|
@ -4,6 +4,7 @@
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <unordered_set>
|
|
|
|
|
#include <boost/container/small_vector.hpp>
|
|
|
|
|
|
|
|
|
|
#include "common/alignment.h"
|
|
|
|
|
#include "common/settings.h"
|
|
|
|
@ -17,15 +18,10 @@
|
|
|
|
|
|
|
|
|
|
namespace VideoCommon {
|
|
|
|
|
|
|
|
|
|
using Tegra::Texture::SwizzleSource;
|
|
|
|
|
using Tegra::Texture::TextureType;
|
|
|
|
|
using Tegra::Texture::TICEntry;
|
|
|
|
|
using Tegra::Texture::TSCEntry;
|
|
|
|
|
using VideoCore::Surface::GetFormatType;
|
|
|
|
|
using VideoCore::Surface::IsCopyCompatible;
|
|
|
|
|
using VideoCore::Surface::PixelFormat;
|
|
|
|
|
using VideoCore::Surface::PixelFormatFromDepthFormat;
|
|
|
|
|
using VideoCore::Surface::PixelFormatFromRenderTargetFormat;
|
|
|
|
|
using VideoCore::Surface::SurfaceType;
|
|
|
|
|
using namespace Common::Literals;
|
|
|
|
|
|
|
|
|
@ -674,7 +670,8 @@ void TextureCache<P>::CommitAsyncFlushes() {
|
|
|
|
|
bool any_none_dma = false;
|
|
|
|
|
for (PendingDownload& download_info : download_ids) {
|
|
|
|
|
if (download_info.is_swizzle) {
|
|
|
|
|
total_size_bytes += slot_images[download_info.object_id].unswizzled_size_bytes;
|
|
|
|
|
total_size_bytes +=
|
|
|
|
|
Common::AlignUp(slot_images[download_info.object_id].unswizzled_size_bytes, 64);
|
|
|
|
|
any_none_dma = true;
|
|
|
|
|
download_info.async_buffer_id = last_async_buffer_id;
|
|
|
|
|
}
|
|
|
|
@ -868,12 +865,16 @@ std::pair<typename TextureCache<P>::Image*, BufferImageCopy> TextureCache<P>::Dm
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <class P>
|
|
|
|
|
void TextureCache<P>::DownloadImageIntoBuffer(
|
|
|
|
|
typename TextureCache<P>::Image* image, typename TextureCache<P>::BufferType buffer,
|
|
|
|
|
size_t buffer_offset, std::span<const VideoCommon::BufferImageCopy> copies, GPUVAddr address, size_t size) {
|
|
|
|
|
void TextureCache<P>::DownloadImageIntoBuffer(typename TextureCache<P>::Image* image,
|
|
|
|
|
typename TextureCache<P>::BufferType buffer,
|
|
|
|
|
size_t buffer_offset,
|
|
|
|
|
std::span<const VideoCommon::BufferImageCopy> copies,
|
|
|
|
|
GPUVAddr address, size_t size) {
|
|
|
|
|
if constexpr (IMPLEMENTS_ASYNC_DOWNLOADS) {
|
|
|
|
|
auto slot = slot_buffer_downloads.insert(address, size);
|
|
|
|
|
uncommitted_downloads.emplace_back(false, uncommitted_async_buffers.size(), slot);
|
|
|
|
|
const BufferDownload new_buffer_download{address, size};
|
|
|
|
|
auto slot = slot_buffer_downloads.insert(new_buffer_download);
|
|
|
|
|
const PendingDownload new_download{false, uncommitted_async_buffers.size(), slot};
|
|
|
|
|
uncommitted_downloads.emplace_back(new_download);
|
|
|
|
|
auto download_map = runtime.DownloadStagingBuffer(size, true);
|
|
|
|
|
uncommitted_async_buffers.emplace_back(download_map);
|
|
|
|
|
std::array buffers{
|
|
|
|
@ -2269,7 +2270,8 @@ void TextureCache<P>::BindRenderTarget(ImageViewId* old_id, ImageViewId new_id)
|
|
|
|
|
if (new_id) {
|
|
|
|
|
const ImageViewBase& old_view = slot_image_views[new_id];
|
|
|
|
|
if (True(old_view.flags & ImageViewFlagBits::PreemtiveDownload)) {
|
|
|
|
|
uncommitted_downloads.emplace_back(true, 0, old_view.image_id);
|
|
|
|
|
const PendingDownload new_download{true, 0, old_view.image_id};
|
|
|
|
|
uncommitted_downloads.emplace_back(new_download);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*old_id = new_id;
|
|
|
|
|