Commit e918de22 by Jamie Madill Committed by Commit Bot

Vulkan: Don't finish on swap.

This will enable the next frame to render while the previous frame's command buffers are executing and rendering is happening. This should speed up the Vulkan perf test. BUG=angleproject:1898 Change-Id: I0820300d7934ef280cf75628239fe40dc96b8242 Reviewed-on: https://chromium-review.googlesource.com/445799 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 82483b93
...@@ -610,30 +610,26 @@ vk::Error RendererVk::submitAndFinishCommandBuffer(const vk::CommandBuffer &comm ...@@ -610,30 +610,26 @@ vk::Error RendererVk::submitAndFinishCommandBuffer(const vk::CommandBuffer &comm
return vk::NoError(); return vk::NoError();
} }
vk::Error RendererVk::waitThenFinishCommandBuffer(const vk::CommandBuffer &commandBuffer, vk::Error RendererVk::submitCommandsWithSync(const vk::CommandBuffer &commandBuffer,
const vk::Semaphore &waitSemaphore) const vk::Semaphore &waitSemaphore,
const vk::Semaphore &signalSemaphore)
{ {
VkCommandBuffer commandBufferHandle = commandBuffer.getHandle();
VkSemaphore waitHandle = waitSemaphore.getHandle();
VkPipelineStageFlags waitStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; VkPipelineStageFlags waitStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
VkSubmitInfo submitInfo; VkSubmitInfo submitInfo;
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submitInfo.pNext = nullptr; submitInfo.pNext = nullptr;
submitInfo.waitSemaphoreCount = 1; submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = &waitHandle; submitInfo.pWaitSemaphores = waitSemaphore.ptr();
submitInfo.pWaitDstStageMask = &waitStageMask; submitInfo.pWaitDstStageMask = &waitStageMask;
submitInfo.commandBufferCount = 1; submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBufferHandle; submitInfo.pCommandBuffers = commandBuffer.ptr();
submitInfo.signalSemaphoreCount = 0; submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = nullptr; submitInfo.pSignalSemaphores = signalSemaphore.ptr();
// TODO(jmadill): Investigate how to properly queue command buffer work. // TODO(jmadill): Investigate how to properly queue command buffer work.
ANGLE_TRY(submit(submitInfo)); ANGLE_TRY(submit(submitInfo));
// Wait indefinitely for the queue to finish.
ANGLE_TRY(finish());
return vk::NoError(); return vk::NoError();
} }
......
...@@ -53,8 +53,9 @@ class RendererVk : angle::NonCopyable ...@@ -53,8 +53,9 @@ class RendererVk : angle::NonCopyable
vk::CommandBuffer *getCommandBuffer(); vk::CommandBuffer *getCommandBuffer();
vk::Error submitCommandBuffer(const vk::CommandBuffer &commandBuffer); vk::Error submitCommandBuffer(const vk::CommandBuffer &commandBuffer);
vk::Error submitAndFinishCommandBuffer(const vk::CommandBuffer &commandBuffer); vk::Error submitAndFinishCommandBuffer(const vk::CommandBuffer &commandBuffer);
vk::Error waitThenFinishCommandBuffer(const vk::CommandBuffer &commandBuffer, vk::Error submitCommandsWithSync(const vk::CommandBuffer &commandBuffer,
const vk::Semaphore &waitSemaphore); const vk::Semaphore &waitSemaphore,
const vk::Semaphore &signalSemaphore);
vk::Error finish(); vk::Error finish();
const gl::Caps &getNativeCaps() const; const gl::Caps &getNativeCaps() const;
......
...@@ -174,7 +174,10 @@ void WindowSurfaceVk::destroy(const DisplayImpl *displayImpl) ...@@ -174,7 +174,10 @@ void WindowSurfaceVk::destroy(const DisplayImpl *displayImpl)
VkDevice device = rendererVk->getDevice(); VkDevice device = rendererVk->getDevice();
VkInstance instance = rendererVk->getInstance(); VkInstance instance = rendererVk->getInstance();
mPresentCompleteSemaphore.destroy(device); rendererVk->finish();
mImageAvailableSemaphore.destroy(device);
mRenderingCompleteSemaphore.destroy(device);
for (auto &imageView : mSwapchainImageViews) for (auto &imageView : mSwapchainImageViews)
{ {
...@@ -404,7 +407,10 @@ vk::Error WindowSurfaceVk::initializeImpl(RendererVk *renderer) ...@@ -404,7 +407,10 @@ vk::Error WindowSurfaceVk::initializeImpl(RendererVk *renderer)
ANGLE_TRY(commandBuffer->end()); ANGLE_TRY(commandBuffer->end());
ANGLE_TRY(renderer->submitAndFinishCommandBuffer(*commandBuffer)); ANGLE_TRY(renderer->submitAndFinishCommandBuffer(*commandBuffer));
// Start by getting the next available swapchain image. ANGLE_TRY(mImageAvailableSemaphore.init(device));
ANGLE_TRY(mRenderingCompleteSemaphore.init(device));
// Get the first available swapchain iamge.
ANGLE_TRY(nextSwapchainImage(renderer)); ANGLE_TRY(nextSwapchainImage(renderer));
return vk::NoError(); return vk::NoError();
...@@ -433,13 +439,14 @@ vk::Error WindowSurfaceVk::swapImpl(RendererVk *renderer) ...@@ -433,13 +439,14 @@ vk::Error WindowSurfaceVk::swapImpl(RendererVk *renderer)
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, currentCB); VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, currentCB);
currentCB->end(); currentCB->end();
ANGLE_TRY(renderer->waitThenFinishCommandBuffer(*currentCB, mPresentCompleteSemaphore)); ANGLE_TRY(renderer->submitCommandsWithSync(*currentCB, mImageAvailableSemaphore,
mRenderingCompleteSemaphore));
VkPresentInfoKHR presentInfo; VkPresentInfoKHR presentInfo;
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
presentInfo.pNext = nullptr; presentInfo.pNext = nullptr;
presentInfo.waitSemaphoreCount = 0; presentInfo.waitSemaphoreCount = 1;
presentInfo.pWaitSemaphores = nullptr; presentInfo.pWaitSemaphores = mRenderingCompleteSemaphore.ptr();
presentInfo.swapchainCount = 1; presentInfo.swapchainCount = 1;
presentInfo.pSwapchains = &mSwapchain; presentInfo.pSwapchains = &mSwapchain;
presentInfo.pImageIndices = &mCurrentSwapchainImageIndex; presentInfo.pImageIndices = &mCurrentSwapchainImageIndex;
...@@ -457,15 +464,10 @@ vk::Error WindowSurfaceVk::nextSwapchainImage(RendererVk *renderer) ...@@ -457,15 +464,10 @@ vk::Error WindowSurfaceVk::nextSwapchainImage(RendererVk *renderer)
{ {
VkDevice device = renderer->getDevice(); VkDevice device = renderer->getDevice();
vk::Semaphore presentComplete;
ANGLE_TRY(presentComplete.init(device));
ANGLE_VK_TRY(vkAcquireNextImageKHR(device, mSwapchain, std::numeric_limits<uint64_t>::max(), ANGLE_VK_TRY(vkAcquireNextImageKHR(device, mSwapchain, std::numeric_limits<uint64_t>::max(),
presentComplete.getHandle(), VK_NULL_HANDLE, mImageAvailableSemaphore.getHandle(), VK_NULL_HANDLE,
&mCurrentSwapchainImageIndex)); &mCurrentSwapchainImageIndex));
mPresentCompleteSemaphore.retain(device, std::move(presentComplete));
// Update RenderTarget pointers. // Update RenderTarget pointers.
mRenderTarget.image = &mSwapchainImages[mCurrentSwapchainImageIndex]; mRenderTarget.image = &mSwapchainImages[mCurrentSwapchainImageIndex];
mRenderTarget.imageView = &mSwapchainImageViews[mCurrentSwapchainImageIndex]; mRenderTarget.imageView = &mSwapchainImageViews[mCurrentSwapchainImageIndex];
......
...@@ -96,7 +96,8 @@ class WindowSurfaceVk : public SurfaceImpl, public ResourceVk ...@@ -96,7 +96,8 @@ class WindowSurfaceVk : public SurfaceImpl, public ResourceVk
VkSwapchainKHR mSwapchain; VkSwapchainKHR mSwapchain;
RenderTargetVk mRenderTarget; RenderTargetVk mRenderTarget;
vk::Semaphore mPresentCompleteSemaphore; vk::Semaphore mImageAvailableSemaphore;
vk::Semaphore mRenderingCompleteSemaphore;
uint32_t mCurrentSwapchainImageIndex; uint32_t mCurrentSwapchainImageIndex;
std::vector<vk::Image> mSwapchainImages; std::vector<vk::Image> mSwapchainImages;
......
...@@ -161,6 +161,8 @@ class WrappedObject : angle::NonCopyable ...@@ -161,6 +161,8 @@ class WrappedObject : angle::NonCopyable
HandleT getHandle() const { return mHandle; } HandleT getHandle() const { return mHandle; }
bool valid() const { return (mHandle != VK_NULL_HANDLE); } bool valid() const { return (mHandle != VK_NULL_HANDLE); }
const HandleT *ptr() const { return &mHandle; }
protected: protected:
WrappedObject() : mHandle(VK_NULL_HANDLE) {} WrappedObject() : mHandle(VK_NULL_HANDLE) {}
WrappedObject(HandleT handle) : mHandle(handle) {} WrappedObject(HandleT handle) : mHandle(handle) {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment