Lines Matching full:demo
58 #define APP_LONG_NAME "The Vulkan Triangle Demo Program"
86 demo->fp##entrypoint = \
88 if (demo->fp##entrypoint == NULL) { \
96 demo->fp##entrypoint = \
98 if (demo->fp##entrypoint == NULL) { \
157 struct demo {
261 static void demo_resize(struct demo *demo);
263 static bool memory_type_from_properties(struct demo *demo, uint32_t typeBits,
270 if ((demo->memory_properties.memoryTypes[i].propertyFlags &
282 static void demo_flush_init_cmd(struct demo *demo) {
285 if (demo->setup_cmd == VK_NULL_HANDLE)
288 err = vkEndCommandBuffer(demo->setup_cmd);
291 const VkCommandBuffer cmd_bufs[] = {demo->setup_cmd};
303 err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
306 err = vkQueueWaitIdle(demo->queue);
309 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, cmd_bufs);
310 demo->setup_cmd = VK_NULL_HANDLE;
313 static void demo_set_image_layout(struct demo *demo, VkImage image,
321 if (demo->setup_cmd == VK_NULL_HANDLE) {
325 .commandPool = demo->cmd_pool,
330 err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->setup_cmd);
349 err = vkBeginCommandBuffer(demo->setup_cmd, &cmd_buf_info);
389 vkCmdPipelineBarrier(demo->setup_cmd, src_stages, dest_stages, 0, 0, NULL,
393 static void demo_draw_build_cmd(struct demo *demo) {
412 [1] = {.depthStencil = {demo->depthStencil, 0}},
417 .renderPass = demo->render_pass,
418 .framebuffer = demo->framebuffers[demo->current_buffer],
421 .renderArea.extent.width = demo->width,
422 .renderArea.extent.height = demo->height,
428 err = vkBeginCommandBuffer(demo->draw_cmd, &cmd_buf_info);
431 vkCmdBeginRenderPass(demo->draw_cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
432 vkCmdBindPipeline(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
433 demo->pipeline);
434 vkCmdBindDescriptorSets(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
435 demo->pipeline_layout, 0, 1, &demo->desc_set, 0,
440 viewport.height = (float)demo->height;
441 viewport.width = (float)demo->width;
444 vkCmdSetViewport(demo->draw_cmd, 0, 1, &viewport);
448 scissor.extent.width = demo->width;
449 scissor.extent.height = demo->height;
452 vkCmdSetScissor(demo->draw_cmd, 0, 1, &scissor);
455 vkCmdBindVertexBuffers(demo->draw_cmd, VERTEX_BUFFER_BIND_ID, 1,
456 demo->vertices.buf, offsets);
458 vkCmdDraw(demo->draw_cmd, 3, 1, 0, 0);
459 vkCmdEndRenderPass(demo->draw_cmd);
472 prePresentBarrier.image = demo->buffers[demo->current_buffer].image;
474 vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
478 err = vkEndCommandBuffer(demo->draw_cmd);
482 static void demo_draw(struct demo *demo) {
491 err = vkCreateSemaphore(demo->device, &presentCompleteSemaphoreCreateInfo,
496 err = demo->fpAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX,
499 &demo->current_buffer);
501 // demo->swapchain is out of date (e.g. the window was resized) and
503 demo_resize(demo);
504 demo_draw(demo);
505 vkDestroySemaphore(demo->device, presentCompleteSemaphore, NULL);
508 // demo->swapchain is not as optimal as it could be, but the platform's
516 demo_set_image_layout(demo, demo->buffers[demo->current_buffer].image,
521 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);
550 .pSwapchains = &demo->swapchain,
551 .pImageIndices = &demo->current_buffer,
555 err = demo->fpQueuePresentKHR(demo->queue, &present);
557 // demo->swapchain is out of date (e.g. the window was resized) and
559 demo_resize(demo);
561 // demo->swapchain is not as optimal as it could be, but the platform's
567 err = vkQueueWaitIdle(demo->queue);
570 vkDestroySemaphore(demo->device, presentCompleteSemaphore, NULL);
573 static void demo_prepare_buffers(struct demo *demo) {
575 VkSwapchainKHR oldSwapchain = demo->swapchain;
579 err = demo->fpGetPhysicalDeviceSurfaceCapabilitiesKHR(
580 demo->gpu, demo->surface, &surfCapabilities);
584 err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR(
585 demo->gpu, demo->surface, &presentModeCount, NULL);
590 err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR(
591 demo->gpu, demo->surface, &presentModeCount, presentModes);
599 swapchainExtent.width = demo->width;
600 swapchainExtent.height = demo->height;
604 demo->width = surfCapabilities.currentExtent.width;
605 demo->height = surfCapabilities.currentExtent.height;
632 .surface = demo->surface,
634 .imageFormat = demo->format,
635 .imageColorSpace = demo->color_space,
653 err = demo->fpCreateSwapchainKHR(demo->device, &swapchain, NULL,
654 &demo->swapchain);
662 demo->fpDestroySwapchainKHR(demo->device, oldSwapchain, NULL);
665 err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain,
666 &demo->swapchainImageCount, NULL);
670 (VkImage *)malloc(demo->swapchainImageCount * sizeof(VkImage));
672 err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain,
673 &demo->swapchainImageCount,
677 demo->buffers = (SwapchainBuffers *)malloc(sizeof(SwapchainBuffers) *
678 demo->swapchainImageCount);
679 assert(demo->buffers);
681 for (i = 0; i < demo->swapchainImageCount; i++) {
685 .format = demo->format,
702 demo->buffers[i].image = swapchainImages[i];
709 demo, demo->buffers[i].image, VK_IMAGE_ASPECT_COLOR_BIT,
713 color_attachment_view.image = demo->buffers[i].image;
715 err = vkCreateImageView(demo->device, &color_attachment_view, NULL,
716 &demo->buffers[i].view);
720 demo->current_buffer = 0;
727 static void demo_prepare_depth(struct demo *demo) {
734 .extent = {demo->width, demo->height, 1},
766 demo->depth.format = depth_format;
769 err = vkCreateImage(demo->device, &image, NULL, &demo->depth.image);
773 vkGetImageMemoryRequirements(demo->device, demo->depth.image, &mem_reqs);
777 pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
783 err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->depth.mem);
788 vkBindImageMemory(demo->device, demo->depth.image, demo->depth.mem, 0);
791 demo_set_image_layout(demo, demo->depth.image, VK_IMAGE_ASPECT_DEPTH_BIT,
797 view.image = demo->depth.image;
798 err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view);
803 demo_prepare_texture_image(struct demo *demo, const uint32_t *tex_colors,
839 vkCreateImage(demo->device, &image_create_info, NULL, &tex_obj->image);
842 vkGetImageMemoryRequirements(demo->device, tex_obj->image, &mem_reqs);
846 memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
851 err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &tex_obj->mem);
855 err = vkBindImageMemory(demo->device, tex_obj->image, tex_obj->mem, 0);
868 vkGetImageSubresourceLayout(demo->device, tex_obj->image, &subres,
871 err = vkMapMemory(demo->device, tex_obj->mem, 0,
881 vkUnmapMemory(demo->device, tex_obj->mem);
885 demo, tex_obj->image, VK_IMAGE_ASPECT_COLOR_BIT,
892 static void demo_destroy_texture_image(struct demo *demo,
895 vkDestroyImage(demo->device, tex_obj->image, NULL);
896 vkFreeMemory(demo->device, tex_obj->mem, NULL);
899 static void demo_prepare_textures(struct demo *demo) {
908 vkGetPhysicalDeviceFormatProperties(demo->gpu, tex_format, &props);
913 !demo->use_staging_buffer) {
915 demo_prepare_texture_image(demo, tex_colors[i], &demo->textures[i],
925 demo_prepare_texture_image(demo, tex_colors[i], &staging_texture,
931 demo, tex_colors[i], &demo->textures[i],
936 demo_set_image_layout(demo, staging_texture.image,
942 demo_set_image_layout(demo, demo->textures[i].image,
944 demo->textures[i].imageLayout,
957 demo->setup_cmd, staging_texture.image,
958 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, demo->textures[i].image,
961 demo_set_image_layout(demo, demo->textures[i].image,
964 demo->textures[i].imageLayout,
967 demo_flush_init_cmd(demo);
969 demo_destroy_texture_image(demo, &staging_texture);
1009 err = vkCreateSampler(demo->device, &sampler, NULL,
1010 &demo->textures[i].sampler);
1014 view.image = demo->textures[i].image;
1015 err = vkCreateImageView(demo->device, &view, NULL,
1016 &demo->textures[i].view);
1021 static void demo_prepare_vertices(struct demo *demo) {
1048 memset(&demo->vertices, 0, sizeof(demo->vertices));
1050 err = vkCreateBuffer(demo->device, &buf_info, NULL, &demo->vertices.buf);
1053 vkGetBufferMemoryRequirements(demo->device, demo->vertices.buf, &mem_reqs);
1057 pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
1062 err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->vertices.mem);
1065 err = vkMapMemory(demo->device, demo->vertices.mem, 0,
1071 vkUnmapMemory(demo->device, demo->vertices.mem);
1073 err = vkBindBufferMemory(demo->device, demo->vertices.buf,
1074 demo->vertices.mem, 0);
1077 demo->vertices.vi.sType =
1079 demo->vertices.vi.pNext = NULL;
1080 demo->vertices.vi.vertexBindingDescriptionCount = 1;
1081 demo->vertices.vi.pVertexBindingDescriptions = demo->vertices.vi_bindings;
1082 demo->vertices.vi.vertexAttributeDescriptionCount = 2;
1083 demo->vertices.vi.pVertexAttributeDescriptions = demo->vertices.vi_attrs;
1085 demo->vertices.vi_bindings[0].binding = VERTEX_BUFFER_BIND_ID;
1086 demo->vertices.vi_bindings[0].stride = sizeof(vb[0]);
1087 demo->vertices.vi_bindings[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1089 demo->vertices.vi_attrs[0].binding = VERTEX_BUFFER_BIND_ID;
1090 demo->vertices.vi_attrs[0].location = 0;
1091 demo->vertices.vi_attrs[0].format = VK_FORMAT_R32G32B32_SFLOAT;
1092 demo->vertices.vi_attrs[0].offset = 0;
1094 demo->vertices.vi_attrs[1].binding = VERTEX_BUFFER_BIND_ID;
1095 demo->vertices.vi_attrs[1].location = 1;
1096 demo->vertices.vi_attrs[1].format = VK_FORMAT_R32G32_SFLOAT;
1097 demo->vertices.vi_attrs[1].offset = sizeof(float) * 3;
1100 static void demo_prepare_descriptor_layout(struct demo *demo) {
1116 err = vkCreateDescriptorSetLayout(demo->device, &descriptor_layout, NULL,
1117 &demo->desc_layout);
1124 .pSetLayouts = &demo->desc_layout,
1127 err = vkCreatePipelineLayout(demo->device, &pPipelineLayoutCreateInfo, NULL,
1128 &demo->pipeline_layout);
1132 static void demo_prepare_render_pass(struct demo *demo) {
1136 .format = demo->format,
1147 .format = demo->depth.format,
1190 err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass);
1195 demo_prepare_shader_module(struct demo *demo, const void *code, size_t size) {
1206 err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module);
1237 static VkShaderModule demo_prepare_vs(struct demo *demo) {
1243 demo->vert_shader_module =
1244 demo_prepare_shader_module(demo, vertShaderCode, size);
1248 return demo->vert_shader_module;
1251 static VkShaderModule demo_prepare_fs(struct demo *demo) {
1257 demo->frag_shader_module =
1258 demo_prepare_shader_module(demo, fragShaderCode, size);
1262 return demo->frag_shader_module;
1265 static void demo_prepare_pipeline(struct demo *demo) {
1288 pipeline.layout = demo->pipeline_layout;
1290 vi = demo->vertices.vi;
1347 shaderStages[0].module = demo_prepare_vs(demo);
1352 shaderStages[1].module = demo_prepare_fs(demo);
1363 pipeline.renderPass = demo->render_pass;
1369 err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL,
1370 &demo->pipelineCache);
1372 err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1,
1373 &pipeline, NULL, &demo->pipeline);
1376 vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL);
1378 vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL);
1379 vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL);
1382 static void demo_prepare_descriptor_pool(struct demo *demo) {
1396 err = vkCreateDescriptorPool(demo->device, &descriptor_pool, NULL,
1397 &demo->desc_pool);
1401 static void demo_prepare_descriptor_set(struct demo *demo) {
1410 .descriptorPool = demo->desc_pool,
1412 .pSetLayouts = &demo->desc_layout};
1413 err = vkAllocateDescriptorSets(demo->device, &alloc_info, &demo->desc_set);
1418 tex_descs[i].sampler = demo->textures[i].sampler;
1419 tex_descs[i].imageView = demo->textures[i].view;
1425 write.dstSet = demo->desc_set;
1430 vkUpdateDescriptorSets(demo->device, 1, &write, 0, NULL);
1433 static void demo_prepare_framebuffers(struct demo *demo) {
1435 attachments[1] = demo->depth.view;
1440 .renderPass = demo->render_pass,
1443 .width = demo->width,
1444 .height = demo->height,
1450 demo->framebuffers = (VkFramebuffer *)malloc(demo->swapchainImageCount *
1452 assert(demo->framebuffers);
1454 for (i = 0; i < demo->swapchainImageCount; i++) {
1455 attachments[0] = demo->buffers[i].view;
1456 err = vkCreateFramebuffer(demo->device, &fb_info, NULL,
1457 &demo->framebuffers[i]);
1462 static void demo_prepare(struct demo *demo) {
1468 .queueFamilyIndex = demo->graphics_queue_node_index,
1471 err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL,
1472 &demo->cmd_pool);
1478 .commandPool = demo->cmd_pool,
1482 err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->draw_cmd);
1485 demo_prepare_buffers(demo);
1486 demo_prepare_depth(demo);
1487 demo_prepare_textures(demo);
1488 demo_prepare_vertices(demo);
1489 demo_prepare_descriptor_layout(demo);
1490 demo_prepare_render_pass(demo);
1491 demo_prepare_pipeline(demo);
1493 demo_prepare_descriptor_pool(demo);
1494 demo_prepare_descriptor_set(demo);
1496 demo_prepare_framebuffers(demo);
1498 demo->prepared = true;
1502 static void demo_run(struct demo *demo) {
1503 if (!demo->prepared)
1505 demo_draw(demo);
1507 if (demo->depthStencil > 0.99f)
1508 demo->depthIncrement = -0.001f;
1509 if (demo->depthStencil < 0.8f)
1510 demo->depthIncrement = 0.001f;
1512 demo->depthStencil += demo->depthIncrement;
1516 struct demo demo;
1529 if (demo.prepared) {
1530 demo_run(&demo);
1538 demo.width = lParam & 0xffff;
1539 demo.height = lParam & 0xffff0000 >> 16;
1540 demo_resize(&demo);
1549 static void demo_create_window(struct demo *demo) {
1558 win_class.hInstance = demo->connection; // hInstance
1563 win_class.lpszClassName = demo->name;
1573 RECT wr = {0, 0, demo->width, demo->height};
1575 demo->window = CreateWindowEx(0,
1576 demo->name, // class name
1577 demo->name, // app name
1585 demo->connection, // hInstance
1587 if (!demo->window) {
1596 static void demo_handle_event(struct demo *demo,
1600 demo_draw(demo);
1604 (*demo->atom_wm_delete_window).atom) {
1605 demo->quit = true;
1613 demo->quit = true;
1616 demo->quit = true;
1621 if ((demo->width != cfg->width) || (demo->height != cfg->height)) {
1622 demo->width = cfg->width;
1623 demo->height = cfg->height;
1624 demo_resize(demo);
1632 static void demo_run(struct demo *demo) {
1633 xcb_flush(demo->connection);
1635 while (!demo->quit) {
1638 event = xcb_poll_for_event(demo->connection);
1640 demo_handle_event(demo, event);
1644 demo_draw(demo);
1646 if (demo->depthStencil > 0.99f)
1647 demo->depthIncrement = -0.001f;
1648 if (demo->depthStencil < 0.8f)
1649 demo->depthIncrement = 0.001f;
1651 demo->depthStencil += demo->depthIncrement;
1654 vkDeviceWaitIdle(demo->device);
1658 static void demo_create_window(struct demo *demo) {
1661 demo->window = xcb_generate_id(demo->connection);
1664 value_list[0] = demo->screen->black_pixel;
1668 xcb_create_window(demo->connection, XCB_COPY_FROM_PARENT, demo->window,
1669 demo->screen->root, 0, 0, demo->width, demo->height, 0,
1670 XCB_WINDOW_CLASS_INPUT_OUTPUT, demo->screen->root_visual,
1675 xcb_intern_atom(demo->connection, 1, 12, "WM_PROTOCOLS");
1677 xcb_intern_atom_reply(demo->connection, cookie, 0);
1680 xcb_intern_atom(demo->connection, 0, 16, "WM_DELETE_WINDOW");
1681 demo->atom_wm_delete_window =
1682 xcb_intern_atom_reply(demo->connection, cookie2, 0);
1684 xcb_change_property(demo->connection, XCB_PROP_MODE_REPLACE, demo->window,
1686 &(*demo->atom_wm_delete_window).atom);
1689 xcb_map_window(demo->connection, demo->window);
1716 static void demo_init_vk(struct demo *demo) {
1722 demo->enabled_extension_count = 0;
1723 demo->enabled_layer_count = 0;
1738 if (demo->validate) {
1757 demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1);
1758 demo->device_validation_layers[0] = "VK_LAYER_LUNARG_standard_validation";
1763 demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2);
1771 demo->device_validation_layers[i] =
1790 memset(demo->extension_names, 0, sizeof(demo->extension_names));
1806 demo->extension_names[demo->enabled_extension_count++] =
1813 demo->extension_names[demo->enabled_extension_count++] =
1820 demo->extension_names[demo->enabled_extension_count++] =
1826 if (demo->validate) {
1827 demo->extension_names[demo->enabled_extension_count++] =
1831 assert(demo->enabled_extension_count < 64);
1878 .enabledLayerCount = demo->enabled_layer_count,
1880 .enabledExtensionCount = demo->enabled_extension_count,
1881 .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
1886 err = vkCreateInstance(&inst_info, NULL, &demo->inst);
1904 err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL);
1910 err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count,
1913 /* For tri demo we just grab the first physical device */
1914 demo->gpu = physical_devices[0];
1925 if (demo->validate) {
1927 demo->enabled_layer_count = 0;
1930 vkEnumerateDeviceLayerProperties(demo->gpu, &device_layer_count, NULL);
1936 err = vkEnumerateDeviceLayerProperties(demo->gpu, &device_layer_count,
1942 demo->device_validation_layers,
1945 demo->enabled_layer_count = device_validation_layer_count;
1962 demo->enabled_extension_count = 0;
1963 memset(demo->extension_names, 0, sizeof(demo->extension_names));
1965 err = vkEnumerateDeviceExtensionProperties(demo->gpu, NULL,
1973 demo->gpu, NULL, &device_extension_count, device_extensions);
1980 demo->extension_names[demo->enabled_extension_count++] =
1983 assert(demo->enabled_extension_count < 64);
1999 if (demo->validate) {
2000 demo->CreateDebugReportCallback =
2002 demo->inst, "vkCreateDebugReportCallbackEXT");
2003 demo->DestroyDebugReportCallback =
2005 demo->inst, "vkDestroyDebugReportCallbackEXT");
2006 if (!demo->CreateDebugReportCallback) {
2011 if (!demo->DestroyDebugReportCallback) {
2016 demo->DebugReportMessage =
2018 demo->inst, "vkDebugReportMessageEXT");
2019 if (!demo->DebugReportMessage) {
2031 err = demo->CreateDebugReportCallback(demo->inst, &dbgCreateInfo, NULL,
2032 &demo->msg_callback);
2049 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceCapabilitiesKHR);
2050 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceFormatsKHR);
2051 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfacePresentModesKHR);
2052 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceSupportKHR);
2053 GET_INSTANCE_PROC_ADDR(demo->inst, CreateSwapchainKHR);
2054 GET_INSTANCE_PROC_ADDR(demo->inst, DestroySwapchainKHR);
2055 GET_INSTANCE_PROC_ADDR(demo->inst, GetSwapchainImagesKHR);
2056 GET_INSTANCE_PROC_ADDR(demo->inst, AcquireNextImageKHR);
2057 GET_INSTANCE_PROC_ADDR(demo->inst, QueuePresentKHR);
2059 vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props);
2062 vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,
2065 demo->queue_props = (VkQueueFamilyProperties *)malloc(
2066 demo->queue_count * sizeof(VkQueueFamilyProperties));
2067 vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,
2068 demo->queue_props);
2069 assert(demo->queue_count >= 1);
2072 vkGetPhysicalDeviceFeatures(demo->gpu, &features);
2084 static void demo_init_device(struct demo *demo) {
2091 .queueFamilyIndex = demo->graphics_queue_node_index,
2104 .enabledLayerCount = demo->enabled_layer_count,
2106 (const char *const *)((demo->validate)
2107 ? demo->device_validation_layers
2109 .enabledExtensionCount = demo->enabled_extension_count,
2110 .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
2114 err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device);
2118 static void demo_init_vk_swapchain(struct demo *demo) {
2128 createInfo.hinstance = demo->connection;
2129 createInfo.hwnd = demo->window;
2132 vkCreateWin32SurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface);
2139 createInfo.connection = demo->connection;
2140 createInfo.window = demo->window;
2142 err = vkCreateXcbSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface);
2147 (VkBool32 *)malloc(demo->queue_count * sizeof(VkBool32));
2148 for (i = 0; i < demo->queue_count; i++) {
2149 demo->fpGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface,
2157 for (i = 0; i < demo->queue_count; i++) {
2158 if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) {
2173 for (uint32_t i = 0; i < demo->queue_count; ++i) {
2192 // and a present queues, this demo program assumes it is only using
2199 demo->graphics_queue_node_index = graphicsQueueNodeIndex;
2201 demo_init_device(demo);
2203 vkGetDeviceQueue(demo->device, demo->graphics_queue_node_index, 0,
2204 &demo->queue);
2208 err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,
2213 err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,
2220 demo->format = VK_FORMAT_B8G8R8A8_UNORM;
2223 demo->format = surfFormats[0].format;
2225 demo->color_space = surfFormats[0].colorSpace;
2228 vkGetPhysicalDeviceMemoryProperties(demo->gpu, &demo->memory_properties);
2231 static void demo_init_connection(struct demo *demo) {
2237 demo->connection = xcb_connect(NULL, &scr);
2238 if (demo->connection == NULL) {
2245 setup = xcb_get_setup(demo->connection);
2250 demo->screen = iter.data;
2255 static void demo_init(struct demo *demo, HINSTANCE hInstance, LPSTR pCmdLine)
2257 static void demo_init(struct demo *demo, const int argc, const char *argv[])
2262 memset(demo, 0, sizeof(*demo));
2265 demo->connection = hInstance;
2266 strncpy(demo->name, APP_SHORT_NAME, APP_NAME_STR_LEN);
2269 demo->use_staging_buffer = true;
2271 demo->validate = true;
2279 demo->use_staging_buffer = true;
2281 demo->validate = true;
2290 demo_init_connection(demo);
2291 demo_init_vk(demo);
2293 demo->width = 300;
2294 demo->height = 300;
2295 demo->depthStencil = 1.0;
2296 demo->depthIncrement = -0.01f;
2299 static void demo_cleanup(struct demo *demo) {
2302 demo->prepared = false;
2304 for (i = 0; i < demo->swapchainImageCount; i++) {
2305 vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
2307 free(demo->framebuffers);
2308 vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
2310 if (demo->setup_cmd) {
2311 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);
2313 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);
2314 vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
2316 vkDestroyPipeline(demo->device, demo->pipeline, NULL);
2317 vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
2318 vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
2319 vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
2321 vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);
2322 vkFreeMemory(demo->device, demo->vertices.mem, NULL);
2325 vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
2326 vkDestroyImage(demo->device, demo->textures[i].image, NULL);
2327 vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
2328 vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
2331 for (i = 0; i < demo->swapchainImageCount; i++) {
2332 vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
2335 vkDestroyImageView(demo->device, demo->depth.view, NULL);
2336 vkDestroyImage(demo->device, demo->depth.image, NULL);
2337 vkFreeMemory(demo->device, demo->depth.mem, NULL);
2339 demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL);
2340 free(demo->buffers);
2342 vkDestroyDevice(demo->device, NULL);
2343 if (demo->validate) {
2344 demo->DestroyDebugReportCallback(demo->inst, demo->msg_callback, NULL);
2346 vkDestroySurfaceKHR(demo->inst, demo->surface, NULL);
2347 vkDestroyInstance(demo->inst, NULL);
2349 free(demo->queue_props);
2352 xcb_destroy_window(demo->connection, demo->window);
2353 xcb_disconnect(demo->connection);
2354 free(demo->atom_wm_delete_window);
2358 static void demo_resize(struct demo *demo) {
2362 if (!demo->prepared) {
2369 demo->prepared = false;
2371 for (i = 0; i < demo->swapchainImageCount; i++) {
2372 vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
2374 free(demo->framebuffers);
2375 vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
2377 if (demo->setup_cmd) {
2378 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);
2380 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);
2381 vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
2383 vkDestroyPipeline(demo->device, demo->pipeline, NULL);
2384 vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
2385 vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
2386 vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
2388 vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);
2389 vkFreeMemory(demo->device, demo->vertices.mem, NULL);
2392 vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
2393 vkDestroyImage(demo->device, demo->textures[i].image, NULL);
2394 vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
2395 vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
2398 for (i = 0; i < demo->swapchainImageCount; i++) {
2399 vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
2402 vkDestroyImageView(demo->device, demo->depth.view, NULL);
2403 vkDestroyImage(demo->device, demo->depth.image, NULL);
2404 vkFreeMemory(demo->device, demo->depth.mem, NULL);
2406 free(demo->buffers);
2410 demo_prepare(demo);
2419 demo_init(&demo, hInstance, pCmdLine);
2420 demo_create_window(&demo);
2421 demo_init_vk_swapchain(&demo);
2423 demo_prepare(&demo);
2437 RedrawWindow(demo.window, NULL, NULL, RDW_INTERNALPAINT);
2440 demo_cleanup(&demo);
2446 struct demo demo;
2448 demo_init(&demo, argc, argv);
2449 demo_create_window(&demo);
2450 demo_init_vk_swapchain(&demo);
2452 demo_prepare(&demo);
2453 demo_run(&demo);
2455 demo_cleanup(&demo);