diff options
| author | 2021-07-20 17:35:05 -0400 | |
|---|---|---|
| committer | 2021-07-20 17:35:05 -0400 | |
| commit | c53b688411d916192820520ef5280ad5e378aa11 (patch) | |
| tree | 6b319d4eaa3b7807b9590268f308b1c03fb5d3a1 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #6658 from Morph1984/render-window-fix (diff) | |
| parent | Buffer cache: Fixes, Clang and Feedback. (diff) | |
| download | yuzu-c53b688411d916192820520ef5280ad5e378aa11.tar.gz yuzu-c53b688411d916192820520ef5280ad5e378aa11.tar.xz yuzu-c53b688411d916192820520ef5280ad5e378aa11.zip | |
Merge pull request #6629 from FernandoS27/accel-dma-2
DMAEngine: Accelerate BufferClear [accelerateDMA Part 2]
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 2 |
4 files changed, 33 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 7d4e6ea7b..0def1e769 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -136,6 +136,30 @@ void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, | |||
| 136 | }); | 136 | }); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | void BufferCacheRuntime::ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value) { | ||
| 140 | static constexpr VkMemoryBarrier READ_BARRIER{ | ||
| 141 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | ||
| 142 | .pNext = nullptr, | ||
| 143 | .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, | ||
| 144 | .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, | ||
| 145 | }; | ||
| 146 | static constexpr VkMemoryBarrier WRITE_BARRIER{ | ||
| 147 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | ||
| 148 | .pNext = nullptr, | ||
| 149 | .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, | ||
| 150 | .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, | ||
| 151 | }; | ||
| 152 | |||
| 153 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 154 | scheduler.Record([dest_buffer, offset, size, value](vk::CommandBuffer cmdbuf) { | ||
| 155 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, | ||
| 156 | 0, READ_BARRIER); | ||
| 157 | cmdbuf.FillBuffer(dest_buffer, offset, size, value); | ||
| 158 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | ||
| 159 | 0, WRITE_BARRIER); | ||
| 160 | }); | ||
| 161 | } | ||
| 162 | |||
| 139 | void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, | 163 | void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, |
| 140 | u32 base_vertex, u32 num_indices, VkBuffer buffer, | 164 | u32 base_vertex, u32 num_indices, VkBuffer buffer, |
| 141 | u32 offset, [[maybe_unused]] u32 size) { | 165 | u32 offset, [[maybe_unused]] u32 size) { |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 6ea8448d7..3bb81d5b3 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -60,6 +60,8 @@ public: | |||
| 60 | void CopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer, | 60 | void CopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer, |
| 61 | std::span<const VideoCommon::BufferCopy> copies); | 61 | std::span<const VideoCommon::BufferCopy> copies); |
| 62 | 62 | ||
| 63 | void ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value); | ||
| 64 | |||
| 63 | void BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, u32 num_indices, | 65 | void BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, u32 num_indices, |
| 64 | u32 base_vertex, VkBuffer buffer, u32 offset, u32 size); | 66 | u32 base_vertex, VkBuffer buffer, u32 offset, u32 size); |
| 65 | 67 | ||
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index a8ffbe6ba..f57c15b37 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -706,6 +706,11 @@ void RasterizerVulkan::FlushWork() { | |||
| 706 | 706 | ||
| 707 | AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_) : buffer_cache{buffer_cache_} {} | 707 | AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_) : buffer_cache{buffer_cache_} {} |
| 708 | 708 | ||
| 709 | bool AccelerateDMA::BufferClear(GPUVAddr src_address, u64 amount, u32 value) { | ||
| 710 | std::scoped_lock lock{buffer_cache.mutex}; | ||
| 711 | return buffer_cache.DMAClear(src_address, amount, value); | ||
| 712 | } | ||
| 713 | |||
| 709 | bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) { | 714 | bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) { |
| 710 | std::scoped_lock lock{buffer_cache.mutex}; | 715 | std::scoped_lock lock{buffer_cache.mutex}; |
| 711 | return buffer_cache.DMACopy(src_address, dest_address, amount); | 716 | return buffer_cache.DMACopy(src_address, dest_address, amount); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 3a78de258..2065209be 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -56,6 +56,8 @@ public: | |||
| 56 | 56 | ||
| 57 | bool BufferCopy(GPUVAddr start_address, GPUVAddr end_address, u64 amount) override; | 57 | bool BufferCopy(GPUVAddr start_address, GPUVAddr end_address, u64 amount) override; |
| 58 | 58 | ||
| 59 | bool BufferClear(GPUVAddr src_address, u64 amount, u32 value) override; | ||
| 60 | |||
| 59 | private: | 61 | private: |
| 60 | BufferCache& buffer_cache; | 62 | BufferCache& buffer_cache; |
| 61 | }; | 63 | }; |