@@ -1572,6 +1572,60 @@ void CommandBuffer::endPass() {
15721572 }
15731573 state.textureBindingsInitialized = false ;
15741574 state.hasDraw = false ;
1575+ #elif VULKAN
1576+ auto &state = vulkan::commandBufferState (this );
1577+ const auto &contextState = vulkan::contextState (device->context .get ());
1578+
1579+ if (!state.recording ) {
1580+ throw std::runtime_error (
1581+ " Vulkan command buffer is not recording before endPass" );
1582+ }
1583+
1584+ if (!state.rendering ) {
1585+ throw std::runtime_error (
1586+ " Vulkan command buffer is not rendering before endPass" );
1587+ }
1588+
1589+ vkCmdEndRendering (state.commandBuffer );
1590+
1591+ VkImage image = contextState.swapchainImages [state.imageIndex ];
1592+
1593+ VkImageMemoryBarrier2 barrier{};
1594+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 ;
1595+
1596+ barrier.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT ;
1597+
1598+ barrier.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT ;
1599+
1600+ barrier.dstStageMask = VK_PIPELINE_STAGE_2_NONE ;
1601+
1602+ barrier.dstAccessMask = 0 ;
1603+
1604+ barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ;
1605+
1606+ barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ;
1607+
1608+ barrier.image = image;
1609+
1610+ barrier.subresourceRange .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT ;
1611+
1612+ barrier.subresourceRange .baseMipLevel = 0 ;
1613+ barrier.subresourceRange .levelCount = 1 ;
1614+ barrier.subresourceRange .baseArrayLayer = 0 ;
1615+ barrier.subresourceRange .layerCount = 1 ;
1616+
1617+ VkDependencyInfo dependencyInfo{};
1618+ dependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO ;
1619+
1620+ dependencyInfo.imageMemoryBarrierCount = 1 ;
1621+ dependencyInfo.pImageMemoryBarriers = &barrier;
1622+
1623+ vkCmdPipelineBarrier2 (state.commandBuffer , &dependencyInfo);
1624+
1625+ state.rendering = false ;
1626+
1627+ renderPass = nullptr ;
1628+ framebuffer = nullptr ;
15751629#endif
15761630}
15771631
@@ -1631,6 +1685,78 @@ void CommandBuffer::commit() {
16311685 state.autoreleasePool ->release ();
16321686 state.autoreleasePool = nullptr ;
16331687 }
1688+ #elif VULKAN
1689+ auto &state = vulkan::commandBufferState (this );
1690+ const auto &deviceState = vulkan::deviceState (device);
1691+ const auto &contextState = vulkan::contextState (device->context .get ());
1692+
1693+ if (!state.recording ) {
1694+ throw std::runtime_error (
1695+ " Vulkan command buffer is not recording before commit" );
1696+ }
1697+
1698+ if (state.rendering ) {
1699+ throw std::runtime_error (
1700+ " Vulkan command buffer is still rendering before commit" );
1701+ }
1702+
1703+ VULKAN_GUARD (vkEndCommandBuffer (state.commandBuffer ),
1704+ " Failed to end Vulkan command buffer" );
1705+
1706+ state.recording = false ;
1707+
1708+ VkSemaphoreSubmitInfo waitSemaphoreInfo{};
1709+ waitSemaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO ;
1710+ waitSemaphoreInfo.semaphore = state.imageAvailableSemaphore ;
1711+ waitSemaphoreInfo.stageMask =
1712+ VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT ;
1713+
1714+ VkCommandBufferSubmitInfo commandInfo{};
1715+ commandInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO ;
1716+
1717+ commandInfo.commandBuffer = state.commandBuffer ;
1718+
1719+ VkSemaphoreSubmitInfo signalInfo{};
1720+ signalInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO ;
1721+
1722+ signalInfo.semaphore = state.renderFinishedSemaphore ;
1723+
1724+ signalInfo.stageMask = VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT ;
1725+
1726+ VkSubmitInfo2 submitInfo{};
1727+ submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2 ;
1728+
1729+ submitInfo.waitSemaphoreInfoCount = 1 ;
1730+ submitInfo.pWaitSemaphoreInfos = &waitSemaphoreInfo;
1731+
1732+ submitInfo.commandBufferInfoCount = 1 ;
1733+ submitInfo.pCommandBufferInfos = &commandInfo;
1734+
1735+ submitInfo.signalSemaphoreInfoCount = 1 ;
1736+ submitInfo.pSignalSemaphoreInfos = &signalInfo;
1737+
1738+ VULKAN_GUARD (vkQueueSubmit2 (deviceState.graphicsQueue , 1 , &submitInfo,
1739+ state.inFlightFence ),
1740+ " Failed to submit Vulkan command buffer" );
1741+
1742+ VkPresentInfoKHR presentInfo{};
1743+ presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR ;
1744+
1745+ presentInfo.waitSemaphoreCount = 1 ;
1746+ presentInfo.pWaitSemaphores = &state.renderFinishedSemaphore ;
1747+
1748+ presentInfo.swapchainCount = 1 ;
1749+ presentInfo.pSwapchains = &contextState.swapchain ;
1750+
1751+ presentInfo.pImageIndices = &state.imageIndex ;
1752+
1753+ VkResult result = vkQueuePresentKHR (deviceState.presentQueue , &presentInfo);
1754+
1755+ if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR ) {
1756+
1757+ } else if (result != VK_SUCCESS ) {
1758+ throw std::runtime_error (" Failed to present Vulkan swapchain image" );
1759+ }
16341760#endif
16351761}
16361762
0 commit comments