Adding render pass to secondary command buffer 43/317643/3
authorDavid Steele <david.steele@samsung.com>
Thu, 12 Sep 2024 18:22:12 +0000 (19:22 +0100)
committerAdam Bialogonski <adam.b@samsung.com>
Fri, 13 Sep 2024 12:39:22 +0000 (13:39 +0100)
Need to retrieve the actual render pass from the current
framebuffer, so the begin info needs the render target.

Change-Id: I17c65e6b010177091fa0bc2233b0e44455df2569

dali/internal/graphics/vulkan-impl/vulkan-command-buffer.cpp
dali/internal/graphics/vulkan-impl/vulkan-pipeline-impl.cpp
dali/internal/graphics/vulkan-impl/vulkan-render-target.cpp
dali/internal/graphics/vulkan-impl/vulkan-render-target.h

index 6e8989e7d3c30505c94094a8a466351bf628100e..43a1dc4f9cd475c4cc195de011ff636915bc715c 100644 (file)
@@ -68,7 +68,16 @@ void CommandBuffer::Begin(const Graphics::CommandBufferBeginInfo& info)
 {
   if(mCommandBufferImpl)
   {
-    mCommandBufferImpl->Begin(static_cast<vk::CommandBufferUsageFlags>(info.usage), nullptr);
+    vk::CommandBufferInheritanceInfo inheritanceInfo{};
+    if(info.renderPass)
+    {
+      auto renderTarget                  = ConstGraphicsCast<Vulkan::RenderTarget, Graphics::RenderTarget>(info.renderTarget);
+      inheritanceInfo.renderPass         = renderTarget->GetRenderPass(info.renderPass)->GetVkHandle();
+      inheritanceInfo.subpass            = 0;
+      inheritanceInfo.queryFlags         = static_cast<vk::QueryControlFlags>(0);
+      inheritanceInfo.pipelineStatistics = static_cast<vk::QueryPipelineStatisticFlags>(0);
+    }
+    mCommandBufferImpl->Begin(static_cast<vk::CommandBufferUsageFlags>(info.usage), &inheritanceInfo);
   }
 }
 
index 8bb63caadd6a36d547bbf6a62ec03c193fd76385..cbc2d3706a21b7ca14854bc608f9fba31a22e7ed 100644 (file)
@@ -261,10 +261,12 @@ void PipelineImpl::InitializePipeline()
   dynInfo.setDynamicStates(mDynamicStates);
   gfxPipelineInfo.setPDynamicState(&dynInfo);
 
-  auto& allocator   = mController.GetGraphicsDevice().GetAllocator();
-  auto  rtImpl      = static_cast<Vulkan::RenderTarget*>(mCreateInfo.renderTarget);
-  auto  framebuffer = rtImpl->GetFramebuffer();
-  auto  surface     = rtImpl->GetSurface();
+  auto& allocator = mController.GetGraphicsDevice().GetAllocator();
+
+  auto rtImpl = static_cast<Vulkan::RenderTarget*>(mCreateInfo.renderTarget);
+
+  auto framebuffer = rtImpl->GetFramebuffer();
+  auto surface     = rtImpl->GetSurface();
 
   FramebufferImpl* fbImpl = nullptr;
   if(surface)
index 822c44dbf9787d64e48fb29ea67728e196c7cf1a..0ea7a733ef8303c62e3c279f65839aae09730c5c 100644 (file)
  */
 
 // CLASS HEADER
-#include "vulkan-render-target.h"
+#include <dali/internal/graphics/vulkan-impl/vulkan-render-target.h>
 
 // INTERNAL INCLUDES
 #include <dali/integration-api/adaptor-framework/render-surface-interface.h>
-#include "vulkan-framebuffer.h"
-#include "vulkan-graphics-controller.h"
+#include <dali/internal/graphics/vulkan-impl/vulkan-framebuffer-impl.h>
+#include <dali/internal/graphics/vulkan-impl/vulkan-framebuffer.h>
+#include <dali/internal/graphics/vulkan-impl/vulkan-graphics-controller.h>
+#include <dali/internal/graphics/vulkan-impl/vulkan-render-pass.h>
+#include <dali/internal/graphics/vulkan/vulkan-device.h>
+#include <dali/internal/window-system/common/window-render-surface.h>
 
 namespace Dali::Graphics::Vulkan
 {
@@ -63,4 +67,27 @@ Integration::RenderSurfaceInterface* RenderTarget::GetSurface() const
   return mCreateInfo.surface;
 }
 
+Vulkan::RenderPassImpl* RenderTarget::GetRenderPass(const Graphics::RenderPass* gfxRenderPass) const
+{
+  auto renderPass = const_cast<Vulkan::RenderPass*>(static_cast<const Vulkan::RenderPass*>(gfxRenderPass));
+
+  auto framebuffer = GetFramebuffer();
+  auto surface     = GetSurface();
+
+  FramebufferImpl* fbImpl = nullptr;
+  if(surface)
+  {
+    auto& gfxDevice = mController.GetGraphicsDevice();
+    auto  surfaceId = static_cast<Internal::Adaptor::WindowRenderSurface*>(surface)->GetSurfaceId();
+    auto  swapchain = gfxDevice.GetSwapchainForSurfaceId(surfaceId);
+    fbImpl          = swapchain->GetCurrentFramebuffer();
+  }
+  else if(framebuffer)
+  {
+    fbImpl = framebuffer->GetImpl();
+  }
+
+  return fbImpl->GetRenderPass(renderPass);
+}
+
 } // namespace Dali::Graphics::Vulkan
index 72392b7d8ce0f5a5895c13607687f72c928235a9..3002a3abf14d71c385b0c969493e9552f9b2ab4e 100644 (file)
@@ -28,6 +28,7 @@ namespace Dali::Graphics::Vulkan
 {
 class Framebuffer;
 class Surface;
+class RenderPassImpl;
 
 using RenderTargetResource = Resource<Graphics::RenderTarget, Graphics::RenderTargetCreateInfo>;
 
@@ -69,6 +70,12 @@ public:
    */
   [[nodiscard]] Integration::RenderSurfaceInterface* GetSurface() const;
 
+  /**
+   * Find a matching render pass for this render target
+   * @param[in] renderPass A render pass to search for
+   * @return a matching render pass implementation from the current framebuffer
+   */
+  [[nodiscard]] Vulkan::RenderPassImpl* GetRenderPass(const Graphics::RenderPass* renderPass) const;
   // Get Swapchain?
 
 private: