public override unsafe void Present()
        {
            var swapChainCopy          = swapChain;
            var currentBufferIndexCopy = currentBufferIndex;
            var presentInfo            = new VkPresentInfoKHR
            {
                sType          = VkStructureType.PresentInfoKHR,
                swapchainCount = 1,
                pSwapchains    = &swapChainCopy,
                pImageIndices  = &currentBufferIndexCopy,
            };

            // Present
            if (vkQueuePresentKHR(GraphicsDevice.NativeCommandQueue, &presentInfo) == VkResult.ErrorOutOfDateKHR)
            {
                // TODO VULKAN
                return;
            }

            // Get next image
            if (vkAcquireNextImageKHR(GraphicsDevice.NativeDevice, swapChain, ulong.MaxValue, GraphicsDevice.GetNextPresentSemaphore(), VkFence.Null, out currentBufferIndex) == VkResult.ErrorOutOfDateKHR)
            {
                // TODO VULKAN
                return;
            }

            // Flip render targets
            backbuffer.SetNativeHandles(swapchainImages[currentBufferIndex].NativeImage, swapchainImages[currentBufferIndex].NativeColorAttachmentView);
        }
        public override unsafe void Present()
        {
            try
            {
                var swapChainCopy          = swapChain;
                var currentBufferIndexCopy = currentBufferIndex;
                var presentInfo            = new PresentInfo
                {
                    StructureType  = StructureType.PresentInfo,
                    SwapchainCount = 1,
                    Swapchains     = new IntPtr(&swapChainCopy),
                    ImageIndices   = new IntPtr(&currentBufferIndexCopy),
                };

                // Present
                GraphicsDevice.NativeCommandQueue.Present(ref presentInfo);

                // Get next image
                currentBufferIndex = GraphicsDevice.NativeDevice.AcquireNextImage(swapChain, ulong.MaxValue, GraphicsDevice.GetNextPresentSemaphore(), Fence.Null);

                // Flip render targets
                backbuffer.SetNativeHandles(swapchainImages[currentBufferIndex].NativeImage, swapchainImages[currentBufferIndex].NativeColorAttachmentView);
            }
            catch (SharpVulkanException e) when(e.Result == Result.ErrorOutOfDate)
            {
                // TODO VULKAN
            }
        }