A quick change on the e3D pass

This commit is contained in:
CamilleLaVey
2026-08-28 22:12:34 -04:00
parent 4088d44789
commit 96fc3378a4
3 changed files with 40 additions and 28 deletions
@@ -2639,6 +2639,10 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
if (device->IsExtAstcDecodeModeSupported() && IsLdrAstcFormat(format_info.format)) { if (device->IsExtAstcDecodeModeSupported() && IsLdrAstcFormat(format_info.format)) {
view_next = &astc_decode_mode; view_next = &astc_decode_mode;
} }
auto subresource_range = MakeSubresourceRange(aspect_mask, info.range);
if (True(flags & VideoCommon::ImageViewFlagBits::Slice)) {
subresource_range.levelCount = 1;
}
const VkImageViewCreateInfo create_info{ const VkImageViewCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.pNext = view_next, .pNext = view_next,
@@ -2647,7 +2651,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
.viewType = VkImageViewType{}, .viewType = VkImageViewType{},
.format = format_info.format, .format = format_info.format,
.components = swizzle_mapping, .components = swizzle_mapping,
.subresourceRange = MakeSubresourceRange(aspect_mask, info.range), .subresourceRange = subresource_range,
}; };
const auto create = [&](TextureType tex_type, std::optional<u32> num_layers) { const auto create = [&](TextureType tex_type, std::optional<u32> num_layers) {
VkImageViewCreateInfo ci{create_info}; VkImageViewCreateInfo ci{create_info};
+33 -27
View File
@@ -20,6 +20,7 @@
#include "video_core/engines/kepler_compute.h" #include "video_core/engines/kepler_compute.h"
#include "video_core/guest_memory.h" #include "video_core/guest_memory.h"
#include "video_core/host1x/gpu_device_memory_manager.h" #include "video_core/host1x/gpu_device_memory_manager.h"
#include "video_core/texture_cache/accelerated_swizzle.h"
#include "video_core/texture_cache/image_view_base.h" #include "video_core/texture_cache/image_view_base.h"
#include "video_core/texture_cache/samples_helper.h" #include "video_core/texture_cache/samples_helper.h"
#include "video_core/texture_cache/texture_cache_base.h" #include "video_core/texture_cache/texture_cache_base.h"
@@ -1163,8 +1164,7 @@ void TextureCache<P>::UploadImageContents(Image& image, StagingBuffer& staging)
const GPUVAddr gpu_addr = image.gpu_addr; const GPUVAddr gpu_addr = image.gpu_addr;
if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { if (True(image.flags & ImageFlagBits::AcceleratedUpload)) {
gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), mapped_span.size_bytes(), gpu_memory->ReadBlockUnsafe(gpu_addr, mapped_span.data(), image.guest_size_bytes);
VideoCommon::CacheType::NoTextureCache);
const auto uploads = FullUploadSwizzles(image.info); const auto uploads = FullUploadSwizzles(image.info);
runtime.AccelerateImageUpload(image, staging, FixSmallVectorADL(uploads), 0, 0); runtime.AccelerateImageUpload(image, staging, FixSmallVectorADL(uploads), 0, 0);
return; return;
@@ -1435,18 +1435,16 @@ void TextureCache<P>::TickAsyncUnswizzle() {
Image& image = slot_images[task.image_id]; Image& image = slot_images[task.image_id];
if (!task.initialized) { if (!task.initialized) {
task.total_size = MapSizeBytes(image); task.total_size = image.guest_size_bytes;
task.staging_buffer = runtime.UploadStagingBuffer(task.total_size, true); task.staging_buffer = runtime.UploadStagingBuffer(task.total_size, true);
const auto& info = image.info; const auto layout = FullUploadSwizzles(task.info);
const u32 bytes_per_block = BytesPerBlock(info.format); const auto params =
const u32 width_blocks = Common::DivCeil(info.size.width, 4u); VideoCommon::Accelerated::MakeBlockLinearSwizzle3DParams(layout.front(), task.info);
const u32 height_blocks = Common::DivCeil(info.size.height, 4u); task.bytes_per_slice = params.slice_size;
task.chunked = task.info.block.depth == 0;
const u32 stride = width_blocks * bytes_per_block;
const u32 aligned_height = height_blocks;
task.bytes_per_slice = static_cast<size_t>(stride) * aligned_height;
task.last_submitted_offset = 0; task.last_submitted_offset = 0;
task.slices_submitted = 0;
task.initialized = true; task.initialized = true;
} }
@@ -1461,31 +1459,39 @@ void TextureCache<P>::TickAsyncUnswizzle() {
if (copy_amount == 0) copy_amount = task.bytes_per_slice; if (copy_amount == 0) copy_amount = task.bytes_per_slice;
} }
gpu_memory->ReadBlock(image.gpu_addr + task.current_offset, gpu_memory->ReadBlockUnsafe(image.gpu_addr + task.current_offset,
task.staging_buffer.mapped_span.data() + task.current_offset, task.staging_buffer.mapped_span.data() + task.current_offset,
copy_amount); copy_amount);
task.current_offset += copy_amount; task.current_offset += copy_amount;
} }
const bool is_final_batch = task.current_offset >= task.total_size; 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<u32>(bytes_ready / task.bytes_per_slice);
if (complete_slices >= swizzle_slices_per_batch || (is_final_batch && complete_slices > 0)) { if (task.chunked) {
const u32 z_start = static_cast<u32>(task.last_submitted_offset / task.bytes_per_slice); const size_t bytes_ready = task.current_offset - task.last_submitted_offset;
const u32 slices_to_process = (std::min)(complete_slices, swizzle_slices_per_batch); const u32 complete_slices = static_cast<u32>(bytes_ready / task.bytes_per_slice);
const u32 z_count = (std::min)(slices_to_process, image.info.size.depth - z_start);
if (z_count > 0) { if (complete_slices >= swizzle_slices_per_batch || (is_final_batch && complete_slices > 0)) {
const auto uploads = FullUploadSwizzles(task.info); const u32 z_start = task.slices_submitted;
runtime.AccelerateImageUpload(image, task.staging_buffer, FixSmallVectorADL(uploads), z_start, z_count); const u32 slices_to_process = (std::min)(complete_slices, swizzle_slices_per_batch);
task.last_submitted_offset += (static_cast<size_t>(z_count) * task.bytes_per_slice); const u32 z_count = (std::min)(slices_to_process, image.info.size.depth - z_start);
if (z_count > 0) {
const auto uploads = FullUploadSwizzles(task.info);
runtime.AccelerateImageUpload(image, task.staging_buffer,
FixSmallVectorADL(uploads), z_start, z_count);
task.last_submitted_offset += static_cast<size_t>(z_count) * task.bytes_per_slice;
task.slices_submitted += z_count;
}
} }
} else if (is_final_batch && task.slices_submitted == 0) {
const auto uploads = FullUploadSwizzles(task.info);
runtime.AccelerateImageUpload(image, task.staging_buffer, FixSmallVectorADL(uploads), 0,
image.info.size.depth);
task.slices_submitted = image.info.size.depth;
} }
// Check if complete const bool all_slices_submitted = task.slices_submitted >= image.info.size.depth;
const u32 slices_submitted = static_cast<u32>(task.last_submitted_offset / task.bytes_per_slice);
const bool all_slices_submitted = slices_submitted >= image.info.size.depth;
if (is_final_batch && all_slices_submitted) { if (is_final_batch && all_slices_submitted) {
runtime.FreeDeferredStagingBuffer(task.staging_buffer); runtime.FreeDeferredStagingBuffer(task.staging_buffer);
@@ -138,6 +138,8 @@ class TextureCache : public VideoCommon::ChannelSetupCaches<TextureCacheChannelI
AsyncBuffer staging_buffer; AsyncBuffer staging_buffer;
size_t last_submitted_offset = 0; size_t last_submitted_offset = 0;
size_t bytes_per_slice; size_t bytes_per_slice;
u32 slices_submitted = 0;
bool chunked = false;
bool initialized = false; bool initialized = false;
}; };