Skip to content

Commit 7ec6846

Browse files
author
devsh
committed
make CSwapchainFramebuffersAndDepth support runtime depth buffer resignation
1 parent 1b3c19c commit 7ec6846

File tree

1 file changed

+32
-25
lines changed

1 file changed

+32
-25
lines changed

common/include/nbl/examples/common/CSwapchainFramebuffersAndDepth.hpp

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)