Skip to content
Snippets Groups Projects
Verified Commit 579a2ce4 authored by Tobias Frisch's avatar Tobias Frisch
Browse files

[#82] Disabled swapchain recreation for too low sizes

parent a285604e
No related branches found
No related tags found
1 merge request!70Resolve "Voxel cone tracing"
Pipeline #26182 passed
...@@ -78,8 +78,6 @@ namespace vkcv ...@@ -78,8 +78,6 @@ namespace vkcv
event_handle<int,int> e_resizeHandle; event_handle<int,int> e_resizeHandle;
static std::vector<vk::ImageView> createSwapchainImageViews( Context &context, Swapchain& swapChain);
public: public:
/** /**
* Destructor of #Core destroys the Vulkan objects contained in the core's context. * Destructor of #Core destroys the Vulkan objects contained in the core's context.
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
namespace vkcv namespace vkcv
{ {
const uint32_t MIN_SWAPCHAIN_SIZE = 2;
class Swapchain final { class Swapchain final {
private: private:
friend class Core; friend class Core;
...@@ -119,4 +122,5 @@ namespace vkcv ...@@ -119,4 +122,5 @@ namespace vkcv
const vk::Extent2D& getExtent() const; const vk::Extent2D& getExtent() const;
}; };
} }
...@@ -20,6 +20,35 @@ ...@@ -20,6 +20,35 @@
namespace vkcv namespace vkcv
{ {
static std::vector<vk::ImageView> createSwapchainImageViews( Context &context, const std::vector<vk::Image>& images,
vk::Format format){
std::vector<vk::ImageView> imageViews;
imageViews.reserve( images.size() );
//here can be swizzled with vk::ComponentSwizzle if needed
vk::ComponentMapping componentMapping(
vk::ComponentSwizzle::eR,
vk::ComponentSwizzle::eG,
vk::ComponentSwizzle::eB,
vk::ComponentSwizzle::eA );
vk::ImageSubresourceRange subResourceRange( vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 );
for ( auto image : images )
{
vk::ImageViewCreateInfo imageViewCreateInfo(
vk::ImageViewCreateFlags(),
image,
vk::ImageViewType::e2D,
format,
componentMapping,
subResourceRange);
imageViews.push_back(context.getDevice().createImageView(imageViewCreateInfo));
}
return imageViews;
}
Core Core::create(Window &window, Core Core::create(Window &window,
const char *applicationName, const char *applicationName,
...@@ -36,8 +65,9 @@ namespace vkcv ...@@ -36,8 +65,9 @@ namespace vkcv
); );
Swapchain swapChain = Swapchain::create(window, context); Swapchain swapChain = Swapchain::create(window, context);
std::vector<vk::ImageView> swapchainImageViews = createSwapchainImageViews( context, swapChain); const auto swapchainImages = context.getDevice().getSwapchainImagesKHR(swapChain.getSwapchain());
const auto swapchainImageViews = createSwapchainImageViews( context, swapchainImages, swapChain.getFormat());
const auto& queueManager = context.getQueueManager(); const auto& queueManager = context.getQueueManager();
...@@ -158,8 +188,13 @@ namespace vkcv ...@@ -158,8 +188,13 @@ namespace vkcv
m_Context.getDevice().waitIdle(); m_Context.getDevice().waitIdle();
m_swapchain.updateSwapchain(m_Context, m_window); m_swapchain.updateSwapchain(m_Context, m_window);
const auto swapchainViews = createSwapchainImageViews(m_Context, m_swapchain);
if (!m_swapchain.getSwapchain()) {
return false;
}
const auto swapchainImages = m_Context.getDevice().getSwapchainImagesKHR(m_swapchain.getSwapchain()); const auto swapchainImages = m_Context.getDevice().getSwapchainImagesKHR(m_swapchain.getSwapchain());
const auto swapchainViews = createSwapchainImageViews(m_Context, swapchainImages, m_swapchain.getFormat());
const auto& extent = m_swapchain.getExtent(); const auto& extent = m_swapchain.getExtent();
...@@ -176,7 +211,7 @@ namespace vkcv ...@@ -176,7 +211,7 @@ namespace vkcv
width = extent.width; width = extent.width;
height = extent.height; height = extent.height;
if ((width < 2) || (height < 2)) { if ((width < MIN_SWAPCHAIN_SIZE) || (height < MIN_SWAPCHAIN_SIZE)) {
return false; return false;
} }
...@@ -505,34 +540,6 @@ namespace vkcv ...@@ -505,34 +540,6 @@ namespace vkcv
return m_DescriptorManager->getDescriptorSet(handle); return m_DescriptorManager->getDescriptorSet(handle);
} }
std::vector<vk::ImageView> Core::createSwapchainImageViews( Context &context, Swapchain& swapChain){
std::vector<vk::ImageView> imageViews;
std::vector<vk::Image> swapChainImages = context.getDevice().getSwapchainImagesKHR(swapChain.getSwapchain());
imageViews.reserve( swapChainImages.size() );
//here can be swizzled with vk::ComponentSwizzle if needed
vk::ComponentMapping componentMapping(
vk::ComponentSwizzle::eR,
vk::ComponentSwizzle::eG,
vk::ComponentSwizzle::eB,
vk::ComponentSwizzle::eA );
vk::ImageSubresourceRange subResourceRange( vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 );
for ( auto image : swapChainImages )
{
vk::ImageViewCreateInfo imageViewCreateInfo(
vk::ImageViewCreateFlags(),
image,
vk::ImageViewType::e2D,
swapChain.getFormat(),
componentMapping,
subResourceRange);
imageViews.push_back(context.getDevice().createImageView(imageViewCreateInfo));
}
return imageViews;
}
void Core::prepareSwapchainImageForPresent(const CommandStreamHandle cmdStream) { void Core::prepareSwapchainImageForPresent(const CommandStreamHandle cmdStream) {
auto swapchainHandle = ImageHandle::createSwapchainImageHandle(); auto swapchainHandle = ImageHandle::createSwapchainImageHandle();
recordCommandsToStream(cmdStream, [swapchainHandle, this](const vk::CommandBuffer cmdBuffer) { recordCommandsToStream(cmdStream, [swapchainHandle, this](const vk::CommandBuffer cmdBuffer) {
......
...@@ -221,27 +221,36 @@ namespace vkcv ...@@ -221,27 +221,36 @@ namespace vkcv
vk::SwapchainKHR oldSwapchain = m_Swapchain; vk::SwapchainKHR oldSwapchain = m_Swapchain;
vk::Extent2D extent2D = chooseExtent(context.getPhysicalDevice(), m_Surface.handle, window); vk::Extent2D extent2D = chooseExtent(context.getPhysicalDevice(), m_Surface.handle, window);
vk::SwapchainCreateInfoKHR swapchainCreateInfo( if ((extent2D.width >= MIN_SWAPCHAIN_SIZE) && (extent2D.height >= MIN_SWAPCHAIN_SIZE)) {
vk::SwapchainCreateFlagsKHR(), vk::SwapchainCreateInfoKHR swapchainCreateInfo(
m_Surface.handle, vk::SwapchainCreateFlagsKHR(),
m_ImageCount, m_Surface.handle,
m_Format, m_ImageCount,
m_ColorSpace, m_Format,
extent2D, m_ColorSpace,
1, extent2D,
vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eStorage, 1,
vk::SharingMode::eExclusive, vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eStorage,
0, vk::SharingMode::eExclusive,
nullptr, 0,
vk::SurfaceTransformFlagBitsKHR::eIdentity, nullptr,
vk::CompositeAlphaFlagBitsKHR::eOpaque, vk::SurfaceTransformFlagBitsKHR::eIdentity,
m_PresentMode, vk::CompositeAlphaFlagBitsKHR::eOpaque,
true, m_PresentMode,
oldSwapchain true,
); oldSwapchain
);
m_Swapchain = context.getDevice().createSwapchainKHR(swapchainCreateInfo);
context.getDevice().destroySwapchainKHR(oldSwapchain); m_Swapchain = context.getDevice().createSwapchainKHR(swapchainCreateInfo);
} else {
m_Swapchain = nullptr;
signalSwapchainRecreation();
}
if (oldSwapchain) {
context.getDevice().destroySwapchainKHR(oldSwapchain);
}
m_Extent = extent2D; m_Extent = extent2D;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment