• Home
  • Raw
  • Download

Lines Matching refs:demo

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