----------------------------------------------------------------------------- Purpose: -----------------------------------------------------------------------------
| 1693 | // Purpose: |
| 1694 | //----------------------------------------------------------------------------- |
| 1695 | void CMainApplication::RenderFrame() |
| 1696 | { |
| 1697 | if ( m_pHMD ) |
| 1698 | { |
| 1699 | m_currentCommandBuffer = GetCommandBuffer(); |
| 1700 | |
| 1701 | // Start the command buffer |
| 1702 | VkCommandBufferBeginInfo commandBufferBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; |
| 1703 | commandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; |
| 1704 | vkBeginCommandBuffer( m_currentCommandBuffer.m_pCommandBuffer, &commandBufferBeginInfo ); |
| 1705 | |
| 1706 | UpdateControllerAxes(); |
| 1707 | RenderStereoTargets(); |
| 1708 | RenderCompanionWindow(); |
| 1709 | |
| 1710 | // End the command buffer |
| 1711 | vkEndCommandBuffer( m_currentCommandBuffer.m_pCommandBuffer ); |
| 1712 | |
| 1713 | // Submit the command buffer |
| 1714 | VkPipelineStageFlags nWaitDstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| 1715 | VkSubmitInfo submitInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO }; |
| 1716 | submitInfo.commandBufferCount = 1; |
| 1717 | submitInfo.pCommandBuffers = &m_currentCommandBuffer.m_pCommandBuffer; |
| 1718 | submitInfo.waitSemaphoreCount = 1; |
| 1719 | submitInfo.pWaitSemaphores = &m_pSwapchainSemaphores[ m_nFrameIndex ]; |
| 1720 | submitInfo.pWaitDstStageMask = &nWaitDstStageMask; |
| 1721 | vkQueueSubmit( m_pQueue, 1, &submitInfo, m_currentCommandBuffer.m_pFence ); |
| 1722 | |
| 1723 | // Add the command buffer back for later recycling |
| 1724 | m_commandBuffers.push_front( m_currentCommandBuffer ); |
| 1725 | |
| 1726 | m_currentCommandBuffer.m_pCommandBuffer = VK_NULL_HANDLE; |
| 1727 | m_currentCommandBuffer.m_pFence = VK_NULL_HANDLE; |
| 1728 | |
| 1729 | // Submit to SteamVR |
| 1730 | vr::VRTextureBounds_t bounds; |
| 1731 | bounds.uMin = 0.0f; |
| 1732 | bounds.uMax = 1.0f; |
| 1733 | bounds.vMin = 0.0f; |
| 1734 | bounds.vMax = 1.0f; |
| 1735 | |
| 1736 | vr::VRVulkanTextureData_t vulkanData; |
| 1737 | vulkanData.m_nImage = ( uint64_t ) m_leftEyeDesc.m_pImage; |
| 1738 | vulkanData.m_pDevice = ( VkDevice_T * ) m_pDevice; |
| 1739 | vulkanData.m_pPhysicalDevice = ( VkPhysicalDevice_T * ) m_pPhysicalDevice; |
| 1740 | vulkanData.m_pInstance = ( VkInstance_T *) m_pInstance; |
| 1741 | vulkanData.m_pQueue = ( VkQueue_T * ) m_pQueue; |
| 1742 | vulkanData.m_nQueueFamilyIndex = m_nQueueFamilyIndex; |
| 1743 | |
| 1744 | vulkanData.m_nWidth = m_nRenderWidth; |
| 1745 | vulkanData.m_nHeight = m_nRenderHeight; |
| 1746 | vulkanData.m_nFormat = VK_FORMAT_R8G8B8A8_SRGB; |
| 1747 | vulkanData.m_nSampleCount = m_nMSAASampleCount; |
| 1748 | |
| 1749 | vr::Texture_t texture = { &vulkanData, vr::TextureType_Vulkan, vr::ColorSpace_Auto }; |
| 1750 | vr::VRCompositor()->Submit( vr::Eye_Left, &texture, &bounds ); |
| 1751 | |
| 1752 | vulkanData.m_nImage = ( uint64_t ) m_rightEyeDesc.m_pImage; |