summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar bunnei2020-02-24 10:14:50 -0500
committerGravatar GitHub2020-02-24 10:14:50 -0500
commite22ad52cdb18842a12037e8b85d7be854b95206c (patch)
treef60ec07ce5a4e6f56a1c9c5e18884de52de81334 /src/video_core/renderer_vulkan
parentMerge pull request #3424 from ReinUsesLisp/spirv-layer (diff)
parenttexture_cache: Implement layered framebuffer attachments (diff)
downloadyuzu-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.cpp17
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h10
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h4
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
611std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( 611std::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 }