• Home
  • Raw
  • Download

Lines Matching refs:demo

76         if (!demo->suppress_popups)                                            \
99 demo->fp##entrypoint = \
101 if (demo->fp##entrypoint == NULL) { \
113 demo->inst, "vkGetDeviceProcAddr"); \
114 demo->fp##entrypoint = \
116 if (demo->fp##entrypoint == NULL) { \
287 struct demo { struct
457 struct demo *demo = (struct demo*) pUserData; in dbgFunc() local
458 if (!demo->suppress_popups) in dbgFunc()
500 static void demo_resize(struct demo *demo);
502 static bool memory_type_from_properties(struct demo *demo, uint32_t typeBits, in memory_type_from_properties() argument
509 if ((demo->memory_properties.memoryTypes[i].propertyFlags & in memory_type_from_properties()
521 static void demo_flush_init_cmd(struct demo *demo) { in demo_flush_init_cmd() argument
526 if (demo->cmd == VK_NULL_HANDLE) in demo_flush_init_cmd()
529 err = vkEndCommandBuffer(demo->cmd); in demo_flush_init_cmd()
536 vkCreateFence(demo->device, &fence_ci, NULL, &fence); in demo_flush_init_cmd()
537 const VkCommandBuffer cmd_bufs[] = {demo->cmd}; in demo_flush_init_cmd()
548 err = vkQueueSubmit(demo->graphics_queue, 1, &submit_info, fence); in demo_flush_init_cmd()
551 err = vkWaitForFences(demo->device, 1, &fence, VK_TRUE, UINT64_MAX); in demo_flush_init_cmd()
554 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, cmd_bufs); in demo_flush_init_cmd()
555 vkDestroyFence(demo->device, fence, NULL); in demo_flush_init_cmd()
556 demo->cmd = VK_NULL_HANDLE; in demo_flush_init_cmd()
559 static void demo_set_image_layout(struct demo *demo, VkImage image, in demo_set_image_layout() argument
568 if (demo->cmd == VK_NULL_HANDLE) { in demo_set_image_layout()
572 .commandPool = demo->cmd_pool, in demo_set_image_layout()
577 err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->cmd); in demo_set_image_layout()
585 err = vkBeginCommandBuffer(demo->cmd, &cmd_buf_info); in demo_set_image_layout()
636 vkCmdPipelineBarrier(demo->cmd, src_stages, dest_stages, 0, 0, NULL, 0, in demo_set_image_layout()
640 static void demo_draw_build_cmd(struct demo *demo, VkCommandBuffer cmd_buf) { in demo_draw_build_cmd() argument
654 .renderPass = demo->render_pass, in demo_draw_build_cmd()
655 .framebuffer = demo->framebuffers[demo->current_buffer], in demo_draw_build_cmd()
658 .renderArea.extent.width = demo->width, in demo_draw_build_cmd()
659 .renderArea.extent.height = demo->height, in demo_draw_build_cmd()
668 vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, demo->pipeline); in demo_draw_build_cmd()
670 demo->pipeline_layout, 0, 1, &demo->desc_set, 0, in demo_draw_build_cmd()
674 viewport.height = (float)demo->height; in demo_draw_build_cmd()
675 viewport.width = (float)demo->width; in demo_draw_build_cmd()
682 scissor.extent.width = demo->width; in demo_draw_build_cmd()
683 scissor.extent.height = demo->height; in demo_draw_build_cmd()
692 if (demo->separate_present_queue) { in demo_draw_build_cmd()
705 .srcQueueFamilyIndex = demo->graphics_queue_family_index, in demo_draw_build_cmd()
706 .dstQueueFamilyIndex = demo->present_queue_family_index, in demo_draw_build_cmd()
707 .image = demo->buffers[demo->current_buffer].image, in demo_draw_build_cmd()
719 void demo_build_image_ownership_cmd(struct demo *demo, int i) { in demo_build_image_ownership_cmd() argument
728 err = vkBeginCommandBuffer(demo->buffers[i].graphics_to_present_cmd, in demo_build_image_ownership_cmd()
739 .srcQueueFamilyIndex = demo->graphics_queue_family_index, in demo_build_image_ownership_cmd()
740 .dstQueueFamilyIndex = demo->present_queue_family_index, in demo_build_image_ownership_cmd()
741 .image = demo->buffers[i].image, in demo_build_image_ownership_cmd()
744 vkCmdPipelineBarrier(demo->buffers[i].graphics_to_present_cmd, in demo_build_image_ownership_cmd()
748 err = vkEndCommandBuffer(demo->buffers[i].graphics_to_present_cmd); in demo_build_image_ownership_cmd()
752 void demo_update_data_buffer(struct demo *demo) { in demo_update_data_buffer() argument
758 mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix); in demo_update_data_buffer()
761 mat4x4_dup(Model, demo->model_matrix); in demo_update_data_buffer()
762 mat4x4_rotate(demo->model_matrix, Model, 0.0f, 1.0f, 0.0f, in demo_update_data_buffer()
763 (float)degreesToRadians(demo->spin_angle)); in demo_update_data_buffer()
764 mat4x4_mul(MVP, VP, demo->model_matrix); in demo_update_data_buffer()
766 err = vkMapMemory(demo->device, demo->uniform_data.mem, 0, in demo_update_data_buffer()
767 demo->uniform_data.mem_alloc.allocationSize, 0, in demo_update_data_buffer()
773 vkUnmapMemory(demo->device, demo->uniform_data.mem); in demo_update_data_buffer()
776 static void demo_draw(struct demo *demo) { in demo_draw() argument
780 vkWaitForFences(demo->device, 1, &demo->fences[demo->frame_index], VK_TRUE, UINT64_MAX); in demo_draw()
781 vkResetFences(demo->device, 1, &demo->fences[demo->frame_index]); in demo_draw()
784 err = demo->fpAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX, in demo_draw()
785demo->image_acquired_semaphores[demo->frame_index], demo->fences[demo->frame_index], in demo_draw()
786 &demo->current_buffer); in demo_draw()
791 demo->frame_index += 1; in demo_draw()
792 demo->frame_index %= FRAME_LAG; in demo_draw()
794 demo_resize(demo); in demo_draw()
795 demo_draw(demo); in demo_draw()
815 submit_info.pWaitSemaphores = &demo->image_acquired_semaphores[demo->frame_index]; in demo_draw()
817 submit_info.pCommandBuffers = &demo->buffers[demo->current_buffer].cmd; in demo_draw()
819 submit_info.pSignalSemaphores = &demo->draw_complete_semaphores[demo->frame_index]; in demo_draw()
820 err = vkQueueSubmit(demo->graphics_queue, 1, &submit_info, nullFence); in demo_draw()
823 if (demo->separate_present_queue) { in demo_draw()
829 submit_info.pWaitSemaphores = &demo->draw_complete_semaphores[demo->frame_index]; in demo_draw()
832 &demo->buffers[demo->current_buffer].graphics_to_present_cmd; in demo_draw()
834 submit_info.pSignalSemaphores = &demo->image_ownership_semaphores[demo->frame_index]; in demo_draw()
835 err = vkQueueSubmit(demo->present_queue, 1, &submit_info, nullFence); in demo_draw()
845 .pWaitSemaphores = (demo->separate_present_queue) in demo_draw()
846 ? &demo->image_ownership_semaphores[demo->frame_index] in demo_draw()
847 : &demo->draw_complete_semaphores[demo->frame_index], in demo_draw()
849 .pSwapchains = &demo->swapchain, in demo_draw()
850 .pImageIndices = &demo->current_buffer, in demo_draw()
853 err = demo->fpQueuePresentKHR(demo->present_queue, &present); in demo_draw()
854 demo->frame_index += 1; in demo_draw()
855 demo->frame_index %= FRAME_LAG; in demo_draw()
860 demo_resize(demo); in demo_draw()
869 static void demo_prepare_buffers(struct demo *demo) { in demo_prepare_buffers() argument
871 VkSwapchainKHR oldSwapchain = demo->swapchain; in demo_prepare_buffers()
875 err = demo->fpGetPhysicalDeviceSurfaceCapabilitiesKHR( in demo_prepare_buffers()
876 demo->gpu, demo->surface, &surfCapabilities); in demo_prepare_buffers()
880 err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR( in demo_prepare_buffers()
881 demo->gpu, demo->surface, &presentModeCount, NULL); in demo_prepare_buffers()
886 err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR( in demo_prepare_buffers()
887 demo->gpu, demo->surface, &presentModeCount, presentModes); in demo_prepare_buffers()
896 swapchainExtent.width = demo->width; in demo_prepare_buffers()
897 swapchainExtent.height = demo->height; in demo_prepare_buffers()
913 demo->width = surfCapabilities.currentExtent.width; in demo_prepare_buffers()
914 demo->height = surfCapabilities.currentExtent.height; in demo_prepare_buffers()
994 .surface = demo->surface, in demo_prepare_buffers()
996 .imageFormat = demo->format, in demo_prepare_buffers()
997 .imageColorSpace = demo->color_space, in demo_prepare_buffers()
1014 err = demo->fpCreateSwapchainKHR(demo->device, &swapchain_ci, NULL, in demo_prepare_buffers()
1015 &demo->swapchain); in demo_prepare_buffers()
1023 demo->fpDestroySwapchainKHR(demo->device, oldSwapchain, NULL); in demo_prepare_buffers()
1026 err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain, in demo_prepare_buffers()
1027 &demo->swapchainImageCount, NULL); in demo_prepare_buffers()
1031 (VkImage *)malloc(demo->swapchainImageCount * sizeof(VkImage)); in demo_prepare_buffers()
1033 err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain, in demo_prepare_buffers()
1034 &demo->swapchainImageCount, in demo_prepare_buffers()
1038 demo->buffers = (SwapchainBuffers *)malloc(sizeof(SwapchainBuffers) * in demo_prepare_buffers()
1039 demo->swapchainImageCount); in demo_prepare_buffers()
1040 assert(demo->buffers); in demo_prepare_buffers()
1042 for (i = 0; i < demo->swapchainImageCount; i++) { in demo_prepare_buffers()
1046 .format = demo->format, in demo_prepare_buffers()
1063 demo->buffers[i].image = swapchainImages[i]; in demo_prepare_buffers()
1065 color_image_view.image = demo->buffers[i].image; in demo_prepare_buffers()
1067 err = vkCreateImageView(demo->device, &color_image_view, NULL, in demo_prepare_buffers()
1068 &demo->buffers[i].view); in demo_prepare_buffers()
1078 static void demo_prepare_depth(struct demo *demo) { in demo_prepare_depth() argument
1085 .extent = {demo->width, demo->height, 1}, in demo_prepare_depth()
1112 demo->depth.format = depth_format; in demo_prepare_depth()
1115 err = vkCreateImage(demo->device, &image, NULL, &demo->depth.image); in demo_prepare_depth()
1118 vkGetImageMemoryRequirements(demo->device, demo->depth.image, &mem_reqs); in demo_prepare_depth()
1121 demo->depth.mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; in demo_prepare_depth()
1122 demo->depth.mem_alloc.pNext = NULL; in demo_prepare_depth()
1123 demo->depth.mem_alloc.allocationSize = mem_reqs.size; in demo_prepare_depth()
1124 demo->depth.mem_alloc.memoryTypeIndex = 0; in demo_prepare_depth()
1126 pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits, in demo_prepare_depth()
1128 &demo->depth.mem_alloc.memoryTypeIndex); in demo_prepare_depth()
1132 err = vkAllocateMemory(demo->device, &demo->depth.mem_alloc, NULL, in demo_prepare_depth()
1133 &demo->depth.mem); in demo_prepare_depth()
1138 vkBindImageMemory(demo->device, demo->depth.image, demo->depth.mem, 0); in demo_prepare_depth()
1142 view.image = demo->depth.image; in demo_prepare_depth()
1143 err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view); in demo_prepare_depth()
1228 static void demo_prepare_texture_image(struct demo *demo, const char *filename, in demo_prepare_texture_image() argument
1264 vkCreateImage(demo->device, &image_create_info, NULL, &tex_obj->image); in demo_prepare_texture_image()
1267 vkGetImageMemoryRequirements(demo->device, tex_obj->image, &mem_reqs); in demo_prepare_texture_image()
1274 pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits, in demo_prepare_texture_image()
1280 err = vkAllocateMemory(demo->device, &tex_obj->mem_alloc, NULL, in demo_prepare_texture_image()
1285 err = vkBindImageMemory(demo->device, tex_obj->image, tex_obj->mem, 0); in demo_prepare_texture_image()
1297 vkGetImageSubresourceLayout(demo->device, tex_obj->image, &subres, in demo_prepare_texture_image()
1300 err = vkMapMemory(demo->device, tex_obj->mem, 0, in demo_prepare_texture_image()
1308 vkUnmapMemory(demo->device, tex_obj->mem); in demo_prepare_texture_image()
1314 static void demo_destroy_texture_image(struct demo *demo, in demo_destroy_texture_image() argument
1317 vkFreeMemory(demo->device, tex_objs->mem, NULL); in demo_destroy_texture_image()
1318 vkDestroyImage(demo->device, tex_objs->image, NULL); in demo_destroy_texture_image()
1321 static void demo_prepare_textures(struct demo *demo) { in demo_prepare_textures() argument
1326 vkGetPhysicalDeviceFormatProperties(demo->gpu, tex_format, &props); in demo_prepare_textures()
1333 !demo->use_staging_buffer) { in demo_prepare_textures()
1336 demo, tex_files[i], &demo->textures[i], VK_IMAGE_TILING_LINEAR, in demo_prepare_textures()
1342 demo_set_image_layout(demo, demo->textures[i].image, VK_IMAGE_ASPECT_COLOR_BIT, in demo_prepare_textures()
1343 VK_IMAGE_LAYOUT_PREINITIALIZED, demo->textures[i].imageLayout, in demo_prepare_textures()
1353 demo, tex_files[i], &staging_texture, VK_IMAGE_TILING_LINEAR, in demo_prepare_textures()
1359 demo, tex_files[i], &demo->textures[i], VK_IMAGE_TILING_OPTIMAL, in demo_prepare_textures()
1363 demo_set_image_layout(demo, staging_texture.image, in demo_prepare_textures()
1371 demo_set_image_layout(demo, demo->textures[i].image, in demo_prepare_textures()
1388 demo->cmd, staging_texture.image, in demo_prepare_textures()
1389 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, demo->textures[i].image, in demo_prepare_textures()
1392 demo_set_image_layout(demo, demo->textures[i].image, in demo_prepare_textures()
1395 demo->textures[i].imageLayout, in demo_prepare_textures()
1400 demo_flush_init_cmd(demo); in demo_prepare_textures()
1402 demo_destroy_texture_image(demo, &staging_texture); in demo_prepare_textures()
1443 err = vkCreateSampler(demo->device, &sampler, NULL, in demo_prepare_textures()
1444 &demo->textures[i].sampler); in demo_prepare_textures()
1448 view.image = demo->textures[i].image; in demo_prepare_textures()
1449 err = vkCreateImageView(demo->device, &view, NULL, in demo_prepare_textures()
1450 &demo->textures[i].view); in demo_prepare_textures()
1455 void demo_prepare_cube_data_buffer(struct demo *demo) { in demo_prepare_cube_data_buffer() argument
1465 mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix); in demo_prepare_cube_data_buffer()
1466 mat4x4_mul(MVP, VP, demo->model_matrix); in demo_prepare_cube_data_buffer()
1486 vkCreateBuffer(demo->device, &buf_info, NULL, &demo->uniform_data.buf); in demo_prepare_cube_data_buffer()
1489 vkGetBufferMemoryRequirements(demo->device, demo->uniform_data.buf, in demo_prepare_cube_data_buffer()
1492 demo->uniform_data.mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; in demo_prepare_cube_data_buffer()
1493 demo->uniform_data.mem_alloc.pNext = NULL; in demo_prepare_cube_data_buffer()
1494 demo->uniform_data.mem_alloc.allocationSize = mem_reqs.size; in demo_prepare_cube_data_buffer()
1495 demo->uniform_data.mem_alloc.memoryTypeIndex = 0; in demo_prepare_cube_data_buffer()
1498 demo, mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | in demo_prepare_cube_data_buffer()
1500 &demo->uniform_data.mem_alloc.memoryTypeIndex); in demo_prepare_cube_data_buffer()
1503 err = vkAllocateMemory(demo->device, &demo->uniform_data.mem_alloc, NULL, in demo_prepare_cube_data_buffer()
1504 &(demo->uniform_data.mem)); in demo_prepare_cube_data_buffer()
1507 err = vkMapMemory(demo->device, demo->uniform_data.mem, 0, in demo_prepare_cube_data_buffer()
1508 demo->uniform_data.mem_alloc.allocationSize, 0, in demo_prepare_cube_data_buffer()
1514 vkUnmapMemory(demo->device, demo->uniform_data.mem); in demo_prepare_cube_data_buffer()
1516 err = vkBindBufferMemory(demo->device, demo->uniform_data.buf, in demo_prepare_cube_data_buffer()
1517 demo->uniform_data.mem, 0); in demo_prepare_cube_data_buffer()
1520 demo->uniform_data.buffer_info.buffer = demo->uniform_data.buf; in demo_prepare_cube_data_buffer()
1521 demo->uniform_data.buffer_info.offset = 0; in demo_prepare_cube_data_buffer()
1522 demo->uniform_data.buffer_info.range = sizeof(data); in demo_prepare_cube_data_buffer()
1525 static void demo_prepare_descriptor_layout(struct demo *demo) { in demo_prepare_descriptor_layout() argument
1552 err = vkCreateDescriptorSetLayout(demo->device, &descriptor_layout, NULL, in demo_prepare_descriptor_layout()
1553 &demo->desc_layout); in demo_prepare_descriptor_layout()
1560 .pSetLayouts = &demo->desc_layout, in demo_prepare_descriptor_layout()
1563 err = vkCreatePipelineLayout(demo->device, &pPipelineLayoutCreateInfo, NULL, in demo_prepare_descriptor_layout()
1564 &demo->pipeline_layout); in demo_prepare_descriptor_layout()
1568 static void demo_prepare_render_pass(struct demo *demo) { in demo_prepare_render_pass() argument
1580 .format = demo->format, in demo_prepare_render_pass()
1591 .format = demo->depth.format, in demo_prepare_render_pass()
1634 err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass); in demo_prepare_render_pass()
1641 demo_prepare_shader_module(struct demo *demo, const void *code, size_t size) { in demo_prepare_shader_module() argument
1652 err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module); in demo_prepare_shader_module()
1683 static VkShaderModule demo_prepare_vs(struct demo *demo) { in demo_prepare_vs() argument
1691 …VkResult U_ASSERT_ONLY err = vkCreateShaderModule(demo->device, &sh_info, NULL, &demo->vert_shader… in demo_prepare_vs()
1699 demo->vert_shader_module = in demo_prepare_vs()
1700 demo_prepare_shader_module(demo, vertShaderCode, size); in demo_prepare_vs()
1705 return demo->vert_shader_module; in demo_prepare_vs()
1708 static VkShaderModule demo_prepare_fs(struct demo *demo) { in demo_prepare_fs() argument
1716 …VkResult U_ASSERT_ONLY err = vkCreateShaderModule(demo->device, &sh_info, NULL, &demo->frag_shader… in demo_prepare_fs()
1724 demo->frag_shader_module = in demo_prepare_fs()
1725 demo_prepare_shader_module(demo, fragShaderCode, size); in demo_prepare_fs()
1730 return demo->frag_shader_module; in demo_prepare_fs()
1733 static void demo_prepare_pipeline(struct demo *demo) { in demo_prepare_pipeline() argument
1754 pipeline.layout = demo->pipeline_layout; in demo_prepare_pipeline()
1815 shaderStages[0].module = demo_prepare_vs(demo); in demo_prepare_pipeline()
1820 shaderStages[1].module = demo_prepare_fs(demo); in demo_prepare_pipeline()
1826 err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL, in demo_prepare_pipeline()
1827 &demo->pipelineCache); in demo_prepare_pipeline()
1838 pipeline.renderPass = demo->render_pass; in demo_prepare_pipeline()
1841 pipeline.renderPass = demo->render_pass; in demo_prepare_pipeline()
1843 err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1, in demo_prepare_pipeline()
1844 &pipeline, NULL, &demo->pipeline); in demo_prepare_pipeline()
1847 vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL); in demo_prepare_pipeline()
1848 vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL); in demo_prepare_pipeline()
1851 static void demo_prepare_descriptor_pool(struct demo *demo) { in demo_prepare_descriptor_pool() argument
1873 err = vkCreateDescriptorPool(demo->device, &descriptor_pool, NULL, in demo_prepare_descriptor_pool()
1874 &demo->desc_pool); in demo_prepare_descriptor_pool()
1878 static void demo_prepare_descriptor_set(struct demo *demo) { in demo_prepare_descriptor_set() argument
1887 .descriptorPool = demo->desc_pool, in demo_prepare_descriptor_set()
1889 .pSetLayouts = &demo->desc_layout}; in demo_prepare_descriptor_set()
1890 err = vkAllocateDescriptorSets(demo->device, &alloc_info, &demo->desc_set); in demo_prepare_descriptor_set()
1895 tex_descs[i].sampler = demo->textures[i].sampler; in demo_prepare_descriptor_set()
1896 tex_descs[i].imageView = demo->textures[i].view; in demo_prepare_descriptor_set()
1903 writes[0].dstSet = demo->desc_set; in demo_prepare_descriptor_set()
1906 writes[0].pBufferInfo = &demo->uniform_data.buffer_info; in demo_prepare_descriptor_set()
1909 writes[1].dstSet = demo->desc_set; in demo_prepare_descriptor_set()
1915 vkUpdateDescriptorSets(demo->device, 2, writes, 0, NULL); in demo_prepare_descriptor_set()
1918 static void demo_prepare_framebuffers(struct demo *demo) { in demo_prepare_framebuffers() argument
1920 attachments[1] = demo->depth.view; in demo_prepare_framebuffers()
1925 .renderPass = demo->render_pass, in demo_prepare_framebuffers()
1928 .width = demo->width, in demo_prepare_framebuffers()
1929 .height = demo->height, in demo_prepare_framebuffers()
1935 demo->framebuffers = (VkFramebuffer *)malloc(demo->swapchainImageCount * in demo_prepare_framebuffers()
1937 assert(demo->framebuffers); in demo_prepare_framebuffers()
1939 for (i = 0; i < demo->swapchainImageCount; i++) { in demo_prepare_framebuffers()
1940 attachments[0] = demo->buffers[i].view; in demo_prepare_framebuffers()
1941 err = vkCreateFramebuffer(demo->device, &fb_info, NULL, in demo_prepare_framebuffers()
1942 &demo->framebuffers[i]); in demo_prepare_framebuffers()
1947 static void demo_prepare(struct demo *demo) { in demo_prepare() argument
1953 .queueFamilyIndex = demo->graphics_queue_family_index, in demo_prepare()
1956 err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, in demo_prepare()
1957 &demo->cmd_pool); in demo_prepare()
1963 .commandPool = demo->cmd_pool, in demo_prepare()
1968 demo_prepare_buffers(demo); in demo_prepare()
1969 demo_prepare_depth(demo); in demo_prepare()
1970 demo_prepare_textures(demo); in demo_prepare()
1971 demo_prepare_cube_data_buffer(demo); in demo_prepare()
1973 demo_prepare_descriptor_layout(demo); in demo_prepare()
1974 demo_prepare_render_pass(demo); in demo_prepare()
1975 demo_prepare_pipeline(demo); in demo_prepare()
1977 for (uint32_t i = 0; i < demo->swapchainImageCount; i++) { in demo_prepare()
1979 vkAllocateCommandBuffers(demo->device, &cmd, &demo->buffers[i].cmd); in demo_prepare()
1983 if (demo->separate_present_queue) { in demo_prepare()
1987 .queueFamilyIndex = demo->present_queue_family_index, in demo_prepare()
1990 err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, in demo_prepare()
1991 &demo->present_cmd_pool); in demo_prepare()
1996 .commandPool = demo->present_cmd_pool, in demo_prepare()
2000 for (uint32_t i = 0; i < demo->swapchainImageCount; i++) { in demo_prepare()
2002 demo->device, &cmd, &demo->buffers[i].graphics_to_present_cmd); in demo_prepare()
2004 demo_build_image_ownership_cmd(demo, i); in demo_prepare()
2008 demo_prepare_descriptor_pool(demo); in demo_prepare()
2009 demo_prepare_descriptor_set(demo); in demo_prepare()
2011 demo_prepare_framebuffers(demo); in demo_prepare()
2013 for (uint32_t i = 0; i < demo->swapchainImageCount; i++) { in demo_prepare()
2014 demo->current_buffer = i; in demo_prepare()
2015 demo_draw_build_cmd(demo, demo->buffers[i].cmd); in demo_prepare()
2022 demo_flush_init_cmd(demo); in demo_prepare()
2024 demo->current_buffer = 0; in demo_prepare()
2025 demo->prepared = true; in demo_prepare()
2028 static void demo_cleanup(struct demo *demo) { in demo_cleanup() argument
2031 demo->prepared = false; in demo_cleanup()
2032 vkDeviceWaitIdle(demo->device); in demo_cleanup()
2036 vkWaitForFences(demo->device, 1, &demo->fences[i], VK_TRUE, UINT64_MAX); in demo_cleanup()
2037 vkDestroyFence(demo->device, demo->fences[i], NULL); in demo_cleanup()
2038 vkDestroySemaphore(demo->device, demo->image_acquired_semaphores[i], NULL); in demo_cleanup()
2039 vkDestroySemaphore(demo->device, demo->draw_complete_semaphores[i], NULL); in demo_cleanup()
2040 if (demo->separate_present_queue) { in demo_cleanup()
2041 vkDestroySemaphore(demo->device, demo->image_ownership_semaphores[i], NULL); in demo_cleanup()
2045 for (i = 0; i < demo->swapchainImageCount; i++) { in demo_cleanup()
2046 vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL); in demo_cleanup()
2048 free(demo->framebuffers); in demo_cleanup()
2049 vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); in demo_cleanup()
2051 vkDestroyPipeline(demo->device, demo->pipeline, NULL); in demo_cleanup()
2052 vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); in demo_cleanup()
2053 vkDestroyRenderPass(demo->device, demo->render_pass, NULL); in demo_cleanup()
2054 vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); in demo_cleanup()
2055 vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); in demo_cleanup()
2058 vkDestroyImageView(demo->device, demo->textures[i].view, NULL); in demo_cleanup()
2059 vkDestroyImage(demo->device, demo->textures[i].image, NULL); in demo_cleanup()
2060 vkFreeMemory(demo->device, demo->textures[i].mem, NULL); in demo_cleanup()
2061 vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); in demo_cleanup()
2063 demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL); in demo_cleanup()
2065 vkDestroyImageView(demo->device, demo->depth.view, NULL); in demo_cleanup()
2066 vkDestroyImage(demo->device, demo->depth.image, NULL); in demo_cleanup()
2067 vkFreeMemory(demo->device, demo->depth.mem, NULL); in demo_cleanup()
2069 vkDestroyBuffer(demo->device, demo->uniform_data.buf, NULL); in demo_cleanup()
2070 vkFreeMemory(demo->device, demo->uniform_data.mem, NULL); in demo_cleanup()
2072 for (i = 0; i < demo->swapchainImageCount; i++) { in demo_cleanup()
2073 vkDestroyImageView(demo->device, demo->buffers[i].view, NULL); in demo_cleanup()
2074 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, in demo_cleanup()
2075 &demo->buffers[i].cmd); in demo_cleanup()
2077 free(demo->buffers); in demo_cleanup()
2078 free(demo->queue_props); in demo_cleanup()
2079 vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); in demo_cleanup()
2081 if (demo->separate_present_queue) { in demo_cleanup()
2082 vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); in demo_cleanup()
2084 vkDestroyDevice(demo->device, NULL); in demo_cleanup()
2085 if (demo->validate) { in demo_cleanup()
2086 demo->DestroyDebugReportCallback(demo->inst, demo->msg_callback, NULL); in demo_cleanup()
2088 vkDestroySurfaceKHR(demo->inst, demo->surface, NULL); in demo_cleanup()
2089 vkDestroyInstance(demo->inst, NULL); in demo_cleanup()
2092 if (demo->use_xlib) { in demo_cleanup()
2093 XDestroyWindow(demo->display, demo->xlib_window); in demo_cleanup()
2094 XCloseDisplay(demo->display); in demo_cleanup()
2096 xcb_destroy_window(demo->connection, demo->xcb_window); in demo_cleanup()
2097 xcb_disconnect(demo->connection); in demo_cleanup()
2099 free(demo->atom_wm_delete_window); in demo_cleanup()
2101 xcb_destroy_window(demo->connection, demo->xcb_window); in demo_cleanup()
2102 xcb_disconnect(demo->connection); in demo_cleanup()
2103 free(demo->atom_wm_delete_window); in demo_cleanup()
2105 wl_shell_surface_destroy(demo->shell_surface); in demo_cleanup()
2106 wl_surface_destroy(demo->window); in demo_cleanup()
2107 wl_shell_destroy(demo->shell); in demo_cleanup()
2108 wl_compositor_destroy(demo->compositor); in demo_cleanup()
2109 wl_registry_destroy(demo->registry); in demo_cleanup()
2110 wl_display_disconnect(demo->display); in demo_cleanup()
2114 static void demo_resize(struct demo *demo) { in demo_resize() argument
2118 if (!demo->prepared) { in demo_resize()
2125 demo->prepared = false; in demo_resize()
2126 vkDeviceWaitIdle(demo->device); in demo_resize()
2128 for (i = 0; i < demo->swapchainImageCount; i++) { in demo_resize()
2129 vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL); in demo_resize()
2131 free(demo->framebuffers); in demo_resize()
2132 vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); in demo_resize()
2134 vkDestroyPipeline(demo->device, demo->pipeline, NULL); in demo_resize()
2135 vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); in demo_resize()
2136 vkDestroyRenderPass(demo->device, demo->render_pass, NULL); in demo_resize()
2137 vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); in demo_resize()
2138 vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); in demo_resize()
2141 vkDestroyImageView(demo->device, demo->textures[i].view, NULL); in demo_resize()
2142 vkDestroyImage(demo->device, demo->textures[i].image, NULL); in demo_resize()
2143 vkFreeMemory(demo->device, demo->textures[i].mem, NULL); in demo_resize()
2144 vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); in demo_resize()
2147 vkDestroyImageView(demo->device, demo->depth.view, NULL); in demo_resize()
2148 vkDestroyImage(demo->device, demo->depth.image, NULL); in demo_resize()
2149 vkFreeMemory(demo->device, demo->depth.mem, NULL); in demo_resize()
2151 vkDestroyBuffer(demo->device, demo->uniform_data.buf, NULL); in demo_resize()
2152 vkFreeMemory(demo->device, demo->uniform_data.mem, NULL); in demo_resize()
2154 for (i = 0; i < demo->swapchainImageCount; i++) { in demo_resize()
2155 vkDestroyImageView(demo->device, demo->buffers[i].view, NULL); in demo_resize()
2156 vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, in demo_resize()
2157 &demo->buffers[i].cmd); in demo_resize()
2159 vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); in demo_resize()
2160 if (demo->separate_present_queue) { in demo_resize()
2161 vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); in demo_resize()
2163 free(demo->buffers); in demo_resize()
2167 demo_prepare(demo); in demo_resize()
2171 struct demo demo; variable
2174 static void demo_run(struct demo *demo) { in demo_run() argument
2175 if (!demo->prepared) in demo_run()
2178 demo_update_data_buffer(demo); in demo_run()
2179 demo_draw(demo); in demo_run()
2180 demo->curFrame++; in demo_run()
2181 if (demo->frameCount != INT_MAX && demo->curFrame == demo->frameCount) { in demo_run()
2197 demo_run(&demo); in WndProc()
2201 ((MINMAXINFO*)lParam)->ptMinTrackSize = demo.minsize; in WndProc()
2208 demo.width = lParam & 0xffff; in WndProc()
2209 demo.height = (lParam & 0xffff0000) >> 16; in WndProc()
2210 demo_resize(&demo); in WndProc()
2219 static void demo_create_window(struct demo *demo) { in demo_create_window() argument
2228 win_class.hInstance = demo->connection; // hInstance in demo_create_window()
2233 win_class.lpszClassName = demo->name; in demo_create_window()
2243 RECT wr = {0, 0, demo->width, demo->height}; in demo_create_window()
2245 demo->window = CreateWindowEx(0, in demo_create_window()
2246 demo->name, // class name in demo_create_window()
2247 demo->name, // app name in demo_create_window()
2255 demo->connection, // hInstance in demo_create_window()
2257 if (!demo->window) { in demo_create_window()
2264 demo->minsize.x = GetSystemMetrics(SM_CXMINTRACK); in demo_create_window()
2265 demo->minsize.y = GetSystemMetrics(SM_CYMINTRACK)+1; in demo_create_window()
2268 static void demo_create_xlib_window(struct demo *demo) { in demo_create_xlib_window() argument
2270 demo->display = XOpenDisplay(NULL); in demo_create_xlib_window()
2274 vInfoTemplate.screen = DefaultScreen(demo->display); in demo_create_xlib_window()
2275 XVisualInfo *visualInfo = XGetVisualInfo(demo->display, visualMask, in demo_create_xlib_window()
2279 demo->display, RootWindow(demo->display, vInfoTemplate.screen), in demo_create_xlib_window()
2289 demo->xlib_window = XCreateWindow( in demo_create_xlib_window()
2290 demo->display, RootWindow(demo->display, vInfoTemplate.screen), 0, 0, in demo_create_xlib_window()
2291 demo->width, demo->height, 0, visualInfo->depth, InputOutput, in demo_create_xlib_window()
2295 XSelectInput(demo->display, demo->xlib_window, ExposureMask | KeyPressMask); in demo_create_xlib_window()
2296 XMapWindow(demo->display, demo->xlib_window); in demo_create_xlib_window()
2297 XFlush(demo->display); in demo_create_xlib_window()
2298 demo->xlib_wm_delete_window = in demo_create_xlib_window()
2299 XInternAtom(demo->display, "WM_DELETE_WINDOW", False); in demo_create_xlib_window()
2301 static void demo_handle_xlib_event(struct demo *demo, const XEvent *event) { in demo_handle_xlib_event() argument
2304 if ((Atom)event->xclient.data.l[0] == demo->xlib_wm_delete_window) in demo_handle_xlib_event()
2305 demo->quit = true; in demo_handle_xlib_event()
2310 demo->quit = true; in demo_handle_xlib_event()
2313 demo->spin_angle += demo->spin_increment; in demo_handle_xlib_event()
2316 demo->spin_angle -= demo->spin_increment; in demo_handle_xlib_event()
2319 demo->pause = !demo->pause; in demo_handle_xlib_event()
2324 if ((demo->width != event->xconfigure.width) || in demo_handle_xlib_event()
2325 (demo->height != event->xconfigure.height)) { in demo_handle_xlib_event()
2326 demo->width = event->xconfigure.width; in demo_handle_xlib_event()
2327 demo->height = event->xconfigure.height; in demo_handle_xlib_event()
2328 demo_resize(demo); in demo_handle_xlib_event()
2337 static void demo_run_xlib(struct demo *demo) { in demo_run_xlib() argument
2339 while (!demo->quit) { in demo_run_xlib()
2342 if (demo->pause) { in demo_run_xlib()
2343 XNextEvent(demo->display, &event); in demo_run_xlib()
2344 demo_handle_xlib_event(demo, &event); in demo_run_xlib()
2346 while (XPending(demo->display) > 0) { in demo_run_xlib()
2347 XNextEvent(demo->display, &event); in demo_run_xlib()
2348 demo_handle_xlib_event(demo, &event); in demo_run_xlib()
2352 demo_update_data_buffer(demo); in demo_run_xlib()
2353 demo_draw(demo); in demo_run_xlib()
2354 demo->curFrame++; in demo_run_xlib()
2355 if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) in demo_run_xlib()
2356 demo->quit = true; in demo_run_xlib()
2361 static void demo_handle_xcb_event(struct demo *demo, in demo_handle_xcb_event() argument
2370 (*demo->atom_wm_delete_window).atom) { in demo_handle_xcb_event()
2371 demo->quit = true; in demo_handle_xcb_event()
2380 demo->quit = true; in demo_handle_xcb_event()
2383 demo->spin_angle += demo->spin_increment; in demo_handle_xcb_event()
2386 demo->spin_angle -= demo->spin_increment; in demo_handle_xcb_event()
2389 demo->pause = !demo->pause; in demo_handle_xcb_event()
2396 if ((demo->width != cfg->width) || (demo->height != cfg->height)) { in demo_handle_xcb_event()
2397 demo->width = cfg->width; in demo_handle_xcb_event()
2398 demo->height = cfg->height; in demo_handle_xcb_event()
2399 demo_resize(demo); in demo_handle_xcb_event()
2407 static void demo_run_xcb(struct demo *demo) { in demo_run_xcb() argument
2408 xcb_flush(demo->connection); in demo_run_xcb()
2410 while (!demo->quit) { in demo_run_xcb()
2413 if (demo->pause) { in demo_run_xcb()
2414 event = xcb_wait_for_event(demo->connection); in demo_run_xcb()
2416 event = xcb_poll_for_event(demo->connection); in demo_run_xcb()
2418 demo_handle_xcb_event(demo, event); in demo_run_xcb()
2420 event = xcb_poll_for_event(demo->connection); in demo_run_xcb()
2424 demo_update_data_buffer(demo); in demo_run_xcb()
2425 demo_draw(demo); in demo_run_xcb()
2426 demo->curFrame++; in demo_run_xcb()
2427 if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) in demo_run_xcb()
2428 demo->quit = true; in demo_run_xcb()
2432 static void demo_create_xcb_window(struct demo *demo) { in demo_create_xcb_window() argument
2435 demo->xcb_window = xcb_generate_id(demo->connection); in demo_create_xcb_window()
2438 value_list[0] = demo->screen->black_pixel; in demo_create_xcb_window()
2442 xcb_create_window(demo->connection, XCB_COPY_FROM_PARENT, demo->xcb_window, in demo_create_xcb_window()
2443 demo->screen->root, 0, 0, demo->width, demo->height, 0, in demo_create_xcb_window()
2444 XCB_WINDOW_CLASS_INPUT_OUTPUT, demo->screen->root_visual, in demo_create_xcb_window()
2449 xcb_intern_atom(demo->connection, 1, 12, "WM_PROTOCOLS"); in demo_create_xcb_window()
2451 xcb_intern_atom_reply(demo->connection, cookie, 0); in demo_create_xcb_window()
2454 xcb_intern_atom(demo->connection, 0, 16, "WM_DELETE_WINDOW"); in demo_create_xcb_window()
2455 demo->atom_wm_delete_window = in demo_create_xcb_window()
2456 xcb_intern_atom_reply(demo->connection, cookie2, 0); in demo_create_xcb_window()
2458 xcb_change_property(demo->connection, XCB_PROP_MODE_REPLACE, demo->xcb_window, in demo_create_xcb_window()
2460 &(*demo->atom_wm_delete_window).atom); in demo_create_xcb_window()
2463 xcb_map_window(demo->connection, demo->xcb_window); in demo_create_xcb_window()
2468 xcb_configure_window(demo->connection, demo->xcb_window, in demo_create_xcb_window()
2473 static void demo_run(struct demo *demo) { in demo_run() argument
2474 while (!demo->quit) { in demo_run()
2475 demo_update_data_buffer(demo); in demo_run()
2476 demo_draw(demo); in demo_run()
2477 demo->curFrame++; in demo_run()
2478 if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) in demo_run()
2479 demo->quit = true; in demo_run()
2500 static void demo_create_window(struct demo *demo) { in demo_create_window() argument
2501 demo->window = wl_compositor_create_surface(demo->compositor); in demo_create_window()
2502 if (!demo->window) { in demo_create_window()
2508 demo->shell_surface = wl_shell_get_shell_surface(demo->shell, demo->window); in demo_create_window()
2509 if (!demo->shell_surface) { in demo_create_window()
2514 wl_shell_surface_add_listener(demo->shell_surface, &shell_surface_listener, in demo_create_window()
2515 demo); in demo_create_window()
2516 wl_shell_surface_set_toplevel(demo->shell_surface); in demo_create_window()
2517 wl_shell_surface_set_title(demo->shell_surface, APP_SHORT_NAME); in demo_create_window()
2520 static void demo_run(struct demo *demo) { in demo_run() argument
2521 if (!demo->prepared) in demo_run()
2524 demo_update_data_buffer(demo); in demo_run()
2525 demo_draw(demo); in demo_run()
2526 demo->curFrame++; in demo_run()
2553 static void demo_init_vk(struct demo *demo) { in demo_init_vk() argument
2559 demo->enabled_extension_count = 0; in demo_init_vk()
2560 demo->enabled_layer_count = 0; in demo_init_vk()
2575 if (demo->validate) { in demo_init_vk()
2594 demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1); in demo_init_vk()
2595 demo->enabled_layers[0] = "VK_LAYER_LUNARG_standard_validation"; in demo_init_vk()
2600 demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2); in demo_init_vk()
2608 demo->enabled_layers[i] = instance_validation_layers[i]; in demo_init_vk()
2629 memset(demo->extension_names, 0, sizeof(demo->extension_names)); in demo_init_vk()
2645 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2652 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2661 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2669 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2677 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2685 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2691 if (demo->validate) { in demo_init_vk()
2692 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2696 assert(demo->enabled_extension_count < 64); in demo_init_vk()
2747 if (demo->use_xlib && !xlibSurfaceExtFound) { in demo_init_vk()
2770 .enabledLayerCount = demo->enabled_layer_count, in demo_init_vk()
2772 .enabledExtensionCount = demo->enabled_extension_count, in demo_init_vk()
2773 .ppEnabledExtensionNames = (const char *const *)demo->extension_names, in demo_init_vk()
2782 if (demo->validate) { in demo_init_vk()
2785 dbgCreateInfo.pfnCallback = demo->use_break ? BreakCallback : dbgFunc; in demo_init_vk()
2786 dbgCreateInfo.pUserData = demo; in demo_init_vk()
2794 err = vkCreateInstance(&inst_info, NULL, &demo->inst); in demo_init_vk()
2812 err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL); in demo_init_vk()
2817 err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, physical_devices); in demo_init_vk()
2820 demo->gpu = physical_devices[0]; in demo_init_vk()
2833 demo->enabled_extension_count = 0; in demo_init_vk()
2834 memset(demo->extension_names, 0, sizeof(demo->extension_names)); in demo_init_vk()
2836 err = vkEnumerateDeviceExtensionProperties(demo->gpu, NULL, in demo_init_vk()
2844 demo->gpu, NULL, &device_extension_count, device_extensions); in demo_init_vk()
2851 demo->extension_names[demo->enabled_extension_count++] = in demo_init_vk()
2854 assert(demo->enabled_extension_count < 64); in demo_init_vk()
2870 if (demo->validate) { in demo_init_vk()
2871 demo->CreateDebugReportCallback = in demo_init_vk()
2873 demo->inst, "vkCreateDebugReportCallbackEXT"); in demo_init_vk()
2874 demo->DestroyDebugReportCallback = in demo_init_vk()
2876 demo->inst, "vkDestroyDebugReportCallbackEXT"); in demo_init_vk()
2877 if (!demo->CreateDebugReportCallback) { in demo_init_vk()
2882 if (!demo->DestroyDebugReportCallback) { in demo_init_vk()
2887 demo->DebugReportMessage = in demo_init_vk()
2889 demo->inst, "vkDebugReportMessageEXT"); in demo_init_vk()
2890 if (!demo->DebugReportMessage) { in demo_init_vk()
2897 callback = demo->use_break ? BreakCallback : dbgFunc; in demo_init_vk()
2901 dbgCreateInfo.pUserData = demo; in demo_init_vk()
2904 err = demo->CreateDebugReportCallback(demo->inst, &dbgCreateInfo, NULL, in demo_init_vk()
2905 &demo->msg_callback); in demo_init_vk()
2919 vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props); in demo_init_vk()
2922 vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, in demo_init_vk()
2923 &demo->queue_family_count, NULL); in demo_init_vk()
2924 assert(demo->queue_family_count >= 1); in demo_init_vk()
2926 demo->queue_props = (VkQueueFamilyProperties *)malloc( in demo_init_vk()
2927 demo->queue_family_count * sizeof(VkQueueFamilyProperties)); in demo_init_vk()
2929 demo->gpu, &demo->queue_family_count, demo->queue_props); in demo_init_vk()
2935 vkGetPhysicalDeviceFeatures(demo->gpu, &physDevFeatures); in demo_init_vk()
2937 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceSupportKHR); in demo_init_vk()
2938 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceCapabilitiesKHR); in demo_init_vk()
2939 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceFormatsKHR); in demo_init_vk()
2940 GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfacePresentModesKHR); in demo_init_vk()
2941 GET_INSTANCE_PROC_ADDR(demo->inst, GetSwapchainImagesKHR); in demo_init_vk()
2944 static void demo_create_device(struct demo *demo) { in demo_create_device() argument
2950 queues[0].queueFamilyIndex = demo->graphics_queue_family_index; in demo_create_device()
2962 .enabledExtensionCount = demo->enabled_extension_count, in demo_create_device()
2963 .ppEnabledExtensionNames = (const char *const *)demo->extension_names, in demo_create_device()
2967 if (demo->separate_present_queue) { in demo_create_device()
2970 queues[1].queueFamilyIndex = demo->present_queue_family_index; in demo_create_device()
2976 err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device); in demo_create_device()
2980 static void demo_init_vk_swapchain(struct demo *demo) { in demo_init_vk_swapchain() argument
2990 createInfo.hinstance = demo->connection; in demo_init_vk_swapchain()
2991 createInfo.hwnd = demo->window; in demo_init_vk_swapchain()
2994 vkCreateWin32SurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); in demo_init_vk_swapchain()
3000 createInfo.display = demo->display; in demo_init_vk_swapchain()
3001 createInfo.surface = demo->window; in demo_init_vk_swapchain()
3003 err = vkCreateWaylandSurfaceKHR(demo->inst, &createInfo, NULL, in demo_init_vk_swapchain()
3004 &demo->surface); in demo_init_vk_swapchain()
3010 createInfo.window = (ANativeWindow*)(demo->window); in demo_init_vk_swapchain()
3012 err = vkCreateAndroidSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); in demo_init_vk_swapchain()
3014 if (demo->use_xlib) { in demo_init_vk_swapchain()
3020 createInfo.dpy = demo->display; in demo_init_vk_swapchain()
3021 createInfo.window = demo->xlib_window; in demo_init_vk_swapchain()
3023 err = vkCreateXlibSurfaceKHR(demo->inst, &createInfo, NULL, in demo_init_vk_swapchain()
3024 &demo->surface); in demo_init_vk_swapchain()
3033 createInfo.connection = demo->connection; in demo_init_vk_swapchain()
3034 createInfo.window = demo->xcb_window; in demo_init_vk_swapchain()
3036 err = vkCreateXcbSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); in demo_init_vk_swapchain()
3043 (VkBool32 *)malloc(demo->queue_family_count * sizeof(VkBool32)); in demo_init_vk_swapchain()
3044 for (i = 0; i < demo->queue_family_count; i++) { in demo_init_vk_swapchain()
3045 demo->fpGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface, in demo_init_vk_swapchain()
3053 for (i = 0; i < demo->queue_family_count; i++) { in demo_init_vk_swapchain()
3054 if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) { in demo_init_vk_swapchain()
3070 for (i = 0; i < demo->queue_family_count; ++i) { in demo_init_vk_swapchain()
3085 demo->graphics_queue_family_index = graphicsQueueFamilyIndex; in demo_init_vk_swapchain()
3086 demo->present_queue_family_index = presentQueueFamilyIndex; in demo_init_vk_swapchain()
3087 demo->separate_present_queue = in demo_init_vk_swapchain()
3088 (demo->graphics_queue_family_index != demo->present_queue_family_index); in demo_init_vk_swapchain()
3091 demo_create_device(demo); in demo_init_vk_swapchain()
3093 GET_DEVICE_PROC_ADDR(demo->device, CreateSwapchainKHR); in demo_init_vk_swapchain()
3094 GET_DEVICE_PROC_ADDR(demo->device, DestroySwapchainKHR); in demo_init_vk_swapchain()
3095 GET_DEVICE_PROC_ADDR(demo->device, GetSwapchainImagesKHR); in demo_init_vk_swapchain()
3096 GET_DEVICE_PROC_ADDR(demo->device, AcquireNextImageKHR); in demo_init_vk_swapchain()
3097 GET_DEVICE_PROC_ADDR(demo->device, QueuePresentKHR); in demo_init_vk_swapchain()
3099 vkGetDeviceQueue(demo->device, demo->graphics_queue_family_index, 0, in demo_init_vk_swapchain()
3100 &demo->graphics_queue); in demo_init_vk_swapchain()
3102 if (!demo->separate_present_queue) { in demo_init_vk_swapchain()
3103 demo->present_queue = demo->graphics_queue; in demo_init_vk_swapchain()
3105 vkGetDeviceQueue(demo->device, demo->present_queue_family_index, 0, in demo_init_vk_swapchain()
3106 &demo->present_queue); in demo_init_vk_swapchain()
3111 err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface, in demo_init_vk_swapchain()
3116 err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface, in demo_init_vk_swapchain()
3123 demo->format = VK_FORMAT_B8G8R8A8_UNORM; in demo_init_vk_swapchain()
3126 demo->format = surfFormats[0].format; in demo_init_vk_swapchain()
3128 demo->color_space = surfFormats[0].colorSpace; in demo_init_vk_swapchain()
3130 demo->quit = false; in demo_init_vk_swapchain()
3131 demo->curFrame = 0; in demo_init_vk_swapchain()
3149 vkCreateFence(demo->device, &fence_ci, NULL, &demo->fences[i]); in demo_init_vk_swapchain()
3150 err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo, NULL, in demo_init_vk_swapchain()
3151 &demo->image_acquired_semaphores[i]); in demo_init_vk_swapchain()
3154 err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo, NULL, in demo_init_vk_swapchain()
3155 &demo->draw_complete_semaphores[i]); in demo_init_vk_swapchain()
3158 if (demo->separate_present_queue) { in demo_init_vk_swapchain()
3159 err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo, NULL, in demo_init_vk_swapchain()
3160 &demo->image_ownership_semaphores[i]); in demo_init_vk_swapchain()
3164 demo->frame_index = 0; in demo_init_vk_swapchain()
3167 vkGetPhysicalDeviceMemoryProperties(demo->gpu, &demo->memory_properties); in demo_init_vk_swapchain()
3174 struct demo *demo = data; in registry_handle_global() local
3176 demo->compositor = in registry_handle_global()
3181 demo->shell = wl_registry_bind(registry, name, &wl_shell_interface, 1); in registry_handle_global()
3193 static void demo_init_connection(struct demo *demo) { in demo_init_connection() argument
3199 demo->connection = xcb_connect(NULL, &scr); in demo_init_connection()
3200 if (xcb_connection_has_error(demo->connection) > 0) { in demo_init_connection()
3207 setup = xcb_get_setup(demo->connection); in demo_init_connection()
3212 demo->screen = iter.data; in demo_init_connection()
3214 demo->display = wl_display_connect(NULL); in demo_init_connection()
3216 if (demo->display == NULL) { in demo_init_connection()
3223 demo->registry = wl_display_get_registry(demo->display); in demo_init_connection()
3224 wl_registry_add_listener(demo->registry, &registry_listener, demo); in demo_init_connection()
3225 wl_display_dispatch(demo->display); in demo_init_connection()
3229 static void demo_init(struct demo *demo, int argc, char **argv) { in demo_init() argument
3234 memset(demo, 0, sizeof(*demo)); in demo_init()
3235 demo->frameCount = INT32_MAX; in demo_init()
3239 demo->use_staging_buffer = true; in demo_init()
3243 demo->use_break = true; in demo_init()
3247 demo->validate = true; in demo_init()
3252 demo->use_xlib = true; in demo_init()
3256 if (strcmp(argv[i], "--c") == 0 && demo->frameCount == INT32_MAX && in demo_init()
3257 i < argc - 1 && sscanf(argv[i + 1], "%d", &demo->frameCount) == 1 && in demo_init()
3258 demo->frameCount >= 0) { in demo_init()
3263 demo->suppress_popups = true; in demo_init()
3281 if (!demo->use_xlib) in demo_init()
3282 demo_init_connection(demo); in demo_init()
3284 demo_init_vk(demo); in demo_init()
3286 demo->width = 500; in demo_init()
3287 demo->height = 500; in demo_init()
3289 demo->spin_angle = 4.0f; in demo_init()
3290 demo->spin_increment = 0.2f; in demo_init()
3291 demo->pause = false; in demo_init()
3293 mat4x4_perspective(demo->projection_matrix, (float)degreesToRadians(45.0f), in demo_init()
3295 mat4x4_look_at(demo->view_matrix, eye, origin, up); in demo_init()
3296 mat4x4_identity(demo->model_matrix); in demo_init()
3298 demo->projection_matrix[1][1]*=-1; //Flip projection matrix from GL to Vulkan orientation. in demo_init()
3343 demo_init(&demo, argc, argv); in WinMain()
3355 demo.connection = hInstance; in WinMain()
3356 strncpy(demo.name, "cube", APP_NAME_STR_LEN); in WinMain()
3357 demo_create_window(&demo); in WinMain()
3358 demo_init_vk_swapchain(&demo); in WinMain()
3360 demo_prepare(&demo); in WinMain()
3375 RedrawWindow(demo.window, NULL, NULL, RDW_INTERNALPAINT); in WinMain()
3378 demo_cleanup(&demo); in WinMain()
3389 struct demo demo; variable
3409 if (demo.prepared) { in processCommand()
3410 demo_cleanup(&demo); in processCommand()
3425 demo_init(&demo, argc, argv); in processCommand()
3431 demo.window = (void*)app->window; in processCommand()
3432 demo_init_vk_swapchain(&demo); in processCommand()
3433 demo_prepare(&demo); in processCommand()
3459 demo.prepared = false; in android_main()
3473 demo_cleanup(&demo); in android_main()
3478 demo_run(&demo); in android_main()
3485 struct demo demo; in main() local
3487 demo_init(&demo, argc, argv); in main()
3489 if (demo.use_xlib) in main()
3490 demo_create_xlib_window(&demo); in main()
3492 demo_create_xcb_window(&demo); in main()
3494 demo_create_xcb_window(&demo); in main()
3496 demo_create_xlib_window(&demo); in main()
3498 demo_create_window(&demo); in main()
3501 demo_init_vk_swapchain(&demo); in main()
3503 demo_prepare(&demo); in main()
3506 if (demo.use_xlib) in main()
3507 demo_run_xlib(&demo); in main()
3509 demo_run_xcb(&demo); in main()
3511 demo_run_xcb(&demo); in main()
3513 demo_run_xlib(&demo); in main()
3515 demo_run(&demo); in main()
3518 demo_cleanup(&demo); in main()