Remove swapchain renderpass duping 20/317220/5
authorDavid Steele <david.steele@samsung.com>
Thu, 5 Sep 2024 17:37:15 +0000 (18:37 +0100)
committerDavid Steele <david.steele@samsung.com>
Wed, 25 Sep 2024 17:27:53 +0000 (18:27 +0100)
Change the swapchain framebuffer creation to utilize only
1 render pass.

Change-Id: Ia7f4771ee420997b7bc070e6b7685084ecd38acd

build/tizen/deps-check.cmake
dali/internal/graphics/vulkan-impl/vulkan-command-buffer.cpp
dali/internal/graphics/vulkan-impl/vulkan-framebuffer-impl.cpp
dali/internal/graphics/vulkan-impl/vulkan-framebuffer-impl.h
dali/internal/graphics/vulkan-impl/vulkan-render-target.cpp
dali/internal/graphics/vulkan-impl/vulkan-swapchain-impl.cpp
dali/internal/graphics/vulkan/vulkan-device.cpp

index 3de7eba8312bcbd02d4c8502dbfced09b2d8dfc0..0f6adcb69002633623f2bab56c9608afcc509abc 100644 (file)
@@ -541,7 +541,8 @@ IF(enable_glslang)
     # all needed deps and SPIRV-Tools package is needed
     SET(DALI_LDFLAGS ${DALI_LDFLAGS} ${GLSLANG_LDFLAGS} -lSPIRV ${SPIRVTOOLS_LDFLAGS} -lglslang-default-resource-limits)
   ENDIF()
-  LIST(APPEND DALI_CFLAGS ${GLSLANG_CFLAGS})
+
+  SET(DALI_CFLAGS ${DALI_CFLAGS} ${GLSLANG_CFLAGS} )
 ENDIF()
 
 IF(LIBUV_X11_PROFILE)
@@ -645,3 +646,6 @@ ADD_DEFINITIONS(  -DDALI_DATA_RW_DIR="${daliReadWriteDir}"
                   -DFONT_CONFIGURATION_FILE="${fontConfigurationFile}"
                   -DTIZEN_PLATFORM_CONFIG_SUPPORTED=${tizenPlatformConfigSupported}
 )
+
+
+MESSAGE(STATUS "DALI_CFLAGS: ${DALI_CFLAGS}")
index 7a80c575a50d8e170547eb2692f32991dce5d5fe..463d4b9434b985e38aa1eb78269c42c436404b25 100644 (file)
@@ -189,13 +189,13 @@ void CommandBuffer::BeginRenderPass(Graphics::RenderPass*          gfxRenderPass
     auto swapchain = device.GetSwapchainForSurfaceId(surfaceId);
     mLastSwapchain = swapchain;
     framebuffer    = swapchain->GetCurrentFramebuffer();
-    renderPassImpl = framebuffer->GetRenderPass(renderPass);
+    renderPassImpl = framebuffer->GetImplFromRenderPass(renderPass);
   }
   else
   {
     auto coreFramebuffer = renderTarget->GetFramebuffer();
     framebuffer          = coreFramebuffer->GetImpl();
-    renderPassImpl       = framebuffer->GetRenderPass(renderPass);
+    renderPassImpl       = framebuffer->GetImplFromRenderPass(renderPass);
   }
 
   std::vector<vk::ClearValue> vkClearValues;
index 92f6c845ddc03947c472a97fdd40f0e3aeec6e57..933cbf51bd2ef8880c991da3b817c2cff90e4f5e 100644 (file)
@@ -185,7 +185,7 @@ FramebufferImpl* FramebufferImpl::New(
   // Flag that indicates if the render pass is externally provided
   if(renderPass == nullptr)
   {
-    // Create compatible render pass
+    // Create compatible vulkan render pass
     renderPass = RenderPassImpl::New(device, colorAttachments, depthAttachment);
   }
   attachments.reserve(colorAttachments.size());
@@ -314,7 +314,7 @@ RenderPassImpl* FramebufferImpl::GetRenderPass(uint32_t index) const
   return nullptr;
 }
 
-RenderPassImpl* FramebufferImpl::GetRenderPass(RenderPass* renderPass)
+RenderPassImpl* FramebufferImpl::GetImplFromRenderPass(RenderPass* renderPass)
 {
   auto attachments  = renderPass->GetCreateInfo().attachments;
   auto matchLoadOp  = attachments->front().loadOp;
@@ -348,7 +348,15 @@ RenderPassImpl* FramebufferImpl::GetRenderPass(RenderPass* renderPass)
   }
 
   // @todo create new render pass from existing + load/store op, add it to mRenderPasses, and return it.
-
+  // @todo Need to reconsider swapchain/fbo/renderpass creation model.
+  // This framebuffer may belong to a swapchain, in which case, there are multiple framebuffers
+  // that could share render passes.
+  // A) Need to detect this situation - keep owner info?
+  // B) Sharing render passes means we
+  //    1) need to ref-count to ensure safe ownership, or
+  //    2) move ownership of renderpass to swapchain.
+  //       Onus is on client to determine which interface to use, if it's a surface, use swapchain;
+  //       if it's an offscreen, use framebuffer. (Kinda need a core interface to wrap surface/offscreen)
   return mRenderPasses[0].renderPassImpl;
 }
 
