| 2441 | } |
| 2442 | |
| 2443 | static void DrawFrame() |
| 2444 | { |
| 2445 | // Begin main command buffer |
| 2446 | size_t cmdBufIndex = (g_NextCommandBufferIndex++) % COMMAND_BUFFER_COUNT; |
| 2447 | VkCommandBuffer hCommandBuffer = g_MainCommandBuffers[cmdBufIndex]; |
| 2448 | VkFence hCommandBufferExecutedFence = g_MainCommandBufferExecutedFences[cmdBufIndex]; |
| 2449 | |
| 2450 | ERR_GUARD_VULKAN( vkWaitForFences(g_hDevice, 1, &hCommandBufferExecutedFence, VK_TRUE, UINT64_MAX) ); |
| 2451 | ERR_GUARD_VULKAN( vkResetFences(g_hDevice, 1, &hCommandBufferExecutedFence) ); |
| 2452 | |
| 2453 | VkCommandBufferBeginInfo commandBufferBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; |
| 2454 | commandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; |
| 2455 | ERR_GUARD_VULKAN( vkBeginCommandBuffer(hCommandBuffer, &commandBufferBeginInfo) ); |
| 2456 | SetDebugUtilsObjectName(VK_OBJECT_TYPE_COMMAND_BUFFER, reinterpret_cast<std::uint64_t>(hCommandBuffer), "hCommandBuffer"); |
| 2457 | |
| 2458 | const VkSemaphore imageAvailableSemaphore = g_hImageAvailableSemaphores[cmdBufIndex]; |
| 2459 | |
| 2460 | // Acquire swapchain image |
| 2461 | uint32_t imageIndex = 0; |
| 2462 | VkResult res = vkAcquireNextImageKHR(g_hDevice, g_hSwapchain, UINT64_MAX, imageAvailableSemaphore, VK_NULL_HANDLE, &imageIndex); |
| 2463 | if(res == VK_ERROR_OUT_OF_DATE_KHR) |
| 2464 | { |
| 2465 | RecreateSwapChain(); |
| 2466 | return; |
| 2467 | } |
| 2468 | else if(res < 0) |
| 2469 | { |
| 2470 | ERR_GUARD_VULKAN(res); |
| 2471 | } |
| 2472 | |
| 2473 | // Record geometry pass |
| 2474 | |
| 2475 | VkClearValue clearValues[2]; |
| 2476 | ZeroMemory(clearValues, sizeof(clearValues)); |
| 2477 | clearValues[0].color.float32[0] = 0.25f; |
| 2478 | clearValues[0].color.float32[1] = 0.25f; |
| 2479 | clearValues[0].color.float32[2] = 0.5f; |
| 2480 | clearValues[0].color.float32[3] = 1.0f; |
| 2481 | clearValues[1].depthStencil.depth = 1.0f; |
| 2482 | |
| 2483 | VkRenderPassBeginInfo renderPassBeginInfo = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO }; |
| 2484 | renderPassBeginInfo.renderPass = g_hRenderPass; |
| 2485 | renderPassBeginInfo.framebuffer = g_Framebuffers[imageIndex]; |
| 2486 | renderPassBeginInfo.renderArea.offset.x = 0; |
| 2487 | renderPassBeginInfo.renderArea.offset.y = 0; |
| 2488 | renderPassBeginInfo.renderArea.extent = g_Extent; |
| 2489 | renderPassBeginInfo.clearValueCount = (uint32_t)_countof(clearValues); |
| 2490 | renderPassBeginInfo.pClearValues = clearValues; |
| 2491 | vkCmdBeginRenderPass(hCommandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); |
| 2492 | |
| 2493 | vkCmdBindPipeline( |
| 2494 | hCommandBuffer, |
| 2495 | VK_PIPELINE_BIND_POINT_GRAPHICS, |
| 2496 | g_hPipeline); |
| 2497 | |
| 2498 | mat4 view = mat4::LookAt( |
| 2499 | vec3(0.f, 0.f, 0.f), |
| 2500 | vec3(0.f, -2.f, 4.f), |
no test coverage detected