summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-02-16 04:12:38 -0300
committerGravatar ReinUsesLisp2020-02-16 04:19:32 -0300
commit6a0220b2e1a0d7692b8f32f66ae7bc86cb63fab7 (patch)
tree06b9087f7921595d336b98503c0e9fcf25694775 /src/video_core/renderer_vulkan
parentMerge pull request #3401 from FernandoS27/synchronization (diff)
downloadyuzu-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.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 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
602std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( 602std::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 }