Separate BeginFrame from BeginSurfaceRenderPass

This commit is contained in:
Henrik Rydgard 2017-05-07 11:28:57 +02:00 committed by Henrik Rydgård
parent 499b32e5ec
commit 4407445d50
3 changed files with 14 additions and 2 deletions

View File

@ -215,7 +215,7 @@ void VulkanContext::QueueBeforeSurfaceRender(VkCommandBuffer cmd) {
cmdQueue_.push_back(cmd);
}
VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[2]) {
VkCommandBuffer VulkanContext::BeginFrame() {
FrameData *frame = &frame_[curFrame_];
// Get the index of the next available swapchain image, and a semaphore to block command buffer execution on.
@ -238,7 +238,11 @@ VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[
res = vkBeginCommandBuffer(frame->cmdBuf, &begin);
TransitionFromPresent(frame->cmdBuf, swapChainBuffers[current_buffer].image);
return frame->cmdBuf;
}
VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[2]) {
FrameData *frame = &frame_[curFrame_];
VkRenderPassBeginInfo rp_begin = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO };
rp_begin.renderPass = surface_render_pass_;
rp_begin.framebuffer = framebuffers_[current_buffer];
@ -259,7 +263,10 @@ VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[
void VulkanContext::EndSurfaceRenderPass() {
FrameData *frame = &frame_[curFrame_];
vkCmdEndRenderPass(frame->cmdBuf);
}
void VulkanContext::EndFrame() {
FrameData *frame = &frame_[curFrame_];
TransitionToPresent(frame->cmdBuf, swapChainBuffers[current_buffer].image);
VkResult res = vkEndCommandBuffer(frame->cmdBuf);

View File

@ -263,12 +263,14 @@ public:
return frame_[curFrame_ & 1].cmdBuf;
}
VkCommandBuffer BeginFrame();
// The surface render pass is special because it has to acquire the backbuffer, and may thus "block".
// Use the returned command buffer to enqueue commands that render to the backbuffer.
// To render to other buffers first, you can submit additional commandbuffers using QueueBeforeSurfaceRender(cmd).
VkCommandBuffer BeginSurfaceRenderPass(VkClearValue clear_values[2]);
// May eventually need the ability to break and resume the backbuffer render pass in a few rare cases.
void EndSurfaceRenderPass();
void EndFrame();
void QueueBeforeSurfaceRender(VkCommandBuffer cmd);

View File

@ -732,6 +732,8 @@ VKContext::~VKContext() {
}
void VKContext::Begin(bool clear, uint32_t colorval, float depthVal, int stencilVal) {
cmd_ = vulkan_->BeginFrame();
VkClearValue clearVal[2] = {};
Uint8x4ToFloat4(colorval, clearVal[0].color.float32);
@ -742,7 +744,7 @@ void VKContext::Begin(bool clear, uint32_t colorval, float depthVal, int stencil
clearVal[1].depthStencil.depth = depthVal;
clearVal[1].depthStencil.stencil = stencilVal;
cmd_ = vulkan_->BeginSurfaceRenderPass(clearVal);
vulkan_->BeginSurfaceRenderPass(clearVal);
FrameData *frame = &frame_[frameNum_ & 1];
push_ = frame->pushBuffer;
@ -765,6 +767,7 @@ void VKContext::End() {
// Stop collecting data in the frame's data pushbuffer.
push_->End();
vulkan_->EndSurfaceRenderPass();
vulkan_->EndFrame();
frameNum_++;
cmd_ = nullptr; // will be set on the next begin