Skip to content

Commit 7718092

Browse files
committed
Added options for commiting the buffer and presenting
1 parent cf24955 commit 7718092

1 file changed

Lines changed: 126 additions & 0 deletions

File tree

src/command_buffer.cpp

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)