| 196 | } |
| 197 | |
| 198 | void endFrame() |
| 199 | { |
| 200 | commandBuffer->endRenderPass(); |
| 201 | commandBuffer->end(); |
| 202 | |
| 203 | vk::PipelineStageFlags waitDestinationStageMask( vk::PipelineStageFlagBits::eColorAttachmentOutput ); |
| 204 | |
| 205 | auto ias = imageAcquiredSemaphore.get(); |
| 206 | auto comBuf = commandBuffer.get(); |
| 207 | |
| 208 | vk::SubmitInfo submitInfo( ias, waitDestinationStageMask, comBuf ); |
| 209 | graphicsQueue->submit( submitInfo, drawFence.get() ); |
| 210 | |
| 211 | while ( vk::Result::eTimeout == device->waitForFences( drawFence.get(), VK_TRUE, vk::su::FenceTimeout ) ) |
| 212 | ; |
| 213 | |
| 214 | auto swap = swapChain.get(); |
| 215 | vk::Result result = presentQueue->presentKHR( vk::PresentInfoKHR( {}, swap, currentBuffer ) ); |
| 216 | switch ( result ) |
| 217 | { |
| 218 | case vk::Result::eSuccess : break; |
| 219 | case vk::Result::eSuboptimalKHR: std::cout << "vk::Queue::presentKHR returned vk::Result::eSuboptimalKHR !\n"; break; |
| 220 | default : assert( false ); // an unexpected result is returned ! |
| 221 | } |
| 222 | std::this_thread::sleep_for( std::chrono::milliseconds( 1000 ) ); |
| 223 | |
| 224 | /* VULKAN_KEY_END */ |
| 225 | device->waitIdle(); |
| 226 | } |
| 227 | |
| 228 | public: |
| 229 | vk::SharedSwapchainKHR swapChain; // swapchain owns surface, that owns Instance, which should be destroyed last |