From c1a50c9a5c033a24685d704283b4c9487b9ee15e Mon Sep 17 00:00:00 2001
From: Jens Koenen <koenen@vr.rwth-aachen.de>
Date: Fri, 19 Aug 2022 16:47:07 +0200
Subject: [PATCH] Fixed a performance issue. The geometry pf the scene was
 loaded into slower host local memory instead of fast device local memory.
 This problem was fixed by moving the texture staging buffers to host memory.

---
 liblava/resource/texture.cpp       |  2 +-
 src/scene.hpp                      |  4 ++--
 src/strategy/multi_view_stereo.cpp | 34 +++++++++++++++++++++++-------
 3 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/liblava/resource/texture.cpp b/liblava/resource/texture.cpp
index 61e347fb..6e9ad3f3 100644
--- a/liblava/resource/texture.cpp
+++ b/liblava/resource/texture.cpp
@@ -101,7 +101,7 @@ namespace lava {
     bool texture::upload(void const* data, size_t data_size) {
         upload_buffer = make_buffer();
 
-        return upload_buffer->create(img->get_device(), data, data_size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, false, VMA_MEMORY_USAGE_CPU_TO_GPU);
+        return upload_buffer->create(img->get_device(), data, data_size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, false, VMA_MEMORY_USAGE_CPU_ONLY);
     }
 
     bool texture::stage(VkCommandBuffer cmd_buf) {
diff --git a/src/scene.hpp b/src/scene.hpp
index 1f93fc5c..5f28946a 100644
--- a/src/scene.hpp
+++ b/src/scene.hpp
@@ -212,8 +212,8 @@ private:
     glm::vec3 scene_min = glm::vec3(0.0f);
     glm::vec3 scene_max = glm::vec3(0.0f);
 
-    const glm::vec3 ambient_color = glm::vec3(0.2f); //NOTE: This factor is used so that the Bistro scene looks okay.
-    float exposure = 1.0f;
+    const glm::vec3 ambient_color = glm::vec3(5.0f); //NOTE: This factor is used so that the Bistro scene looks okay.
+    float exposure = 0.1f;                           //NOTE: This factor is used so that the Bistro scene looks okay.
     bool exposure_changed = false;
 
     uint32_t light_directional_count = 0;
diff --git a/src/strategy/multi_view_stereo.cpp b/src/strategy/multi_view_stereo.cpp
index 73546895..3fe3e192 100644
--- a/src/strategy/multi_view_stereo.cpp
+++ b/src/strategy/multi_view_stereo.cpp
@@ -133,13 +133,13 @@ bool MultiViewStereo::on_render(VkCommandBuffer command_buffer, lava::index fram
     right_barrier.subresourceRange.baseArrayLayer = 0;
     right_barrier.subresourceRange.layerCount = 1;
 
-    std::array<VkImageMemoryBarrier, 2> barriers = 
+    std::array<VkImageMemoryBarrier, 2> begin_barriers = 
     {
         left_barrier,
         right_barrier
     };
 
-    vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, barriers.size(), barriers.data());
+    vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, begin_barriers.size(), begin_barriers.data());
 
     VkImageSubresourceLayers subresource;
     subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -180,13 +180,31 @@ bool MultiViewStereo::on_render(VkCommandBuffer command_buffer, lava::index fram
     vkCmdCopyImage(command_buffer, this->color_buffer->get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, this->get_headset()->get_framebuffer(EYE_LEFT)->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &left_copy);
     vkCmdCopyImage(command_buffer, this->color_buffer->get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, this->get_headset()->get_framebuffer(EYE_RIGHT)->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &right_copy);
 
-    this->get_frame_capture()->capture_image(command_buffer, this->get_headset()->get_framebuffer(EYE_LEFT), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "left_eye");
-    this->get_companion_window()->submit_image(command_buffer, EYE_LEFT, this->get_headset()->get_framebuffer(EYE_LEFT), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-    this->get_headset()->submit_frame(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, EYE_LEFT);
+    left_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+    left_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+    left_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+    left_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
 
-    this->get_frame_capture()->capture_image(command_buffer, this->get_headset()->get_framebuffer(EYE_RIGHT), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "right_eye");
-    this->get_companion_window()->submit_image(command_buffer, EYE_RIGHT, this->get_headset()->get_framebuffer(EYE_RIGHT), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-    this->get_headset()->submit_frame(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, EYE_RIGHT);
+    right_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+    right_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+    right_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+    right_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+
+     std::array<VkImageMemoryBarrier, 2> end_barriers = 
+    {
+        left_barrier,
+        right_barrier
+    };
+
+    vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, end_barriers.size(), end_barriers.data());
+
+    this->get_frame_capture()->capture_image(command_buffer, this->get_headset()->get_framebuffer(EYE_LEFT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "left_eye");
+    this->get_companion_window()->submit_image(command_buffer, EYE_LEFT, this->get_headset()->get_framebuffer(EYE_LEFT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+    this->get_headset()->submit_frame(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, EYE_LEFT);
+
+    this->get_frame_capture()->capture_image(command_buffer, this->get_headset()->get_framebuffer(EYE_RIGHT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "right_eye");
+    this->get_companion_window()->submit_image(command_buffer, EYE_RIGHT, this->get_headset()->get_framebuffer(EYE_RIGHT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+    this->get_headset()->submit_frame(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, EYE_RIGHT);
 
     return true;
 }
-- 
GitLab