diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index ae3d1e06c..6bc2ba61d 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -296,6 +296,31 @@ void Image::Transit(vk::ImageLayout dst_layout, vk::Flags ds pl_stage = dst_pl_stage; } +void Image::Upload(vk::Buffer buffer, u64 offset) { + Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eTransferWrite); + + // Copy to the image. + const vk::BufferImageCopy image_copy = { + .bufferOffset = offset, + .bufferRowLength = info.pitch, + .bufferImageHeight = info.size.height, + .imageSubresource{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .mipLevel = 0, + .baseArrayLayer = 0, + .layerCount = 1, + }, + .imageOffset = {0, 0, 0}, + .imageExtent = {info.size.width, info.size.height, 1}, + }; + + const auto cmdbuf = scheduler->CommandBuffer(); + cmdbuf.copyBufferToImage(buffer, image, vk::ImageLayout::eTransferDstOptimal, image_copy); + + Transit(vk::ImageLayout::eGeneral, + vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead); +} + Image::~Image() = default; } // namespace VideoCore diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h index f54a796f1..d7377e79a 100644 --- a/src/video_core/texture_cache/image.h +++ b/src/video_core/texture_cache/image.h @@ -117,6 +117,7 @@ struct Image { } void Transit(vk::ImageLayout dst_layout, vk::Flags dst_mask); + void Upload(vk::Buffer buffer, u64 offset); const Vulkan::Instance* instance; Vulkan::Scheduler* scheduler; diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 526dfa475..f58bdcf2b 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -210,26 +210,8 @@ void TextureCache::RefreshImage(Image& image) { if (!tile_manager.TryDetile(image)) { // Upload data to the staging buffer. const auto offset = staging.Copy(image.cpu_addr, image.info.guest_size_bytes, 4); - image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eTransferWrite); - // Copy to the image. - const vk::BufferImageCopy image_copy = { - .bufferOffset = offset, - .bufferRowLength = 0, - .bufferImageHeight = 0, - .imageSubresource{ - .aspectMask = vk::ImageAspectFlagBits::eColor, - .mipLevel = 0, - .baseArrayLayer = 0, - .layerCount = 1, - }, - .imageOffset = {0, 0, 0}, - .imageExtent = {image.info.size.width, image.info.size.height, 1}, - }; - - const auto cmdbuf = scheduler.CommandBuffer(); - cmdbuf.copyBufferToImage(staging.Handle(), image.image, - vk::ImageLayout::eTransferDstOptimal, image_copy); + image.Upload(staging.Handle(), offset); } image.Transit(vk::ImageLayout::eGeneral, diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index 94f0439c4..b2ff753b8 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -15,7 +15,6 @@ #include #include -#include namespace VideoCore {