diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 6022dd3db0..7058500b0b 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1419,17 +1419,40 @@ u32 TextureCache
::GetAdaptiveBatchSize(const PendingUnswizzle& task, size_t q
multiplier = 8;
}
const u32 dynamic_slices = base_slices * multiplier;
- return std::min(dynamic_slices, static_cast ::GetAdaptiveChunkSize(const PendingUnswizzle& task, size_t queue_size) const {
+ const u32 base_chunk = swizzle_chunk_size;
+ if (base_chunk == 0)
+ return 0;
+
+ constexpr size_t LARGE_BACKLOG = 4;
+ constexpr size_t MODERATE_BACKLOG = 2;
+ constexpr size_t LARGE_TEXTURE_BYTES = 64_MiB;
+ constexpr size_t HUGE_TEXTURE_BYTES = 256_MiB;
+
+ if (queue_size > LARGE_BACKLOG) {
+ u32 multiplier = 4;
+ if (task.total_size < HUGE_TEXTURE_BYTES)
+ multiplier = 8;
+ return (std::min)(base_chunk * multiplier, static_cast ::TickAsyncUnswizzle() {
if (unswizzle_queue.empty()) {
@@ -1465,9 +1488,12 @@ void TextureCache ::TickAsyncUnswizzle() {
const size_t remaining = task.total_size - task.current_offset;
size_t copy_amount = 0;
- if( swizzle_chunk_size == 0 )
+ if (swizzle_chunk_size == 0) {
copy_amount = remaining;
- else copy_amount = (std::min)(swizzle_chunk_size, remaining);
+ } else {
+ const u32 dynamic_chunk = GetAdaptiveChunkSize(task, unswizzle_queue.size());
+ copy_amount = std::min ::TickAsyncUnswizzle() {
task.current_offset += copy_amount;
}
+ if (task.current_offset < task.total_size) {
+ return;
+ }
+
const bool is_final_batch = task.current_offset >= task.total_size;
const size_t bytes_ready = task.current_offset - task.last_submitted_offset;
const u32 complete_slices = static_cast ::TickAsyncUnswizzle() {
const u32 slices_to_process = (std::min)(complete_slices, adaptive_batch);
if (whole_texture) {
- const auto uploads = FullUploadSwizzles(task.info);
- runtime.AccelerateImageUpload(image, task.staging_buffer, FixSmallVectorADL(uploads),
- z_start, slices_to_process);
- task.last_submitted_offset = task.total_size;
+ runtime.AccelerateImageUpload(image, task.staging_buffer,
+ FixSmallVectorADL(FullUploadSwizzles(task.info)), 0,
+ image.info.size.depth);
+ task.last_submitted_offset +=
+ (static_cast