|
|
@ -39,6 +39,12 @@ TextureCache<P>::TextureCache(Runtime& runtime_, VideoCore::RasterizerInterface& |
|
|
sampler_descriptor.mipmap_filter.Assign(Tegra::Texture::TextureMipmapFilter::Linear); |
|
|
sampler_descriptor.mipmap_filter.Assign(Tegra::Texture::TextureMipmapFilter::Linear); |
|
|
sampler_descriptor.cubemap_anisotropy.Assign(1); |
|
|
sampler_descriptor.cubemap_anisotropy.Assign(1); |
|
|
|
|
|
|
|
|
|
|
|
// These values were chosen based on typical peak swizzle data sizes seen in some titles |
|
|
|
|
|
static constexpr size_t SWIZZLE_DATA_BUFFER_INITIAL_CAPACITY = 8_MiB; |
|
|
|
|
|
static constexpr size_t UNSWIZZLE_DATA_BUFFER_INITIAL_CAPACITY = 1_MiB; |
|
|
|
|
|
swizzle_data_buffer.reserve(SWIZZLE_DATA_BUFFER_INITIAL_CAPACITY); |
|
|
|
|
|
unswizzle_data_buffer.reserve(UNSWIZZLE_DATA_BUFFER_INITIAL_CAPACITY); |
|
|
|
|
|
|
|
|
// Make sure the first index is reserved for the null resources |
|
|
// Make sure the first index is reserved for the null resources |
|
|
// This way the null resource becomes a compile time constant |
|
|
// This way the null resource becomes a compile time constant |
|
|
void(slot_images.insert(NullImageParams{})); |
|
|
void(slot_images.insert(NullImageParams{})); |
|
|
@ -734,13 +740,21 @@ void TextureCache<P>::UploadImageContents(Image& image, StagingBuffer& staging) |
|
|
gpu_memory->ReadBlockUnsafe(gpu_addr, mapped_span.data(), mapped_span.size_bytes()); |
|
|
gpu_memory->ReadBlockUnsafe(gpu_addr, mapped_span.data(), mapped_span.size_bytes()); |
|
|
const auto uploads = FullUploadSwizzles(image.info); |
|
|
const auto uploads = FullUploadSwizzles(image.info); |
|
|
runtime.AccelerateImageUpload(image, staging, uploads); |
|
|
runtime.AccelerateImageUpload(image, staging, uploads); |
|
|
} else if (True(image.flags & ImageFlagBits::Converted)) { |
|
|
|
|
|
std::vector<u8> unswizzled_data(image.unswizzled_size_bytes); |
|
|
|
|
|
auto copies = UnswizzleImage(*gpu_memory, gpu_addr, image.info, unswizzled_data); |
|
|
|
|
|
ConvertImage(unswizzled_data, image.info, mapped_span, copies); |
|
|
|
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
const size_t guest_size_bytes = image.guest_size_bytes; |
|
|
|
|
|
swizzle_data_buffer.resize(guest_size_bytes); |
|
|
|
|
|
gpu_memory->ReadBlockUnsafe(gpu_addr, swizzle_data_buffer.data(), guest_size_bytes); |
|
|
|
|
|
|
|
|
|
|
|
if (True(image.flags & ImageFlagBits::Converted)) { |
|
|
|
|
|
unswizzle_data_buffer.resize(image.unswizzled_size_bytes); |
|
|
|
|
|
auto copies = UnswizzleImage(*gpu_memory, gpu_addr, image.info, swizzle_data_buffer, |
|
|
|
|
|
unswizzle_data_buffer); |
|
|
|
|
|
ConvertImage(unswizzle_data_buffer, image.info, mapped_span, copies); |
|
|
image.UploadMemory(staging, copies); |
|
|
image.UploadMemory(staging, copies); |
|
|
} else { |
|
|
} else { |
|
|
const auto copies = UnswizzleImage(*gpu_memory, gpu_addr, image.info, mapped_span); |
|
|
|
|
|
|
|
|
const auto copies = |
|
|
|
|
|
UnswizzleImage(*gpu_memory, gpu_addr, image.info, swizzle_data_buffer, mapped_span); |
|
|
image.UploadMemory(staging, copies); |
|
|
image.UploadMemory(staging, copies); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -910,7 +924,7 @@ void TextureCache<P>::InvalidateScale(Image& image) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <class P> |
|
|
template <class P> |
|
|
u64 TextureCache<P>::GetScaledImageSizeBytes(ImageBase& image) { |
|
|
|
|
|
|
|
|
u64 TextureCache<P>::GetScaledImageSizeBytes(const ImageBase& image) { |
|
|
const u64 scale_up = static_cast<u64>(Settings::values.resolution_info.up_scale * |
|
|
const u64 scale_up = static_cast<u64>(Settings::values.resolution_info.up_scale * |
|
|
Settings::values.resolution_info.up_scale); |
|
|
Settings::values.resolution_info.up_scale); |
|
|
const u64 down_shift = static_cast<u64>(Settings::values.resolution_info.down_shift + |
|
|
const u64 down_shift = static_cast<u64>(Settings::values.resolution_info.down_shift + |
|
|
|