diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp index 6bee2407b7..f1b0248233 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp @@ -697,8 +697,7 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map, } const VkImageAspectFlags aspect_mask = image.AspectMask(); const VkImage vk_image = image.Handle(); - RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, - image.ExchangeInitialization()); + RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, !reorder); for (const VideoCommon::SwizzleParameters& swizzle : swizzles) { const size_t input_offset = swizzle.buffer_offset + map.offset; const u32 num_dispatches_x = Common::DivCeil(swizzle.num_tiles.width, 8U); @@ -760,8 +759,7 @@ void BlockLinearUnswizzleImage2DPass::Unswizzle( } const VkImageAspectFlags aspect_mask = image.AspectMask(); const VkImage vk_image = image.Handle(); - RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, - image.ExchangeInitialization()); + RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, !reorder); for (const VideoCommon::SwizzleParameters& swizzle : swizzles) { const size_t input_offset = swizzle.buffer_offset + map.offset; const u32 num_dispatches_x = Common::DivCeil(swizzle.num_tiles.width, 32U); @@ -810,8 +808,7 @@ void BlockLinearUnswizzleImage3DPass::Unswizzle( } const VkImageAspectFlags aspect_mask = image.AspectMask(); const VkImage vk_image = image.Handle(); - RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, - image.ExchangeInitialization()); + RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, !reorder); for (const VideoCommon::SwizzleParameters& swizzle : swizzles) { const size_t input_offset = swizzle.buffer_offset + map.offset; const u32 num_dispatches_x = Common::DivCeil(swizzle.num_tiles.width, 16U); @@ -873,8 +870,7 @@ void PitchUnswizzlePass::Unswizzle(Image& image, const StagingBufferRef& map, } const VkImageAspectFlags aspect_mask = image.AspectMask(); const VkImage vk_image = image.Handle(); - RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, - image.ExchangeInitialization()); + RecordUnswizzleBeginBarrier(scheduler, reorder, *pipeline, vk_image, aspect_mask, !reorder); for (const VideoCommon::SwizzleParameters& swizzle : swizzles) { const size_t input_offset = swizzle.buffer_offset + map.offset; const u32 num_dispatches_x = Common::DivCeil(swizzle.num_tiles.width, 32U); diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 5975ae13a7..2e26880868 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1029,6 +1029,8 @@ void TextureCache

::RefreshContents(Image& image, ImageId image_id) { runtime.TransitionImageLayout(image); return; } + gpu_memory->FlushRegion(image.gpu_addr, image.guest_size_bytes, + VideoCommon::CacheType::NoTextureCache); if (True(image.flags & ImageFlagBits::AsynchronousDecode)) { QueueAsyncDecode(image, image_id); return; @@ -1042,8 +1044,6 @@ void TextureCache

::RefreshContents(Image& image, ImageId image_id) { device_memory.GetSpan(*device_addr, image.guest_size_bytes), image.guest_size_bytes); if (source) { - gpu_memory->FlushRegion(image.gpu_addr, image.guest_size_bytes, - VideoCommon::CacheType::NoTextureCache); runtime.AccelerateImageUpload( image, *source, FixSmallVectorADL(FullUploadSwizzles(image.info))); return; @@ -1076,8 +1076,7 @@ void TextureCache

::UploadImageContents(Image& image, StagingBuffer& staging) const GPUVAddr gpu_addr = image.gpu_addr; if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { - gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), image.guest_size_bytes, - VideoCommon::CacheType::NoTextureCache); + gpu_memory->ReadBlockUnsafe(gpu_addr, mapped_span.data(), image.guest_size_bytes); const auto uploads = FullUploadSwizzles(image.info); runtime.AccelerateImageUpload(image, staging, FixSmallVectorADL(uploads)); return; diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 4a02299a33..cd5e5a8412 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -879,6 +879,9 @@ bool Device::ShouldBoostClocks() const { } bool Device::HasTimelineSemaphore() const { + if (GetDriverID() == VK_DRIVER_ID_MESA_TURNIP) { + return false; + } return features.timeline_semaphore.timelineSemaphore; }