aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/cube.c102
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"};