index defb3f4618049e2032d445b723271bd26aa832ca..63782b22efc2826040c5ec74966d269092216124 100644 (file)
@@ -114,7 +114,7 @@ public:
 
   [[nodiscard]] uint32_t GetAttachmentCount(AttachmentType type) const;
 
-  [[nodiscard]] RenderPassImpl* GetRenderPass(RenderPass* renderPass); // May mutate mRenderPasses
+  [[nodiscard]] RenderPassImpl* GetImplFromRenderPass(RenderPass* renderPass); // May mutate mRenderPasses
 
   [[nodiscard]] RenderPassImpl* GetRenderPass(uint32_t index) const;
 
index 0ea7a733ef8303c62e3c279f65839aae09730c5c..10df9e06102472bc3e9b770a5d054849bb5de31e 100644 (file)
@@ -87,7 +87,7 @@ Vulkan::RenderPassImpl* RenderTarget::GetRenderPass(const Graphics::RenderPass*
     fbImpl = framebuffer->GetImpl();
   }
 
-  return fbImpl->GetRenderPass(renderPass);
+  return fbImpl->GetImplFromRenderPass(renderPass);
 }
 
 } // namespace Dali::Graphics::Vulkan
index b4511f293b816c55b27aa5a479125ce70baf8fd8..1f4f0ae980e633df3bf8dc195ca71a6300ac2e2e 100644 (file)
@@ -161,8 +161,7 @@ void Swapchain::CreateVkSwapchain(
   auto presentModes = surface->GetSurfacePresentModes();
   auto found        = std::find_if(presentModes.begin(),
                             presentModes.end(),
-                            [&](vk::PresentModeKHR mode)
-                            {
+                            [&](vk::PresentModeKHR mode) {
                               return presentMode == mode;
                             });
 
@@ -221,6 +220,7 @@ void Swapchain::CreateFramebuffers()
   //
   // CREATE FRAMEBUFFERS
   //
+  RenderPassImpl* compatibleRenderPass = nullptr;
   for(auto&& image : images)
   {
     auto colorImage = mGraphicsDevice.CreateImageFromExternal(image,
@@ -235,11 +235,19 @@ void Swapchain::CreateFramebuffers()
                                                                      true); // presentable
 
     mFramebuffers.push_back(FramebufferImpl::New(mGraphicsDevice,
-                                                 nullptr,
+                                                 compatibleRenderPass,
                                                  {colorAttachment},
                                                  nullptr,
                                                  mSwapchainCreateInfoKHR.imageExtent.width,
                                                  mSwapchainCreateInfoKHR.imageExtent.height));
+
+    if(compatibleRenderPass == nullptr)
+    {
+      // use common renderpass for all framebuffers.
+      // @todo Swapchain should own _these_ renderpasses, not framebuffer.
+      // @todo fix renderpass ownership model
+      compatibleRenderPass = mFramebuffers.back()->GetRenderPass(0);
+    }
   }
   mIsValid = true;
 }
@@ -391,8 +399,7 @@ bool Swapchain::OnDestroy()
     auto swapchain = mSwapchainKHR;
     auto allocator = &mGraphicsDevice.GetAllocator();
 
-    mGraphicsDevice.DiscardResource([device, swapchain, allocator]()
-                                    {
+    mGraphicsDevice.DiscardResource([device, swapchain, allocator]() {
       DALI_LOG_INFO(gVulkanFilter, Debug::General, "Invoking deleter function: swap chain->%p\n", static_cast<VkSwapchainKHR>(swapchain))
       device.destroySwapchainKHR(swapchain, allocator); });
 
index 24f12e22bbb8fb0c0150e2bb80ead38915cbe0de..2796b7fbf799cbdca2630a0c13f291cd1cf9ba3d 100644 (file)
@@ -107,18 +107,21 @@ Device::~Device()
 // Create methods -----------------------------------------------------------------------------------------------
 void Device::Create()
 {
-  auto extensions = PrepareDefaultInstanceExtensions();
-  auto layers     = vk::enumerateInstanceLayerProperties();
+  auto extensions     = PrepareDefaultInstanceExtensions();
+  auto instanceLayers = vk::enumerateInstanceLayerProperties();
 
   std::vector<const char*> validationLayers;
-  for(auto&& reqLayer : reqLayers)
+  if(!instanceLayers.value.empty())
   {
-    for(auto&& prop : layers.value)
+    for(auto&& prop : instanceLayers.value)
     {
       DALI_LOG_STREAM(gVulkanFilter, Debug::General, prop.layerName);
-      if(std::string(prop.layerName) == reqLayer)
+      for(auto&& reqLayer : reqLayers)
       {
-        validationLayers.push_back(reqLayer);
+        if(std::string(prop.layerName) == reqLayer)
+        {
+          validationLayers.push_back(reqLayer);
+        }
       }
     }
   }