summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-07-13 03:33:08 +0200
committerGravatar Fernando Sahmkow2021-07-13 03:49:47 +0200
commitb780d5b5c580a65a670de73140b743072efc0fd2 (patch)
treeef6371d8107ab18932ac2514f3d498c62f1323e6 /src/video_core/renderer_vulkan
parentMerge pull request #6597 from FernandoS27/accelerate-dma (diff)
downloadyuzu-b780d5b5c580a65a670de73140b743072efc0fd2.tar.gz
yuzu-b780d5b5c580a65a670de73140b743072efc0fd2.tar.xz
yuzu-b780d5b5c580a65a670de73140b743072efc0fd2.zip
DMAEngine: Accelerate BufferClear
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp24
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h2
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp5
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h2
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 0df4e1a1c..11e86174e 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
139void 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
139void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, 163void 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 982e92191..60d49386e 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 e378a5679..fd9eed3e3 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -704,6 +704,11 @@ void RasterizerVulkan::FlushWork() {
704 704
705AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_) : buffer_cache{buffer_cache_} {} 705AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_) : buffer_cache{buffer_cache_} {}
706 706
707bool AccelerateDMA::BufferClear(GPUVAddr src_address, u64 amount, u32 value) {
708 std::scoped_lock lock{buffer_cache.mutex};
709 return buffer_cache.DMAClear(src_address, amount, value);
710}
711
707bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) { 712bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) {
708 std::scoped_lock lock{buffer_cache.mutex}; 713 std::scoped_lock lock{buffer_cache.mutex};
709 return buffer_cache.DMACopy(src_address, dest_address, amount); 714 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
59private: 61private:
60 BufferCache& buffer_cache; 62 BufferCache& buffer_cache;
61}; 63};