Fixes in examples: support swapchain image count change on resize, fix multiple validation layer errors on resize and quit, multiview now supports resize/fullscreen, computecloth deltaT now based on frame time, multisampling recreates attachments on resize, P key now pauses computeparticles, descriptorsets, and pushdescriptors
This commit is contained in:
parent
cb343c329a
commit
121612857c
10 changed files with 148 additions and 65 deletions
|
|
@ -98,6 +98,7 @@ public:
|
|||
vkDestroySampler(device, multiviewPass.sampler, nullptr);
|
||||
vkDestroyFramebuffer(device, multiviewPass.frameBuffer, nullptr);
|
||||
|
||||
vkFreeCommandBuffers(device, cmdPool, static_cast<uint32_t>(multiviewPass.commandBuffers.size()), multiviewPass.commandBuffers.data());
|
||||
vkDestroySemaphore(device, multiviewPass.semaphore, nullptr);
|
||||
for (auto& fence : multiviewPass.waitFences) {
|
||||
vkDestroyFence(device, fence, nullptr);
|
||||
|
|
@ -337,6 +338,9 @@ public:
|
|||
|
||||
void buildCommandBuffers()
|
||||
{
|
||||
if (resized)
|
||||
return;
|
||||
|
||||
/*
|
||||
View display
|
||||
*/
|
||||
|
|
@ -392,11 +396,6 @@ public:
|
|||
Multiview layered attachment scene rendering
|
||||
*/
|
||||
|
||||
multiviewPass.commandBuffers.resize(drawCmdBuffers.size());
|
||||
|
||||
VkCommandBufferAllocateInfo cmdBufAllocateInfo = vks::initializers::commandBufferAllocateInfo(cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, static_cast<uint32_t>(drawCmdBuffers.size()));
|
||||
VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, multiviewPass.commandBuffers.data()));
|
||||
|
||||
{
|
||||
VkCommandBufferBeginInfo cmdBufInfo = vks::initializers::commandBufferBeginInfo();
|
||||
|
||||
|
|
@ -467,13 +466,18 @@ public:
|
|||
*/
|
||||
VkDescriptorSetAllocateInfo allocateInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayout, 1);
|
||||
VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocateInfo, &descriptorSet));
|
||||
updateDescriptors();
|
||||
}
|
||||
|
||||
void updateDescriptors()
|
||||
{
|
||||
std::vector<VkWriteDescriptorSet> writeDescriptorSets = {
|
||||
vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor),
|
||||
vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &multiviewPass.descriptor),
|
||||
};
|
||||
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||
}
|
||||
|
||||
|
||||
void preparePipelines()
|
||||
{
|
||||
|
||||
|
|
@ -669,6 +673,11 @@ public:
|
|||
prepareUniformBuffers();
|
||||
prepareDescriptors();
|
||||
preparePipelines();
|
||||
|
||||
VkCommandBufferAllocateInfo cmdBufAllocateInfo = vks::initializers::commandBufferAllocateInfo(cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, static_cast<uint32_t>(drawCmdBuffers.size()));
|
||||
multiviewPass.commandBuffers.resize(drawCmdBuffers.size());
|
||||
VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, multiviewPass.commandBuffers.data()));
|
||||
|
||||
buildCommandBuffers();
|
||||
|
||||
VkFenceCreateInfo fenceCreateInfo = vks::initializers::fenceCreateInfo(VK_FENCE_CREATE_SIGNALED_BIT);
|
||||
|
|
@ -680,6 +689,45 @@ public:
|
|||
prepared = true;
|
||||
}
|
||||
|
||||
// SRS - Recreate and update Multiview resources when window size has changed
|
||||
virtual void windowResized()
|
||||
{
|
||||
vkDestroyImageView(device, multiviewPass.color.view, nullptr);
|
||||
vkDestroyImage(device, multiviewPass.color.image, nullptr);
|
||||
vkFreeMemory(device, multiviewPass.color.memory, nullptr);
|
||||
vkDestroyImageView(device, multiviewPass.depth.view, nullptr);
|
||||
vkDestroyImage(device, multiviewPass.depth.image, nullptr);
|
||||
vkFreeMemory(device, multiviewPass.depth.memory, nullptr);
|
||||
|
||||
vkDestroyRenderPass(device, multiviewPass.renderPass, nullptr);
|
||||
vkDestroySampler(device, multiviewPass.sampler, nullptr);
|
||||
vkDestroyFramebuffer(device, multiviewPass.frameBuffer, nullptr);
|
||||
|
||||
prepareMultiview();
|
||||
updateDescriptors();
|
||||
|
||||
// SRS - Recreate Multiview command buffers in case number of swapchain images has changed on resize
|
||||
vkFreeCommandBuffers(device, cmdPool, static_cast<uint32_t>(multiviewPass.commandBuffers.size()), multiviewPass.commandBuffers.data());
|
||||
|
||||
VkCommandBufferAllocateInfo cmdBufAllocateInfo = vks::initializers::commandBufferAllocateInfo(cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, static_cast<uint32_t>(drawCmdBuffers.size()));
|
||||
multiviewPass.commandBuffers.resize(drawCmdBuffers.size());
|
||||
VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, multiviewPass.commandBuffers.data()));
|
||||
|
||||
resized = false;
|
||||
buildCommandBuffers();
|
||||
|
||||
// SRS - Recreate Multiview fences in case number of swapchain images has changed on resize
|
||||
for (auto& fence : multiviewPass.waitFences) {
|
||||
vkDestroyFence(device, fence, nullptr);
|
||||
}
|
||||
|
||||
VkFenceCreateInfo fenceCreateInfo = vks::initializers::fenceCreateInfo(VK_FENCE_CREATE_SIGNALED_BIT);
|
||||
multiviewPass.waitFences.resize(multiviewPass.commandBuffers.size());
|
||||
for (auto& fence : multiviewPass.waitFences) {
|
||||
VK_CHECK_RESULT(vkCreateFence(device, &fenceCreateInfo, nullptr, &fence));
|
||||
}
|
||||
}
|
||||
|
||||
virtual void render()
|
||||
{
|
||||
if (!prepared)
|
||||
|
|
@ -704,4 +752,4 @@ public:
|
|||
|
||||
};
|
||||
|
||||
VULKAN_EXAMPLE_MAIN()
|
||||
VULKAN_EXAMPLE_MAIN()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue