diff options
| author | 2021-07-18 18:30:28 -0400 | |
|---|---|---|
| committer | 2021-07-18 18:30:28 -0400 | |
| commit | efc449ca264bf04d51232b884e4fe16e009e190d (patch) | |
| tree | ceac80121295e31d02c6a715862a6cc489450940 | |
| parent | Merge pull request #6647 from lat9nq/specify-system-path (diff) | |
| parent | vk_texture_cache: Finalize renderpass when downloading images (diff) | |
| download | yuzu-efc449ca264bf04d51232b884e4fe16e009e190d.tar.gz yuzu-efc449ca264bf04d51232b884e4fe16e009e190d.tar.xz yuzu-efc449ca264bf04d51232b884e4fe16e009e190d.zip | |
Merge pull request #6677 from ReinUsesLisp/new-validate-errors
vulkan: Fix misc validation and synchronization errors
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_compute_pass.cpp | 33 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 1 |
2 files changed, 18 insertions, 16 deletions
diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp index 205cd3b05..4181d83ee 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp | |||
| @@ -374,20 +374,20 @@ void ASTCDecoderPass::MakeDataBuffer() { | |||
| 374 | 374 | ||
| 375 | scheduler.Record([src = staging_ref.buffer, offset = staging_ref.offset, dst = *data_buffer, | 375 | scheduler.Record([src = staging_ref.buffer, offset = staging_ref.offset, dst = *data_buffer, |
| 376 | TOTAL_BUFFER_SIZE](vk::CommandBuffer cmdbuf) { | 376 | TOTAL_BUFFER_SIZE](vk::CommandBuffer cmdbuf) { |
| 377 | cmdbuf.CopyBuffer(src, dst, | 377 | static constexpr VkMemoryBarrier write_barrier{ |
| 378 | VkBufferCopy{ | 378 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
| 379 | .srcOffset = offset, | 379 | .pNext = nullptr, |
| 380 | .dstOffset = 0, | 380 | .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, |
| 381 | .size = TOTAL_BUFFER_SIZE, | 381 | .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, |
| 382 | }); | 382 | }; |
| 383 | cmdbuf.PipelineBarrier( | 383 | const VkBufferCopy copy{ |
| 384 | VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, | 384 | .srcOffset = offset, |
| 385 | VkMemoryBarrier{ | 385 | .dstOffset = 0, |
| 386 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | 386 | .size = TOTAL_BUFFER_SIZE, |
| 387 | .pNext = nullptr, | 387 | }; |
| 388 | .srcAccessMask = 0, | 388 | cmdbuf.CopyBuffer(src, dst, copy); |
| 389 | .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, | 389 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, |
| 390 | }); | 390 | 0, write_barrier); |
| 391 | }); | 391 | }); |
| 392 | } | 392 | } |
| 393 | 393 | ||
| @@ -411,7 +411,7 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map, | |||
| 411 | const VkImageMemoryBarrier image_barrier{ | 411 | const VkImageMemoryBarrier image_barrier{ |
| 412 | .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | 412 | .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, |
| 413 | .pNext = nullptr, | 413 | .pNext = nullptr, |
| 414 | .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, | 414 | .srcAccessMask = is_initialized ? VK_ACCESS_SHADER_WRITE_BIT : VkAccessFlags{}, |
| 415 | .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, | 415 | .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, |
| 416 | .oldLayout = is_initialized ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED, | 416 | .oldLayout = is_initialized ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED, |
| 417 | .newLayout = VK_IMAGE_LAYOUT_GENERAL, | 417 | .newLayout = VK_IMAGE_LAYOUT_GENERAL, |
| @@ -426,7 +426,8 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map, | |||
| 426 | .layerCount = VK_REMAINING_ARRAY_LAYERS, | 426 | .layerCount = VK_REMAINING_ARRAY_LAYERS, |
| 427 | }, | 427 | }, |
| 428 | }; | 428 | }; |
| 429 | cmdbuf.PipelineBarrier(is_initialized ? VK_PIPELINE_STAGE_ALL_COMMANDS_BIT : 0, | 429 | cmdbuf.PipelineBarrier(is_initialized ? VK_PIPELINE_STAGE_ALL_COMMANDS_BIT |
| 430 | : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, | ||
| 430 | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, image_barrier); | 431 | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, image_barrier); |
| 431 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, vk_pipeline); | 432 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, vk_pipeline); |
| 432 | }); | 433 | }); |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index a2ab4d1ee..2638099ed 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -911,6 +911,7 @@ void Image::UploadMemory(const StagingBufferRef& map, | |||
| 911 | 911 | ||
| 912 | void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { | 912 | void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { |
| 913 | std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); | 913 | std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); |
| 914 | scheduler->RequestOutsideRenderPassOperationContext(); | ||
| 914 | scheduler->Record([buffer = map.buffer, image = *image, aspect_mask = aspect_mask, | 915 | scheduler->Record([buffer = map.buffer, image = *image, aspect_mask = aspect_mask, |
| 915 | vk_copies](vk::CommandBuffer cmdbuf) { | 916 | vk_copies](vk::CommandBuffer cmdbuf) { |
| 916 | const VkImageMemoryBarrier read_barrier{ | 917 | const VkImageMemoryBarrier read_barrier{ |