diff options
| -rw-r--r-- | demos/cube.c | 102 |
1 files changed, 63 insertions, 39 deletions
diff --git a/demos/cube.c b/demos/cube.c index d322f6ce..68b8ded6 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -350,6 +350,7 @@ struct demo { bool prepared; bool use_staging_buffer; bool separate_present_queue; + bool is_minimized; bool VK_KHR_incremental_present_enabled; @@ -1120,6 +1121,13 @@ static void demo_prepare_buffers(struct demo *demo) { demo->height = surfCapabilities.currentExtent.height; } + if (demo->width == 0 || demo->height == 0) { + demo->is_minimized = true; + return; + } else { + demo->is_minimized = false; + } + // The FIFO present mode is guaranteed by the spec to be supported // and to have no tearing. It's a great default present mode to use. VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR; @@ -2050,15 +2058,16 @@ static void demo_prepare_framebuffers(struct demo *demo) { static void demo_prepare(struct demo *demo) { VkResult U_ASSERT_ONLY err; - - const VkCommandPoolCreateInfo cmd_pool_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .pNext = NULL, - .queueFamilyIndex = demo->graphics_queue_family_index, - .flags = 0, - }; - err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, &demo->cmd_pool); - assert(!err); + if (demo->cmd_pool == VK_NULL_HANDLE) { + const VkCommandPoolCreateInfo cmd_pool_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .pNext = NULL, + .queueFamilyIndex = demo->graphics_queue_family_index, + .flags = 0, + }; + err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, &demo->cmd_pool); + assert(!err); + } const VkCommandBufferAllocateInfo cmd = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, @@ -2079,6 +2088,12 @@ static void demo_prepare(struct demo *demo) { assert(!err); demo_prepare_buffers(demo); + + if (demo->is_minimized) { + demo->prepared = false; + return; + } + demo_prepare_depth(demo); demo_prepare_textures(demo); demo_prepare_cube_data_buffers(demo); @@ -2156,41 +2171,44 @@ static void demo_cleanup(struct demo *demo) { } } - for (i = 0; i < demo->swapchainImageCount; i++) { - vkDestroyFramebuffer(demo->device, demo->swapchain_image_resources[i].framebuffer, NULL); - } - vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); + // If the window is currently minimized, demo_resize has already done some cleanup for us. + if (!demo->is_minimized) { + for (i = 0; i < demo->swapchainImageCount; i++) { + vkDestroyFramebuffer(demo->device, demo->swapchain_image_resources[i].framebuffer, NULL); + } + vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); - vkDestroyPipeline(demo->device, demo->pipeline, NULL); - vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); - vkDestroyRenderPass(demo->device, demo->render_pass, NULL); - vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); - vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); + vkDestroyPipeline(demo->device, demo->pipeline, NULL); + vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); + vkDestroyRenderPass(demo->device, demo->render_pass, NULL); + vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); + vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); - for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { - vkDestroyImageView(demo->device, demo->textures[i].view, NULL); - vkDestroyImage(demo->device, demo->textures[i].image, NULL); - vkFreeMemory(demo->device, demo->textures[i].mem, NULL); - vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); - } - demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL); + for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { + vkDestroyImageView(demo->device, demo->textures[i].view, NULL); + vkDestroyImage(demo->device, demo->textures[i].image, NULL); + vkFreeMemory(demo->device, demo->textures[i].mem, NULL); + vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); + } + demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL); - vkDestroyImageView(demo->device, demo->depth.view, NULL); - vkDestroyImage(demo->device, demo->depth.image, NULL); - vkFreeMemory(demo->device, demo->depth.mem, NULL); + vkDestroyImageView(demo->device, demo->depth.view, NULL); + vkDestroyImage(demo->device, demo->depth.image, NULL); + vkFreeMemory(demo->device, demo->depth.mem, NULL); - for (i = 0; i < demo->swapchainImageCount; i++) { - vkDestroyImageView(demo->device, demo->swapchain_image_resources[i].view, NULL); - vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->swapchain_image_resources[i].cmd); - vkDestroyBuffer(demo->device, demo->swapchain_image_resources[i].uniform_buffer, NULL); - vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); - } - free(demo->swapchain_image_resources); - free(demo->queue_props); - vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); + for (i = 0; i < demo->swapchainImageCount; i++) { + vkDestroyImageView(demo->device, demo->swapchain_image_resources[i].view, NULL); + vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->swapchain_image_resources[i].cmd); + vkDestroyBuffer(demo->device, demo->swapchain_image_resources[i].uniform_buffer, NULL); + vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); + } + free(demo->swapchain_image_resources); + free(demo->queue_props); + vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); - if (demo->separate_present_queue) { - vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); + if (demo->separate_present_queue) { + vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); + } } vkDeviceWaitIdle(demo->device); vkDestroyDevice(demo->device, NULL); @@ -2227,6 +2245,9 @@ static void demo_resize(struct demo *demo) { // Don't react to resize until after first initialization. if (!demo->prepared) { + if (demo->is_minimized) { + demo_prepare(demo); + } return; } // In order to properly resize the window, we must re-create the swapchain @@ -2265,6 +2286,7 @@ static void demo_resize(struct demo *demo) { vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); } vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); + demo->cmd_pool = VK_NULL_HANDLE; if (demo->separate_present_queue) { vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); } @@ -2784,6 +2806,8 @@ static void demo_init_vk(struct demo *demo) { char **instance_validation_layers = NULL; demo->enabled_extension_count = 0; demo->enabled_layer_count = 0; + demo->is_minimized = false; + demo->cmd_pool = VK_NULL_HANDLE; char *instance_validation_layers_alt1[] = {"VK_LAYER_LUNARG_standard_validation"}; |
