diff options
| author | 2020-02-24 10:14:50 -0500 | |
|---|---|---|
| committer | 2020-02-24 10:14:50 -0500 | |
| commit | e22ad52cdb18842a12037e8b85d7be854b95206c (patch) | |
| tree | f60ec07ce5a4e6f56a1c9c5e18884de52de81334 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #3424 from ReinUsesLisp/spirv-layer (diff) | |
| parent | texture_cache: Implement layered framebuffer attachments (diff) | |
| download | yuzu-e22ad52cdb18842a12037e8b85d7be854b95206c.tar.gz yuzu-e22ad52cdb18842a12037e8b85d7be854b95206c.tar.xz yuzu-e22ad52cdb18842a12037e8b85d7be854b95206c.zip | |
Merge pull request #3425 from ReinUsesLisp/layered-framebuffer
texture_cache: Implement layered framebuffer attachments
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 31c078f6a..3bf86da87 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -611,33 +611,34 @@ bool RasterizerVulkan::WalkAttachmentOverlaps(const CachedSurfaceView& attachmen | |||
| 611 | std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( | 611 | std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( |
| 612 | vk::RenderPass renderpass) { | 612 | vk::RenderPass renderpass) { |
| 613 | FramebufferCacheKey key{renderpass, std::numeric_limits<u32>::max(), | 613 | FramebufferCacheKey key{renderpass, std::numeric_limits<u32>::max(), |
| 614 | std::numeric_limits<u32>::max()}; | 614 | std::numeric_limits<u32>::max(), std::numeric_limits<u32>::max()}; |
| 615 | 615 | ||
| 616 | const auto MarkAsModifiedAndPush = [&](const View& view) { | 616 | const auto try_push = [&](const View& view) { |
| 617 | if (view == nullptr) { | 617 | if (!view) { |
| 618 | return false; | 618 | return false; |
| 619 | } | 619 | } |
| 620 | key.views.push_back(view->GetHandle()); | 620 | key.views.push_back(view->GetHandle()); |
| 621 | key.width = std::min(key.width, view->GetWidth()); | 621 | key.width = std::min(key.width, view->GetWidth()); |
| 622 | key.height = std::min(key.height, view->GetHeight()); | 622 | key.height = std::min(key.height, view->GetHeight()); |
| 623 | key.layers = std::min(key.layers, view->GetNumLayers()); | ||
| 623 | return true; | 624 | return true; |
| 624 | }; | 625 | }; |
| 625 | 626 | ||
| 626 | for (std::size_t index = 0; index < std::size(color_attachments); ++index) { | 627 | for (std::size_t index = 0; index < std::size(color_attachments); ++index) { |
| 627 | if (MarkAsModifiedAndPush(color_attachments[index])) { | 628 | if (try_push(color_attachments[index])) { |
| 628 | texture_cache.MarkColorBufferInUse(index); | 629 | texture_cache.MarkColorBufferInUse(index); |
| 629 | } | 630 | } |
| 630 | } | 631 | } |
| 631 | if (MarkAsModifiedAndPush(zeta_attachment)) { | 632 | if (try_push(zeta_attachment)) { |
| 632 | texture_cache.MarkDepthBufferInUse(); | 633 | texture_cache.MarkDepthBufferInUse(); |
| 633 | } | 634 | } |
| 634 | 635 | ||
| 635 | const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(key); | 636 | const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(key); |
| 636 | auto& framebuffer = fbentry->second; | 637 | auto& framebuffer = fbentry->second; |
| 637 | if (is_cache_miss) { | 638 | if (is_cache_miss) { |
| 638 | const vk::FramebufferCreateInfo framebuffer_ci({}, key.renderpass, | 639 | const vk::FramebufferCreateInfo framebuffer_ci( |
| 639 | static_cast<u32>(key.views.size()), | 640 | {}, key.renderpass, static_cast<u32>(key.views.size()), key.views.data(), key.width, |
| 640 | key.views.data(), key.width, key.height, 1); | 641 | key.height, key.layers); |
| 641 | const auto dev = device.GetLogical(); | 642 | const auto dev = device.GetLogical(); |
| 642 | const auto& dld = device.GetDispatchLoader(); | 643 | const auto& dld = device.GetDispatchLoader(); |
| 643 | framebuffer = dev.createFramebufferUnique(framebuffer_ci, nullptr, dld); | 644 | 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 138903d60..4dc8af6e8 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -56,6 +56,7 @@ struct FramebufferCacheKey { | |||
| 56 | vk::RenderPass renderpass{}; | 56 | vk::RenderPass renderpass{}; |
| 57 | u32 width = 0; | 57 | u32 width = 0; |
| 58 | u32 height = 0; | 58 | u32 height = 0; |
| 59 | u32 layers = 0; | ||
| 59 | ImageViewsPack views; | 60 | ImageViewsPack views; |
| 60 | 61 | ||
| 61 | std::size_t Hash() const noexcept { | 62 | std::size_t Hash() const noexcept { |
| @@ -66,12 +67,17 @@ struct FramebufferCacheKey { | |||
| 66 | } | 67 | } |
| 67 | boost::hash_combine(hash, width); | 68 | boost::hash_combine(hash, width); |
| 68 | boost::hash_combine(hash, height); | 69 | boost::hash_combine(hash, height); |
| 70 | boost::hash_combine(hash, layers); | ||
| 69 | return hash; | 71 | return hash; |
| 70 | } | 72 | } |
| 71 | 73 | ||
| 72 | bool operator==(const FramebufferCacheKey& rhs) const noexcept { | 74 | bool operator==(const FramebufferCacheKey& rhs) const noexcept { |
| 73 | return std::tie(renderpass, views, width, height) == | 75 | return std::tie(renderpass, views, width, height, layers) == |
| 74 | std::tie(rhs.renderpass, rhs.views, rhs.width, rhs.height); | 76 | std::tie(rhs.renderpass, rhs.views, rhs.width, rhs.height, rhs.layers); |
| 77 | } | ||
| 78 | |||
| 79 | bool operator!=(const FramebufferCacheKey& rhs) const noexcept { | ||
| 80 | return !operator==(rhs); | ||
| 75 | } | 81 | } |
| 76 | }; | 82 | }; |
| 77 | 83 | ||
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 | } |