diff options
| author | 2020-02-16 04:12:38 -0300 | |
|---|---|---|
| committer | 2020-02-16 04:19:32 -0300 | |
| commit | 6a0220b2e1a0d7692b8f32f66ae7bc86cb63fab7 (patch) | |
| tree | 06b9087f7921595d336b98503c0e9fcf25694775 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #3401 from FernandoS27/synchronization (diff) | |
| download | yuzu-6a0220b2e1a0d7692b8f32f66ae7bc86cb63fab7.tar.gz yuzu-6a0220b2e1a0d7692b8f32f66ae7bc86cb63fab7.tar.xz yuzu-6a0220b2e1a0d7692b8f32f66ae7bc86cb63fab7.zip | |
texture_cache: Implement layered framebuffer attachments
Layered framebuffer attachments is a feature that allows applications to
write attach layered textures to a single attachment. What layer the
fragments are written to is decided from the shader using gl_Layer.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.h | 4 |
3 files changed, 21 insertions, 10 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index aada38702..34044500d 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -602,33 +602,34 @@ bool RasterizerVulkan::WalkAttachmentOverlaps(const CachedSurfaceView& attachmen | |||
| 602 | std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( | 602 | std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( |
| 603 | vk::RenderPass renderpass) { | 603 | vk::RenderPass renderpass) { |
| 604 | FramebufferCacheKey key{renderpass, std::numeric_limits<u32>::max(), | 604 | FramebufferCacheKey key{renderpass, std::numeric_limits<u32>::max(), |
| 605 | std::numeric_limits<u32>::max()}; | 605 | std::numeric_limits<u32>::max(), std::numeric_limits<u32>::max()}; |
| 606 | 606 | ||
| 607 | const auto MarkAsModifiedAndPush = [&](const View& view) { | 607 | const auto try_push = [&](const View& view) { |
| 608 | if (view == nullptr) { | 608 | if (!view) { |
| 609 | return false; | 609 | return false; |
| 610 | } | 610 | } |
| 611 | key.views.push_back(view->GetHandle()); | 611 | key.views.push_back(view->GetHandle()); |
| 612 | key.width = std::min(key.width, view->GetWidth()); | 612 | key.width = std::min(key.width, view->GetWidth()); |
| 613 | key.height = std::min(key.height, view->GetHeight()); | 613 | key.height = std::min(key.height, view->GetHeight()); |
| 614 | key.layers = std::min(key.layers, view->GetNumLayers()); | ||
| 614 | return true; | 615 | return true; |
| 615 | }; | 616 | }; |
| 616 | 617 | ||
| 617 | for (std::size_t index = 0; index < std::size(color_attachments); ++index) { | 618 | for (std::size_t index = 0; index < std::size(color_attachments); ++index) { |
| 618 | if (MarkAsModifiedAndPush(color_attachments[index])) { | 619 | if (try_push(color_attachments[index])) { |
| 619 | texture_cache.MarkColorBufferInUse(index); | 620 | texture_cache.MarkColorBufferInUse(index); |
| 620 | } | 621 | } |
| 621 | } | 622 | } |
| 622 | if (MarkAsModifiedAndPush(zeta_attachment)) { | 623 | if (try_push(zeta_attachment)) { |
| 623 | texture_cache.MarkDepthBufferInUse(); | 624 | texture_cache.MarkDepthBufferInUse(); |
| 624 | } | 625 | } |
| 625 | 626 | ||
| 626 | const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(key); | 627 | const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(key); |
| 627 | auto& framebuffer = fbentry->second; | 628 | auto& framebuffer = fbentry->second; |
| 628 | if (is_cache_miss) { | 629 | if (is_cache_miss) { |
| 629 | const vk::FramebufferCreateInfo framebuffer_ci({}, key.renderpass, | 630 | const vk::FramebufferCreateInfo framebuffer_ci( |
| 630 | static_cast<u32>(key.views.size()), | 631 | {}, key.renderpass, static_cast<u32>(key.views.size()), key.views.data(), key.width, |
| 631 | key.views.data(), key.width, key.height, 1); | 632 | key.height, key.layers); |
| 632 | const auto dev = device.GetLogical(); | 633 | const auto dev = device.GetLogical(); |
| 633 | const auto& dld = device.GetDispatchLoader(); | 634 | const auto& dld = device.GetDispatchLoader(); |
| 634 | framebuffer = dev.createFramebufferUnique(framebuffer_ci, nullptr, dld); | 635 | framebuffer = dev.createFramebufferUnique(framebuffer_ci, nullptr, dld); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 7be71e734..209927803 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -55,6 +55,7 @@ struct FramebufferCacheKey { | |||
| 55 | vk::RenderPass renderpass{}; | 55 | vk::RenderPass renderpass{}; |
| 56 | u32 width = 0; | 56 | u32 width = 0; |
| 57 | u32 height = 0; | 57 | u32 height = 0; |
| 58 | u32 layers = 0; | ||
| 58 | ImageViewsPack views; | 59 | ImageViewsPack views; |
| 59 | 60 | ||
| 60 | std::size_t Hash() const noexcept { | 61 | std::size_t Hash() const noexcept { |
| @@ -65,12 +66,17 @@ struct FramebufferCacheKey { | |||
| 65 | } | 66 | } |
| 66 | boost::hash_combine(hash, width); | 67 | boost::hash_combine(hash, width); |
| 67 | boost::hash_combine(hash, height); | 68 | boost::hash_combine(hash, height); |
| 69 | boost::hash_combine(hash, layers); | ||
| 68 | return hash; | 70 | return hash; |
| 69 | } | 71 | } |
| 70 | 72 | ||
| 71 | bool operator==(const FramebufferCacheKey& rhs) const noexcept { | 73 | bool operator==(const FramebufferCacheKey& rhs) const noexcept { |
| 72 | return std::tie(renderpass, views, width, height) == | 74 | return std::tie(renderpass, views, width, height, layers) == |
| 73 | std::tie(rhs.renderpass, rhs.views, rhs.width, rhs.height); | 75 | std::tie(rhs.renderpass, rhs.views, rhs.width, rhs.height, rhs.layers); |
| 76 | } | ||
| 77 | |||
| 78 | bool operator!=(const FramebufferCacheKey& rhs) const noexcept { | ||
| 79 | return !operator==(rhs); | ||
| 74 | } | 80 | } |
| 75 | }; | 81 | }; |
| 76 | 82 | ||
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index d3edbe80c..22e3d34de 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h | |||
| @@ -151,6 +151,10 @@ public: | |||
| 151 | return params.GetMipHeight(base_level); | 151 | return params.GetMipHeight(base_level); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | u32 GetNumLayers() const { | ||
| 155 | return num_layers; | ||
| 156 | } | ||
| 157 | |||
| 154 | bool IsBufferView() const { | 158 | bool IsBufferView() const { |
| 155 | return buffer_view; | 159 | return buffer_view; |
| 156 | } | 160 | } |