summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar bunnei2020-05-03 02:43:18 -0400
committerGravatar GitHub2020-05-03 02:43:18 -0400
commit2aff0b473338655fba08f83c6a4c0af808b6d4a9 (patch)
treeaae207eac2560d76f835a0eba3511b36fcf4a571 /src/video_core/renderer_vulkan
parentMerge pull request #3861 from lat9nq/ci-enable-vulkan (diff)
parent{maxwell_3d,buffer_cache}: Implement memory barriers using 3D registers (diff)
downloadyuzu-2aff0b473338655fba08f83c6a4c0af808b6d4a9.tar.gz
yuzu-2aff0b473338655fba08f83c6a4c0af808b6d4a9.tar.xz
yuzu-2aff0b473338655fba08f83c6a4c0af808b6d4a9.zip
Merge pull request #3808 from ReinUsesLisp/wait-for-idle
{maxwell_3d,buffer_cache}: Implement memory barriers using 3D registers
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h2
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp22
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h2
-rw-r--r--src/video_core/renderer_vulkan/wrapper.cpp1
-rw-r--r--src/video_core/renderer_vulkan/wrapper.h10
5 files changed, 34 insertions, 3 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h
index a2d0b42b1..a54583e7d 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.h
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h
@@ -52,8 +52,6 @@ public:
52protected: 52protected:
53 VkBuffer ToHandle(const Buffer& buffer) override; 53 VkBuffer ToHandle(const Buffer& buffer) override;
54 54
55 void WriteBarrier() override {}
56
57 Buffer CreateBlock(VAddr cpu_addr, std::size_t size) override; 55 Buffer CreateBlock(VAddr cpu_addr, std::size_t size) override;
58 56
59 void UploadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, 57 void UploadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size,
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 722fde384..8b009fc22 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -299,7 +299,7 @@ RasterizerVulkan::RasterizerVulkan(Core::System& system, Core::Frontend::EmuWind
299 buffer_cache(*this, system, device, memory_manager, scheduler, staging_pool), 299 buffer_cache(*this, system, device, memory_manager, scheduler, staging_pool),
300 sampler_cache(device), 300 sampler_cache(device),
301 fence_manager(system, *this, device, scheduler, texture_cache, buffer_cache, query_cache), 301 fence_manager(system, *this, device, scheduler, texture_cache, buffer_cache, query_cache),
302 query_cache(system, *this, device, scheduler) { 302 query_cache(system, *this, device, scheduler), wfi_event{device.GetLogical().CreateEvent()} {
303 scheduler.SetQueryCache(query_cache); 303 scheduler.SetQueryCache(query_cache);
304} 304}
305 305
@@ -573,6 +573,26 @@ void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) {
573 InvalidateRegion(addr, size); 573 InvalidateRegion(addr, size);
574} 574}
575 575
576void RasterizerVulkan::WaitForIdle() {
577 // Everything but wait pixel operations. This intentionally includes FRAGMENT_SHADER_BIT because
578 // fragment shaders can still write storage buffers.
579 VkPipelineStageFlags flags =
580 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
581 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
582 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
583 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
584 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT;
585 if (device.IsExtTransformFeedbackSupported()) {
586 flags |= VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
587 }
588
589 scheduler.RequestOutsideRenderPassOperationContext();
590 scheduler.Record([event = *wfi_event, flags](vk::CommandBuffer cmdbuf) {
591 cmdbuf.SetEvent(event, flags);
592 cmdbuf.WaitEvents(event, flags, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, {}, {}, {});
593 });
594}
595
576void RasterizerVulkan::FlushCommands() { 596void RasterizerVulkan::FlushCommands() {
577 if (draw_counter > 0) { 597 if (draw_counter > 0) {
578 draw_counter = 0; 598 draw_counter = 0;
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h
index 703a094c3..0ed0e48c6 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.h
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.h
@@ -126,6 +126,7 @@ public:
126 void SignalSyncPoint(u32 value) override; 126 void SignalSyncPoint(u32 value) override;
127 void ReleaseFences() override; 127 void ReleaseFences() override;
128 void FlushAndInvalidateRegion(VAddr addr, u64 size) override; 128 void FlushAndInvalidateRegion(VAddr addr, u64 size) override;
129 void WaitForIdle() override;
129 void FlushCommands() override; 130 void FlushCommands() override;
130 void TickFrame() override; 131 void TickFrame() override;
131 bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, 132 bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,
@@ -275,6 +276,7 @@ private:
275 276
276 vk::Buffer default_buffer; 277 vk::Buffer default_buffer;
277 VKMemoryCommit default_buffer_commit; 278 VKMemoryCommit default_buffer_commit;
279 vk::Event wfi_event;
278 280
279 std::array<View, Maxwell::NumRenderTargets> color_attachments; 281 std::array<View, Maxwell::NumRenderTargets> color_attachments;
280 View zeta_attachment; 282 View zeta_attachment;
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp
index 7f5bc1404..2ce9b0626 100644
--- a/src/video_core/renderer_vulkan/wrapper.cpp
+++ b/src/video_core/renderer_vulkan/wrapper.cpp
@@ -87,6 +87,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
87 X(vkCmdSetStencilReference); 87 X(vkCmdSetStencilReference);
88 X(vkCmdSetStencilWriteMask); 88 X(vkCmdSetStencilWriteMask);
89 X(vkCmdSetViewport); 89 X(vkCmdSetViewport);
90 X(vkCmdWaitEvents);
90 X(vkCreateBuffer); 91 X(vkCreateBuffer);
91 X(vkCreateBufferView); 92 X(vkCreateBufferView);
92 X(vkCreateCommandPool); 93 X(vkCreateCommandPool);
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h
index bda16a2cb..98937a77a 100644
--- a/src/video_core/renderer_vulkan/wrapper.h
+++ b/src/video_core/renderer_vulkan/wrapper.h
@@ -205,6 +205,7 @@ struct DeviceDispatch : public InstanceDispatch {
205 PFN_vkCmdSetStencilReference vkCmdSetStencilReference; 205 PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
206 PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; 206 PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
207 PFN_vkCmdSetViewport vkCmdSetViewport; 207 PFN_vkCmdSetViewport vkCmdSetViewport;
208 PFN_vkCmdWaitEvents vkCmdWaitEvents;
208 PFN_vkCreateBuffer vkCreateBuffer; 209 PFN_vkCreateBuffer vkCreateBuffer;
209 PFN_vkCreateBufferView vkCreateBufferView; 210 PFN_vkCreateBufferView vkCreateBufferView;
210 PFN_vkCreateCommandPool vkCreateCommandPool; 211 PFN_vkCreateCommandPool vkCreateCommandPool;
@@ -958,6 +959,15 @@ public:
958 dld->vkCmdSetEvent(handle, event, stage_flags); 959 dld->vkCmdSetEvent(handle, event, stage_flags);
959 } 960 }
960 961
962 void WaitEvents(Span<VkEvent> events, VkPipelineStageFlags src_stage_mask,
963 VkPipelineStageFlags dst_stage_mask, Span<VkMemoryBarrier> memory_barriers,
964 Span<VkBufferMemoryBarrier> buffer_barriers,
965 Span<VkImageMemoryBarrier> image_barriers) const noexcept {
966 dld->vkCmdWaitEvents(handle, events.size(), events.data(), src_stage_mask, dst_stage_mask,
967 memory_barriers.size(), memory_barriers.data(), buffer_barriers.size(),
968 buffer_barriers.data(), image_barriers.size(), image_barriers.data());
969 }
970
961 void BindTransformFeedbackBuffersEXT(u32 first, u32 count, const VkBuffer* buffers, 971 void BindTransformFeedbackBuffersEXT(u32 first, u32 count, const VkBuffer* buffers,
962 const VkDeviceSize* offsets, 972 const VkDeviceSize* offsets,
963 const VkDeviceSize* sizes) const noexcept { 973 const VkDeviceSize* sizes) const noexcept {