Lines Matching refs:demo
152 struct demo {
266 static void demo_resize(struct demo *demo);
268 static bool memory_type_from_properties(struct demo *demo, uint32_t typeBits,
276 if ((demo->memory_properties.memoryTypes[i].propertyFlags &
288 static void demo_flush_init_cmd(struct demo *demo) {
291 if (demo->setup_cmd == VK_NULL_HANDLE)
294 err = vkEndCommandBuffer(demo->setup_cmd);
297 const VkCommandBuffer cmd_bufs[] = {demo->setup_cmd};
309 err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
312 err = vkQueueWaitIdle(demo->queue);
315 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, cmd_bufs);
316 demo->setup_cmd = VK_NULL_HANDLE;
319 static void demo_set_image_layout(struct demo *demo, VkImage image,
327 if (demo->setup_cmd == VK_NULL_HANDLE) {
331 .commandPool = demo->cmd_pool,
336 err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->setup_cmd);
345 err = vkBeginCommandBuffer(demo->setup_cmd, &cmd_buf_info);
385 vkCmdPipelineBarrier(demo->setup_cmd, src_stages, dest_stages, 0, 0, NULL,
389 static void demo_draw_build_cmd(struct demo *demo) {
398 [1] = {.depthStencil = {demo->depthStencil, 0}},
403 .renderPass = demo->render_pass,
404 .framebuffer = demo->framebuffers[demo->current_buffer],
407 .renderArea.extent.width = demo->width,
408 .renderArea.extent.height = demo->height,
414 err = vkBeginCommandBuffer(demo->draw_cmd, &cmd_buf_info);
428 .image = demo->buffers[demo->current_buffer].image,
431 vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
434 vkCmdBeginRenderPass(demo->draw_cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
435 vkCmdBindPipeline(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
436 demo->pipeline);
437 vkCmdBindDescriptorSets(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
438 demo->pipeline_layout, 0, 1, &demo->desc_set, 0,
443 viewport.height = (float)demo->height;
444 viewport.width = (float)demo->width;
447 vkCmdSetViewport(demo->draw_cmd, 0, 1, &viewport);
451 scissor.extent.width = demo->width;
452 scissor.extent.height = demo->height;
455 vkCmdSetScissor(demo->draw_cmd, 0, 1, &scissor);
458 vkCmdBindVertexBuffers(demo->draw_cmd, VERTEX_BUFFER_BIND_ID, 1,
459 &demo->vertices.buf, offsets);
461 vkCmdDraw(demo->draw_cmd, 3, 1, 0, 0);
462 vkCmdEndRenderPass(demo->draw_cmd);
475 prePresentBarrier.image = demo->buffers[demo->current_buffer].image;
477 vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
481 err = vkEndCommandBuffer(demo->draw_cmd);
485 static void demo_draw(struct demo *demo) {
494 err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
498 err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
503 err = vkAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX,
506 &demo->current_buffer);
508 // demo->swapchain is out of date (e.g. the window was resized) and
510 demo_resize(demo);
511 demo_draw(demo);
512 vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
513 vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
516 // demo->swapchain is not as optimal as it could be, but the platform's
522 demo_flush_init_cmd(demo);
529 demo_draw_build_cmd(demo);
539 .pCommandBuffers = &demo->draw_cmd,
543 err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
552 .pSwapchains = &demo->swapchain,
553 .pImageIndices = &demo->current_buffer,
556 err = vkQueuePresentKHR(demo->queue, &present);
558 // demo->swapchain is out of date (e.g. the window was resized) and
560 demo_resize(demo);
562 // demo->swapchain is not as optimal as it could be, but the platform's
568 err = vkQueueWaitIdle(demo->queue);
571 vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
572 vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
575 static void demo_prepare_buffers(struct demo *demo) {
577 VkSwapchainKHR oldSwapchain = demo->swapchain;
582 demo->gpu, demo->surface, &surfCapabilities);
587 demo->gpu, demo->surface, &presentModeCount, NULL);
593 demo->gpu, demo->surface, &presentModeCount, presentModes);
602 swapchainExtent.width = demo->width;
603 swapchainExtent.height = demo->height;
619 demo->width = surfCapabilities.currentExtent.width;
620 demo->height = surfCapabilities.currentExtent.height;
648 .surface = demo->surface,
650 .imageFormat = demo->format,
651 .imageColorSpace = demo->color_space,
669 err = vkCreateSwapchainKHR(demo->device, &swapchain, NULL, &demo->swapchain);
677 vkDestroySwapchainKHR(demo->device, oldSwapchain, NULL);
680 err = vkGetSwapchainImagesKHR(demo->device, demo->swapchain,
681 &demo->swapchainImageCount, NULL);
685 (VkImage *)malloc(demo->swapchainImageCount * sizeof(VkImage));
687 err = vkGetSwapchainImagesKHR(demo->device, demo->swapchain,
688 &demo->swapchainImageCount,
692 demo->buffers = (SwapchainBuffers *)malloc(sizeof(SwapchainBuffers) *
693 demo->swapchainImageCount);
694 assert(demo->buffers);
696 for (i = 0; i < demo->swapchainImageCount; i++) {
700 .format = demo->format,
717 demo->buffers[i].image = swapchainImages[i];
719 color_attachment_view.image = demo->buffers[i].image;
721 err = vkCreateImageView(demo->device, &color_attachment_view, NULL,
722 &demo->buffers[i].view);
726 demo->current_buffer = 0;
733 static void demo_prepare_depth(struct demo *demo) {
740 .extent = {demo->width, demo->height, 1},
772 demo->depth.format = depth_format;
775 err = vkCreateImage(demo->device, &image, NULL, &demo->depth.image);
779 vkGetImageMemoryRequirements(demo->device, demo->depth.image, &mem_reqs);
783 pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
789 err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->depth.mem);
794 vkBindImageMemory(demo->device, demo->depth.image, demo->depth.mem, 0);
797 demo_set_image_layout(demo, demo->depth.image, VK_IMAGE_ASPECT_DEPTH_BIT,
803 view.image = demo->depth.image;
804 err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view);
809 demo_prepare_texture_image(struct demo *demo, const uint32_t *tex_colors,
845 vkCreateImage(demo->device, &image_create_info, NULL, &tex_obj->image);
848 vkGetImageMemoryRequirements(demo->device, tex_obj->image, &mem_reqs);
852 memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
857 err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &tex_obj->mem);
861 err = vkBindImageMemory(demo->device, tex_obj->image, tex_obj->mem, 0);
874 vkGetImageSubresourceLayout(demo->device, tex_obj->image, &subres,
877 err = vkMapMemory(demo->device, tex_obj->mem, 0,
887 vkUnmapMemory(demo->device, tex_obj->mem);
891 demo_set_image_layout(demo, tex_obj->image, VK_IMAGE_ASPECT_COLOR_BIT,
898 static void demo_destroy_texture_image(struct demo *demo,
901 vkDestroyImage(demo->device, tex_obj->image, NULL);
902 vkFreeMemory(demo->device, tex_obj->mem, NULL);
905 static void demo_prepare_textures(struct demo *demo) {
914 vkGetPhysicalDeviceFormatProperties(demo->gpu, tex_format, &props);
919 !demo->use_staging_buffer) {
922 demo, tex_colors[i], &demo->textures[i], VK_IMAGE_TILING_LINEAR,
933 demo, tex_colors[i], &staging_texture, VK_IMAGE_TILING_LINEAR,
939 demo, tex_colors[i], &demo->textures[i],
944 demo_set_image_layout(demo, staging_texture.image,
950 demo_set_image_layout(demo, demo->textures[i].image,
952 demo->textures[i].imageLayout,
965 demo->setup_cmd, staging_texture.image,
966 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, demo->textures[i].image,
969 demo_set_image_layout(demo, demo->textures[i].image,
972 demo->textures[i].imageLayout,
975 demo_flush_init_cmd(demo);
977 demo_destroy_texture_image(demo, &staging_texture);
1017 err = vkCreateSampler(demo->device, &sampler, NULL,
1018 &demo->textures[i].sampler);
1022 view.image = demo->textures[i].image;
1023 err = vkCreateImageView(demo->device, &view, NULL,
1024 &demo->textures[i].view);
1029 static void demo_prepare_vertices(struct demo *demo) {
1056 memset(&demo->vertices, 0, sizeof(demo->vertices));
1058 err = vkCreateBuffer(demo->device, &buf_info, NULL, &demo->vertices.buf);
1061 vkGetBufferMemoryRequirements(demo->device, demo->vertices.buf, &mem_reqs);
1065 pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
1071 err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->vertices.mem);
1074 err = vkMapMemory(demo->device, demo->vertices.mem, 0,
1080 vkUnmapMemory(demo->device, demo->vertices.mem);
1082 err = vkBindBufferMemory(demo->device, demo->vertices.buf,
1083 demo->vertices.mem, 0);
1086 demo->vertices.vi.sType =
1088 demo->vertices.vi.pNext = NULL;
1089 demo->vertices.vi.vertexBindingDescriptionCount = 1;
1090 demo->vertices.vi.pVertexBindingDescriptions = demo->vertices.vi_bindings;
1091 demo->vertices.vi.vertexAttributeDescriptionCount = 2;
1092 demo->vertices.vi.pVertexAttributeDescriptions = demo->vertices.vi_attrs;
1094 demo->vertices.vi_bindings[0].binding = VERTEX_BUFFER_BIND_ID;
1095 demo->vertices.vi_bindings[0].stride = sizeof(vb[0]);
1096 demo->vertices.vi_bindings[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1098 demo->vertices.vi_attrs[0].binding = VERTEX_BUFFER_BIND_ID;
1099 demo->vertices.vi_attrs[0].location = 0;
1100 demo->vertices.vi_attrs[0].format = VK_FORMAT_R32G32B32_SFLOAT;
1101 demo->vertices.vi_attrs[0].offset = 0;
1103 demo->vertices.vi_attrs[1].binding = VERTEX_BUFFER_BIND_ID;
1104 demo->vertices.vi_attrs[1].location = 1;
1105 demo->vertices.vi_attrs[1].format = VK_FORMAT_R32G32_SFLOAT;
1106 demo->vertices.vi_attrs[1].offset = sizeof(float) * 3;
1109 static void demo_prepare_descriptor_layout(struct demo *demo) {
1125 err = vkCreateDescriptorSetLayout(demo->device, &descriptor_layout, NULL,
1126 &demo->desc_layout);
1133 .pSetLayouts = &demo->desc_layout,
1136 err = vkCreatePipelineLayout(demo->device, &pPipelineLayoutCreateInfo, NULL,
1137 &demo->pipeline_layout);
1141 static void demo_prepare_render_pass(struct demo *demo) {
1145 .format = demo->format,
1156 .format = demo->depth.format,
1199 err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass);
1204 demo_prepare_shader_module(struct demo *demo, const void *code, size_t size) {
1215 err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module);
1221 static VkShaderModule demo_prepare_vs(struct demo *demo) {
1224 demo->vert_shader_module =
1225 demo_prepare_shader_module(demo, vertShaderCode, size);
1227 return demo->vert_shader_module;
1230 static VkShaderModule demo_prepare_fs(struct demo *demo) {
1233 demo->frag_shader_module =
1234 demo_prepare_shader_module(demo, fragShaderCode, size);
1236 return demo->frag_shader_module;
1239 static void demo_prepare_pipeline(struct demo *demo) {
1262 pipeline.layout = demo->pipeline_layout;
1264 vi = demo->vertices.vi;
1322 shaderStages[0].module = demo_prepare_vs(demo);
1327 shaderStages[1].module = demo_prepare_fs(demo);
1338 pipeline.renderPass = demo->render_pass;
1344 err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL,
1345 &demo->pipelineCache);
1347 err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1,
1348 &pipeline, NULL, &demo->pipeline);
1351 vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL);
1353 vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL);
1354 vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL);
1357 static void demo_prepare_descriptor_pool(struct demo *demo) {
1371 err = vkCreateDescriptorPool(demo->device, &descriptor_pool, NULL,
1372 &demo->desc_pool);
1376 static void demo_prepare_descriptor_set(struct demo *demo) {
1385 .descriptorPool = demo->desc_pool,
1387 .pSetLayouts = &demo->desc_layout};
1388 err = vkAllocateDescriptorSets(demo->device, &alloc_info, &demo->desc_set);
1393 tex_descs[i].sampler = demo->textures[i].sampler;
1394 tex_descs[i].imageView = demo->textures[i].view;
1400 write.dstSet = demo->desc_set;
1405 vkUpdateDescriptorSets(demo->device, 1, &write, 0, NULL);
1408 static void demo_prepare_framebuffers(struct demo *demo) {
1410 attachments[1] = demo->depth.view;
1415 .renderPass = demo->render_pass,
1418 .width = demo->width,
1419 .height = demo->height,
1425 demo->framebuffers = (VkFramebuffer *)malloc(demo->swapchainImageCount *
1427 assert(demo->framebuffers);
1429 for (i = 0; i < demo->swapchainImageCount; i++) {
1430 attachments[0] = demo->buffers[i].view;
1431 err = vkCreateFramebuffer(demo->device, &fb_info, NULL,
1432 &demo->framebuffers[i]);
1437 static void demo_prepare(struct demo *demo) {
1443 .queueFamilyIndex = demo->graphics_queue_node_index,
1446 err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL,
1447 &demo->cmd_pool);
1453 .commandPool = demo->cmd_pool,
1457 err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->draw_cmd);
1460 demo_prepare_buffers(demo);
1461 demo_prepare_depth(demo);
1462 demo_prepare_textures(demo);
1463 demo_prepare_vertices(demo);
1464 demo_prepare_descriptor_layout(demo);
1465 demo_prepare_render_pass(demo);
1466 demo_prepare_pipeline(demo);
1468 demo_prepare_descriptor_pool(demo);
1469 demo_prepare_descriptor_set(demo);
1471 demo_prepare_framebuffers(demo);
1485 struct demo* demo = glfwGetWindowUserPointer(window);
1486 demo_draw(demo);
1490 struct demo* demo = glfwGetWindowUserPointer(window);
1491 demo->width = width;
1492 demo->height = height;
1493 demo_resize(demo);
1496 static void demo_run(struct demo *demo) {
1497 while (!glfwWindowShouldClose(demo->window)) {
1500 demo_draw(demo);
1502 if (demo->depthStencil > 0.99f)
1503 demo->depthIncrement = -0.001f;
1504 if (demo->depthStencil < 0.8f)
1505 demo->depthIncrement = 0.001f;
1507 demo->depthStencil += demo->depthIncrement;
1510 vkDeviceWaitIdle(demo->device);
1511 demo->curFrame++;
1512 if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount)
1513 glfwSetWindowShouldClose(demo->window, GLFW_TRUE);
1517 static void demo_create_window(struct demo *demo) {
1520 demo->window = glfwCreateWindow(demo->width,
1521 demo->height,
1525 if (!demo->window) {
1532 glfwSetWindowUserPointer(demo->window, demo);
1533 glfwSetWindowRefreshCallback(demo->window, demo_refresh_callback);
1534 glfwSetFramebufferSizeCallback(demo->window, demo_resize_callback);
1535 glfwSetKeyCallback(demo->window, demo_key_callback);
1562 static void demo_init_vk(struct demo *demo) {
1572 demo->enabled_extension_count = 0;
1573 demo->enabled_layer_count = 0;
1588 if (demo->validate) {
1607 demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1);
1608 demo->enabled_layers[0] = "VK_LAYER_LUNARG_standard_validation";
1614 demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2);
1622 demo->enabled_layers[i] = instance_validation_layers[i];
1649 demo->extension_names[demo->enabled_extension_count++] = required_extensions[i];
1650 assert(demo->enabled_extension_count < 64);
1666 if (demo->validate) {
1667 demo->extension_names[demo->enabled_extension_count++] =
1671 assert(demo->enabled_extension_count < 64);
1674 demo->extension_names[demo->enabled_extension_count++] =
1678 assert(demo->enabled_extension_count < 64);
1697 .enabledLayerCount = demo->enabled_layer_count,
1699 .enabledExtensionCount = demo->enabled_extension_count,
1700 .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
1708 err = vkCreateInstance(&inst_info, NULL, &demo->inst);
1725 gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, demo->inst);
1728 err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL);
1734 err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count,
1737 /* For tri demo we just grab the first physical device */
1738 demo->gpu = physical_devices[0];
1748 gladLoadVulkanUserPtr(demo->gpu, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, demo->inst);
1753 demo->enabled_extension_count = 0;
1755 err = vkEnumerateDeviceExtensionProperties(demo->gpu, NULL,
1763 demo->gpu, NULL, &device_extension_count, device_extensions);
1770 demo->extension_names[demo->enabled_extension_count++] =
1773 assert(demo->enabled_extension_count < 64);
1789 if (demo->validate) {
1794 dbgCreateInfo.pfnCallback = demo->use_break ? BreakCallback : dbgFunc;
1795 dbgCreateInfo.pUserData = demo;
1797 err = vkCreateDebugReportCallbackEXT(demo->inst, &dbgCreateInfo, NULL,
1798 &demo->msg_callback);
1813 vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props);
1816 vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,
1819 demo->queue_props = (VkQueueFamilyProperties *)malloc(
1820 demo->queue_count * sizeof(VkQueueFamilyProperties));
1821 vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,
1822 demo->queue_props);
1823 assert(demo->queue_count >= 1);
1825 vkGetPhysicalDeviceFeatures(demo->gpu, &demo->gpu_features);
1832 static void demo_init_device(struct demo *demo) {
1839 .queueFamilyIndex = demo->graphics_queue_node_index,
1846 if (demo->gpu_features.shaderClipDistance) {
1857 .enabledExtensionCount = demo->enabled_extension_count,
1858 .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
1862 err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device);
1866 static void demo_init_vk_swapchain(struct demo *demo) {
1871 glfwCreateWindowSurface(demo->inst, demo->window, NULL, &demo->surface);
1875 (VkBool32 *)malloc(demo->queue_count * sizeof(VkBool32));
1876 for (i = 0; i < demo->queue_count; i++) {
1877 vkGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface,
1885 for (i = 0; i < demo->queue_count; i++) {
1886 if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) {
1901 for (i = 0; i < demo->queue_count; ++i) {
1920 // and a present queues, this demo program assumes it is only using
1927 demo->graphics_queue_node_index = graphicsQueueNodeIndex;
1929 demo_init_device(demo);
1931 vkGetDeviceQueue(demo->device, demo->graphics_queue_node_index, 0,
1932 &demo->queue);
1936 err = vkGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,
1941 err = vkGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,
1948 demo->format = VK_FORMAT_B8G8R8A8_UNORM;
1951 demo->format = surfFormats[0].format;
1953 demo->color_space = surfFormats[0].colorSpace;
1955 demo->curFrame = 0;
1958 vkGetPhysicalDeviceMemoryProperties(demo->gpu, &demo->memory_properties);
1961 static void demo_init_connection(struct demo *demo) {
1979 static void demo_init(struct demo *demo, const int argc, const char *argv[])
1982 memset(demo, 0, sizeof(*demo));
1983 demo->frameCount = INT32_MAX;
1987 demo->use_staging_buffer = true;
1991 demo->use_break = true;
1995 demo->validate = true;
1998 if (strcmp(argv[i], "--c") == 0 && demo->frameCount == INT32_MAX &&
1999 i < argc - 1 && sscanf(argv[i + 1], "%d", &demo->frameCount) == 1 &&
2000 demo->frameCount >= 0) {
2012 demo_init_connection(demo);
2013 demo_init_vk(demo);
2015 demo->width = 300;
2016 demo->height = 300;
2017 demo->depthStencil = 1.0;
2018 demo->depthIncrement = -0.01f;
2021 static void demo_cleanup(struct demo *demo) {
2024 for (i = 0; i < demo->swapchainImageCount; i++) {
2025 vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
2027 free(demo->framebuffers);
2028 vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
2030 if (demo->setup_cmd) {
2031 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);
2033 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);
2034 vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
2036 vkDestroyPipeline(demo->device, demo->pipeline, NULL);
2037 vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
2038 vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
2039 vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
2041 vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);
2042 vkFreeMemory(demo->device, demo->vertices.mem, NULL);
2045 vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
2046 vkDestroyImage(demo->device, demo->textures[i].image, NULL);
2047 vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
2048 vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
2051 for (i = 0; i < demo->swapchainImageCount; i++) {
2052 vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
2055 vkDestroyImageView(demo->device, demo->depth.view, NULL);
2056 vkDestroyImage(demo->device, demo->depth.image, NULL);
2057 vkFreeMemory(demo->device, demo->depth.mem, NULL);
2059 vkDestroySwapchainKHR(demo->device, demo->swapchain, NULL);
2060 free(demo->buffers);
2062 vkDestroyDevice(demo->device, NULL);
2063 if (demo->validate) {
2064 vkDestroyDebugReportCallbackEXT(demo->inst, demo->msg_callback, NULL);
2066 vkDestroySurfaceKHR(demo->inst, demo->surface, NULL);
2067 vkDestroyInstance(demo->inst, NULL);
2069 free(demo->queue_props);
2071 glfwDestroyWindow(demo->window);
2075 static void demo_resize(struct demo *demo) {
2083 for (i = 0; i < demo->swapchainImageCount; i++) {
2084 vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
2086 free(demo->framebuffers);
2087 vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
2089 if (demo->setup_cmd) {
2090 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);
2091 demo->setup_cmd = VK_NULL_HANDLE;
2093 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);
2094 vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
2096 vkDestroyPipeline(demo->device, demo->pipeline, NULL);
2097 vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
2098 vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
2099 vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
2101 vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);
2102 vkFreeMemory(demo->device, demo->vertices.mem, NULL);
2105 vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
2106 vkDestroyImage(demo->device, demo->textures[i].image, NULL);
2107 vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
2108 vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
2111 for (i = 0; i < demo->swapchainImageCount; i++) {
2112 vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
2115 vkDestroyImageView(demo->device, demo->depth.view, NULL);
2116 vkDestroyImage(demo->device, demo->depth.image, NULL);
2117 vkFreeMemory(demo->device, demo->depth.mem, NULL);
2119 free(demo->buffers);
2123 demo_prepare(demo);
2127 struct demo demo;
2129 demo_init(&demo, argc, argv);
2130 demo_create_window(&demo);
2131 demo_init_vk_swapchain(&demo);
2133 demo_prepare(&demo);
2134 demo_run(&demo);
2136 demo_cleanup(&demo);