diff options
| author | 2020-05-03 02:43:18 -0400 | |
|---|---|---|
| committer | 2020-05-03 02:43:18 -0400 | |
| commit | 2aff0b473338655fba08f83c6a4c0af808b6d4a9 (patch) | |
| tree | aae207eac2560d76f835a0eba3511b36fcf4a571 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #3861 from lat9nq/ci-enable-vulkan (diff) | |
| parent | {maxwell_3d,buffer_cache}: Implement memory barriers using 3D registers (diff) | |
| download | yuzu-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.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 10 |
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: | |||
| 52 | protected: | 52 | protected: |
| 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 | ||
| 576 | void 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 | |||
| 576 | void RasterizerVulkan::FlushCommands() { | 596 | void 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 { |