@@ -18,6 +18,10 @@ class CSwapchainFramebuffersAndDepth final : public video::CDefaultSwapchainFram
1818 template <typename ... Args>
1919 inline CSwapchainFramebuffersAndDepth (video::ILogicalDevice* device, const asset::E_FORMAT _desiredDepthFormat, Args&&... args) : base_t(device,std::forward<Args>(args)...)
2020 {
21+ // user didn't want any depth
22+ if (_desiredDepthFormat==asset::EF_UNKNOWN)
23+ return ;
24+
2125 using namespace nbl ::asset;
2226 using namespace nbl ::video;
2327 const IPhysicalDevice::SImageFormatPromotionRequest req = {
@@ -55,44 +59,47 @@ class CSwapchainFramebuffersAndDepth final : public video::CDefaultSwapchainFram
5559 {
5660 using namespace nbl ::asset;
5761 using namespace nbl ::video;
58- // DOCS: why are we not using `m_device` here? any particular reason?
59- auto device = const_cast <ILogicalDevice*>(m_renderpass->getOriginDevice ());
60-
61- const auto depthFormat = m_renderpass->getCreationParameters ().depthStencilAttachments [0 ].format ;
62- const auto & sharedParams = getSwapchain ()->getCreationParameters ().sharedParams ;
63- auto image = device->createImage ({ IImage::SCreationParams{
64- .type = IGPUImage::ET_2D,
65- .samples = IGPUImage::ESCF_1_BIT,
66- .format = depthFormat,
67- .extent = {sharedParams.width ,sharedParams.height ,1 },
68- .mipLevels = 1 ,
69- .arrayLayers = 1 ,
70- .depthUsage = IGPUImage::EUF_RENDER_ATTACHMENT_BIT
71- } });
62+ if (m_depthFormat!=asset::EF_UNKNOWN)
63+ {
64+ // DOCS: why are we not using `m_device` here? any particular reason?
65+ auto device = const_cast <ILogicalDevice*>(m_renderpass->getOriginDevice ());
7266
73- device->allocate (image->getMemoryReqs (), image.get ());
67+ const auto depthFormat = m_renderpass->getCreationParameters ().depthStencilAttachments [0 ].format ;
68+ const auto & sharedParams = getSwapchain ()->getCreationParameters ().sharedParams ;
69+ auto image = device->createImage ({ IImage::SCreationParams{
70+ .type = IGPUImage::ET_2D,
71+ .samples = IGPUImage::ESCF_1_BIT,
72+ .format = depthFormat,
73+ .extent = {sharedParams.width ,sharedParams.height ,1 },
74+ .mipLevels = 1 ,
75+ .arrayLayers = 1 ,
76+ .depthUsage = IGPUImage::EUF_RENDER_ATTACHMENT_BIT
77+ } });
7478
75- m_depthBuffer = device->createImageView ({
76- .flags = IGPUImageView::ECF_NONE,
77- .subUsages = IGPUImage::EUF_RENDER_ATTACHMENT_BIT,
78- .image = std::move (image),
79- .viewType = IGPUImageView::ET_2D,
80- .format = depthFormat,
81- .subresourceRange = {IGPUImage::EAF_DEPTH_BIT,0 ,1 ,0 ,1 }
82- });
79+ device->allocate (image->getMemoryReqs (), image.get ());
8380
81+ m_depthBuffer = device->createImageView ({
82+ .flags = IGPUImageView::ECF_NONE,
83+ .subUsages = IGPUImage::EUF_RENDER_ATTACHMENT_BIT,
84+ .image = std::move (image),
85+ .viewType = IGPUImageView::ET_2D,
86+ .format = depthFormat,
87+ .subresourceRange = {IGPUImage::EAF_DEPTH_BIT,0 ,1 ,0 ,1 }
88+ });
89+ }
8490 const auto retval = base_t::onCreateSwapchain_impl (qFam);
8591 m_depthBuffer = nullptr ;
8692 return retval;
8793 }
8894
8995 inline core::smart_refctd_ptr<video::IGPUFramebuffer> createFramebuffer (video::IGPUFramebuffer::SCreationParams&& params) override
9096 {
91- params.depthStencilAttachments = &m_depthBuffer.get ();
97+ if (m_depthBuffer)
98+ params.depthStencilAttachments = &m_depthBuffer.get ();
9299 return m_device->createFramebuffer (std::move (params));
93100 }
94101
95- asset::E_FORMAT m_depthFormat;
102+ asset::E_FORMAT m_depthFormat = asset::EF_UNKNOWN ;
96103 // only used to pass a parameter from `onCreateSwapchain_impl` to `createFramebuffer`
97104 core::smart_refctd_ptr<video::IGPUImageView> m_depthBuffer;
98105};
0 commit comments