Commit 1a4f6e1f by Tobin Ehlis Committed by Commit Bot

Vulkan:Migrate command buffers to pointers

This is an intermediate CL as we move to a worker thread. With the worker thread there will be a pool of more than 2 command buffers so the current command buffers in use on the main thread will be pointers that are assigned from that pool. This CL isolates the command buffers as pointers to make review simpler. Bug: b/154030730 Change-Id: I3fc91222b07d5f3bf60f92a4c01b0910daad7df6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2207812 Commit-Queue: Tobin Ehlis <tobine@google.com> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent 6c4af0c3
...@@ -640,9 +640,6 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk ...@@ -640,9 +640,6 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk
mEmulateSeamfulCubeMapSampling(false), mEmulateSeamfulCubeMapSampling(false),
mUseOldRewriteStructSamplers(false), mUseOldRewriteStructSamplers(false),
mPoolAllocator(kDefaultPoolAllocatorPageSize, 1), mPoolAllocator(kDefaultPoolAllocatorPageSize, 1),
mOutsideRenderPassCommands(false,
renderer->getFeatures().preferAggregateBarrierCalls.enabled),
mRenderPassCommands(true, renderer->getFeatures().preferAggregateBarrierCalls.enabled),
mHasPrimaryCommands(false), mHasPrimaryCommands(false),
mGpuEventsEnabled(false), mGpuEventsEnabled(false),
mGpuClockSync{std::numeric_limits<double>::max(), std::numeric_limits<double>::max()}, mGpuClockSync{std::numeric_limits<double>::max(), std::numeric_limits<double>::max()},
...@@ -861,8 +858,13 @@ angle::Result ContextVk::initialize() ...@@ -861,8 +858,13 @@ angle::Result ContextVk::initialize()
// Push a scope in the pool allocator so we can easily reinitialize on flush. // Push a scope in the pool allocator so we can easily reinitialize on flush.
mPoolAllocator.push(); mPoolAllocator.push();
mOutsideRenderPassCommands.initialize(&mPoolAllocator); mOutsideRenderPassCommands = &mCommandBuffers[0];
mRenderPassCommands.initialize(&mPoolAllocator); mRenderPassCommands = &mCommandBuffers[1];
mOutsideRenderPassCommands->initialize(
&mPoolAllocator, false, mRenderer->getFeatures().preferAggregateBarrierCalls.enabled);
mRenderPassCommands->initialize(&mPoolAllocator, true,
mRenderer->getFeatures().preferAggregateBarrierCalls.enabled);
ANGLE_TRY(startPrimaryCommandBuffer()); ANGLE_TRY(startPrimaryCommandBuffer());
if (mGpuEventsEnabled) if (mGpuEventsEnabled)
...@@ -877,7 +879,7 @@ angle::Result ContextVk::initialize() ...@@ -877,7 +879,7 @@ angle::Result ContextVk::initialize()
mPrimaryBufferCounter++; mPrimaryBufferCounter++;
EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter); EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands.getCommandBuffer(), ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName)); TRACE_EVENT_PHASE_BEGIN, eventName));
} }
...@@ -1059,8 +1061,8 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context, ...@@ -1059,8 +1061,8 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context,
GLsizei vertexCount = 0; GLsizei vertexCount = 0;
GLsizei instanceCount = 1; GLsizei instanceCount = 1;
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, indirectBuffer); vk::PipelineStage::DrawIndirect, indirectBuffer);
ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexCount, instanceCount, ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexCount, instanceCount,
gl::DrawElementsType::InvalidEnum, nullptr, dirtyBitMask, gl::DrawElementsType::InvalidEnum, nullptr, dirtyBitMask,
...@@ -1174,7 +1176,7 @@ angle::Result ContextVk::setupDispatch(const gl::Context *context, ...@@ -1174,7 +1176,7 @@ angle::Result ContextVk::setupDispatch(const gl::Context *context,
// The following ensures prior commands are flushed before we start processing dirty bits. // The following ensures prior commands are flushed before we start processing dirty bits.
ANGLE_TRY(flushOutsideRenderPassCommands()); ANGLE_TRY(flushOutsideRenderPassCommands());
ANGLE_TRY(endRenderPass()); ANGLE_TRY(endRenderPass());
*commandBufferOut = &mOutsideRenderPassCommands.getCommandBuffer(); *commandBufferOut = &mOutsideRenderPassCommands->getCommandBuffer();
if (mProgram && mProgram->dirtyUniforms()) if (mProgram && mProgram->dirtyUniforms())
{ {
...@@ -1251,7 +1253,7 @@ angle::Result ContextVk::handleDirtyGraphicsPipeline(const gl::Context *context, ...@@ -1251,7 +1253,7 @@ angle::Result ContextVk::handleDirtyGraphicsPipeline(const gl::Context *context,
mGraphicsPipelineTransition.reset(); mGraphicsPipelineTransition.reset();
} }
mRenderPassCommands.pauseTransformFeedbackIfStarted(); mRenderPassCommands->pauseTransformFeedbackIfStarted();
commandBuffer->bindGraphicsPipeline(mCurrentGraphicsPipeline->getPipeline()); commandBuffer->bindGraphicsPipeline(mCurrentGraphicsPipeline->getPipeline());
// Update the queue serial for the pipeline object. // Update the queue serial for the pipeline object.
ASSERT(mCurrentGraphicsPipeline && mCurrentGraphicsPipeline->valid()); ASSERT(mCurrentGraphicsPipeline && mCurrentGraphicsPipeline->valid());
...@@ -1342,13 +1344,13 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( ...@@ -1342,13 +1344,13 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
angle::Result ContextVk::handleDirtyGraphicsTextures(const gl::Context *context, angle::Result ContextVk::handleDirtyGraphicsTextures(const gl::Context *context,
vk::CommandBuffer *commandBuffer) vk::CommandBuffer *commandBuffer)
{ {
return handleDirtyTexturesImpl(&mRenderPassCommands); return handleDirtyTexturesImpl(mRenderPassCommands);
} }
angle::Result ContextVk::handleDirtyComputeTextures(const gl::Context *context, angle::Result ContextVk::handleDirtyComputeTextures(const gl::Context *context,
vk::CommandBuffer *commandBuffer) vk::CommandBuffer *commandBuffer)
{ {
return handleDirtyTexturesImpl(&mOutsideRenderPassCommands); return handleDirtyTexturesImpl(mOutsideRenderPassCommands);
} }
angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(const gl::Context *context, angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(const gl::Context *context,
...@@ -1372,8 +1374,8 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(const gl::Context *con ...@@ -1372,8 +1374,8 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(const gl::Context *con
vk::BufferHelper *arrayBuffer = arrayBufferResources[attribIndex]; vk::BufferHelper *arrayBuffer = arrayBufferResources[attribIndex];
if (arrayBuffer) if (arrayBuffer)
{ {
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
vk::PipelineStage::VertexInput, arrayBuffer); vk::PipelineStage::VertexInput, arrayBuffer);
} }
} }
...@@ -1390,8 +1392,8 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(const gl::Context *conte ...@@ -1390,8 +1392,8 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(const gl::Context *conte
mVertexArray->getCurrentElementArrayBufferOffset(), mVertexArray->getCurrentElementArrayBufferOffset(),
getVkIndexType(mCurrentDrawElementsType)); getVkIndexType(mCurrentDrawElementsType));
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDEX_READ_BIT, mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDEX_READ_BIT,
vk::PipelineStage::VertexInput, elementArrayBuffer); vk::PipelineStage::VertexInput, elementArrayBuffer);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1420,13 +1422,13 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( ...@@ -1420,13 +1422,13 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl(
angle::Result ContextVk::handleDirtyGraphicsShaderResources(const gl::Context *context, angle::Result ContextVk::handleDirtyGraphicsShaderResources(const gl::Context *context,
vk::CommandBuffer *commandBuffer) vk::CommandBuffer *commandBuffer)
{ {
return handleDirtyShaderResourcesImpl(context, &mRenderPassCommands); return handleDirtyShaderResourcesImpl(context, mRenderPassCommands);
} }
angle::Result ContextVk::handleDirtyComputeShaderResources(const gl::Context *context, angle::Result ContextVk::handleDirtyComputeShaderResources(const gl::Context *context,
vk::CommandBuffer *commandBuffer) vk::CommandBuffer *commandBuffer)
{ {
return handleDirtyShaderResourcesImpl(context, &mOutsideRenderPassCommands); return handleDirtyShaderResourcesImpl(context, mOutsideRenderPassCommands);
} }
angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation( angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
...@@ -1450,8 +1452,8 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation( ...@@ -1450,8 +1452,8 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
{ {
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex]; vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper); ASSERT(bufferHelper);
mRenderPassCommands.bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT, mRenderPassCommands->bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT,
vk::PipelineStage::VertexShader, bufferHelper); vk::PipelineStage::VertexShader, bufferHelper);
} }
// TODO(http://anglebug.com/3570): Need to update to handle Program Pipelines // TODO(http://anglebug.com/3570): Need to update to handle Program Pipelines
...@@ -1479,9 +1481,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension( ...@@ -1479,9 +1481,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
{ {
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex]; vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper); ASSERT(bufferHelper);
mRenderPassCommands.bufferWrite(&mResourceUseList, mRenderPassCommands->bufferWrite(&mResourceUseList,
VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
vk::PipelineStage::TransformFeedback, bufferHelper); vk::PipelineStage::TransformFeedback, bufferHelper);
} }
const gl::TransformFeedbackBuffersArray<VkBuffer> &bufferHandles = const gl::TransformFeedbackBuffersArray<VkBuffer> &bufferHandles =
...@@ -1518,8 +1520,8 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con ...@@ -1518,8 +1520,8 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con
bool rebindBuffers = transformFeedbackVk->getAndResetBufferRebindState(); bool rebindBuffers = transformFeedbackVk->getAndResetBufferRebindState();
mRenderPassCommands.beginTransformFeedback(bufferCount, counterBufferHandles.data(), mRenderPassCommands->beginTransformFeedback(bufferCount, counterBufferHandles.data(),
rebindBuffers); rebindBuffers);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1528,7 +1530,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackResume( ...@@ -1528,7 +1530,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackResume(
const gl::Context *context, const gl::Context *context,
vk::CommandBuffer *commandBuffer) vk::CommandBuffer *commandBuffer)
{ {
mRenderPassCommands.resumeTransformFeedbackIfStarted(); mRenderPassCommands->resumeTransformFeedbackIfStarted();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1545,7 +1547,7 @@ angle::Result ContextVk::submitFrame(const VkSubmitInfo &submitInfo, ...@@ -1545,7 +1547,7 @@ angle::Result ContextVk::submitFrame(const VkSubmitInfo &submitInfo,
// Update overlay if active. // Update overlay if active.
gl::RunningGraphWidget *renderPassCount = gl::RunningGraphWidget *renderPassCount =
mState.getOverlay()->getRunningGraphWidget(gl::WidgetId::VulkanRenderPassCount); mState.getOverlay()->getRunningGraphWidget(gl::WidgetId::VulkanRenderPassCount);
renderPassCount->add(mRenderPassCommands.getAndResetCounter()); renderPassCount->add(mRenderPassCommands->getAndResetCounter());
renderPassCount->next(); renderPassCount->next();
if (vk::CommandBufferHelper::kEnableCommandStreamDiagnostics) if (vk::CommandBufferHelper::kEnableCommandStreamDiagnostics)
...@@ -1901,8 +1903,8 @@ void ContextVk::clearAllGarbage() ...@@ -1901,8 +1903,8 @@ void ContextVk::clearAllGarbage()
void ContextVk::handleDeviceLost() void ContextVk::handleDeviceLost()
{ {
mOutsideRenderPassCommands.reset(); mOutsideRenderPassCommands->reset();
mRenderPassCommands.reset(); mRenderPassCommands->reset();
mCommandQueue.handleDeviceLost(mRenderer); mCommandQueue.handleDeviceLost(mRenderer);
clearAllGarbage(); clearAllGarbage();
...@@ -2151,8 +2153,8 @@ angle::Result ContextVk::drawArraysIndirect(const gl::Context *context, ...@@ -2151,8 +2153,8 @@ angle::Result ContextVk::drawArraysIndirect(const gl::Context *context,
if (mVertexArray->getStreamingVertexAttribsMask().any()) if (mVertexArray->getStreamingVertexAttribsMask().any())
{ {
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, currentIndirectBuf); vk::PipelineStage::DrawIndirect, currentIndirectBuf);
// We have instanced vertex attributes that need to be emulated for Vulkan. // We have instanced vertex attributes that need to be emulated for Vulkan.
// invalidate any cache and map the buffer so that we can read the indirect data. // invalidate any cache and map the buffer so that we can read the indirect data.
...@@ -2205,8 +2207,8 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context, ...@@ -2205,8 +2207,8 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
if (mVertexArray->getStreamingVertexAttribsMask().any()) if (mVertexArray->getStreamingVertexAttribsMask().any())
{ {
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, currentIndirectBuf); vk::PipelineStage::DrawIndirect, currentIndirectBuf);
// We have instanced vertex attributes that need to be emulated for Vulkan. // We have instanced vertex attributes that need to be emulated for Vulkan.
// invalidate any cache and map the buffer so that we can read the indirect data. // invalidate any cache and map the buffer so that we can read the indirect data.
...@@ -2265,12 +2267,12 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context, ...@@ -2265,12 +2267,12 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle) void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle)
{ {
if (!mRenderPassCommands.started()) if (!mRenderPassCommands->started())
{ {
return; return;
} }
if (framebufferHandle != mRenderPassCommands.getFramebufferHandle()) if (framebufferHandle != mRenderPassCommands->getFramebufferHandle())
{ {
return; return;
} }
...@@ -2288,8 +2290,8 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle) ...@@ -2288,8 +2290,8 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle)
{ {
size_t depthStencilAttachmentIndexVk = mDrawFramebuffer->getDepthStencilAttachmentIndexVk(); size_t depthStencilAttachmentIndexVk = mDrawFramebuffer->getDepthStencilAttachmentIndexVk();
// Change depthstencil attachment storeOp to DONT_CARE // Change depthstencil attachment storeOp to DONT_CARE
mRenderPassCommands.invalidateRenderPassStencilAttachment(depthStencilAttachmentIndexVk); mRenderPassCommands->invalidateRenderPassStencilAttachment(depthStencilAttachmentIndexVk);
mRenderPassCommands.invalidateRenderPassDepthAttachment(depthStencilAttachmentIndexVk); mRenderPassCommands->invalidateRenderPassDepthAttachment(depthStencilAttachmentIndexVk);
// Mark content as invalid so that we will not load them in next renderpass // Mark content as invalid so that we will not load them in next renderpass
depthStencilRenderTarget->invalidateContent(); depthStencilRenderTarget->invalidateContent();
} }
...@@ -2297,7 +2299,7 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle) ...@@ -2297,7 +2299,7 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle)
// Use finalLayout instead of extra barrier for layout change to present // Use finalLayout instead of extra barrier for layout change to present
vk::ImageHelper &image = color0RenderTarget->getImage(); vk::ImageHelper &image = color0RenderTarget->getImage();
image.setCurrentImageLayout(vk::ImageLayout::Present); image.setCurrentImageLayout(vk::ImageLayout::Present);
mRenderPassCommands.updateRenderPassAttachmentFinalLayout(0, image.getCurrentImageLayout()); mRenderPassCommands->updateRenderPassAttachmentFinalLayout(0, image.getCurrentImageLayout());
} }
gl::GraphicsResetStatus ContextVk::getResetStatus() gl::GraphicsResetStatus ContextVk::getResetStatus()
...@@ -2542,9 +2544,9 @@ angle::Result ContextVk::updateScissor(const gl::State &glState) ...@@ -2542,9 +2544,9 @@ angle::Result ContextVk::updateScissor(const gl::State &glState)
// a render pass, the scissor is disabled and a draw call is issued to affect the whole // a render pass, the scissor is disabled and a draw call is issued to affect the whole
// framebuffer. // framebuffer.
gl::Rectangle scissoredRenderArea = framebufferVk->getScissoredRenderArea(this); gl::Rectangle scissoredRenderArea = framebufferVk->getScissoredRenderArea(this);
if (!mRenderPassCommands.empty()) if (!mRenderPassCommands->empty())
{ {
if (!mRenderPassCommands.getRenderArea().encloses(scissoredRenderArea)) if (!mRenderPassCommands->getRenderArea().encloses(scissoredRenderArea))
{ {
ANGLE_TRY(endRenderPass()); ANGLE_TRY(endRenderPass());
} }
...@@ -3236,8 +3238,8 @@ angle::Result ContextVk::dispatchComputeIndirect(const gl::Context *context, GLi ...@@ -3236,8 +3238,8 @@ angle::Result ContextVk::dispatchComputeIndirect(const gl::Context *context, GLi
gl::Buffer *glBuffer = getState().getTargetBuffer(gl::BufferBinding::DispatchIndirect); gl::Buffer *glBuffer = getState().getTargetBuffer(gl::BufferBinding::DispatchIndirect);
vk::BufferHelper &buffer = vk::GetImpl(glBuffer)->getBuffer(); vk::BufferHelper &buffer = vk::GetImpl(glBuffer)->getBuffer();
mOutsideRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, mOutsideRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, &buffer); vk::PipelineStage::DrawIndirect, &buffer);
commandBuffer->dispatchIndirect(buffer.getBuffer(), indirect); commandBuffer->dispatchIndirect(buffer.getBuffer(), indirect);
...@@ -3691,7 +3693,7 @@ bool ContextVk::shouldFlush() ...@@ -3691,7 +3693,7 @@ bool ContextVk::shouldFlush()
bool ContextVk::hasRecordedCommands() bool ContextVk::hasRecordedCommands()
{ {
return !mOutsideRenderPassCommands.empty() || !mRenderPassCommands.empty() || return !mOutsideRenderPassCommands->empty() || !mRenderPassCommands->empty() ||
mHasPrimaryCommands; mHasPrimaryCommands;
} }
...@@ -3718,7 +3720,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore) ...@@ -3718,7 +3720,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore)
memoryBarrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; memoryBarrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
memoryBarrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT; memoryBarrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT;
mOutsideRenderPassCommands.getCommandBuffer().memoryBarrier( mOutsideRenderPassCommands->getCommandBuffer().memoryBarrier(
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_HOST_BIT, &memoryBarrier); VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_HOST_BIT, &memoryBarrier);
mIsAnyHostVisibleBufferWritten = false; mIsAnyHostVisibleBufferWritten = false;
} }
...@@ -3726,7 +3728,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore) ...@@ -3726,7 +3728,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore)
if (mGpuEventsEnabled) if (mGpuEventsEnabled)
{ {
EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter); EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands.getCommandBuffer(), ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_END, eventName)); TRACE_EVENT_PHASE_END, eventName));
} }
ANGLE_TRY(flushOutsideRenderPassCommands()); ANGLE_TRY(flushOutsideRenderPassCommands());
...@@ -3735,8 +3737,8 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore) ...@@ -3735,8 +3737,8 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore)
// Free secondary command pool allocations and restart command buffers with the new page. // Free secondary command pool allocations and restart command buffers with the new page.
mPoolAllocator.pop(); mPoolAllocator.pop();
mPoolAllocator.push(); mPoolAllocator.push();
mOutsideRenderPassCommands.reset(); mOutsideRenderPassCommands->reset();
mRenderPassCommands.reset(); mRenderPassCommands->reset();
Serial serial = getCurrentQueueSerial(); Serial serial = getCurrentQueueSerial();
mResourceUseList.releaseResourceUsesAndUpdateSerials(serial); mResourceUseList.releaseResourceUsesAndUpdateSerials(serial);
...@@ -3759,7 +3761,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore) ...@@ -3759,7 +3761,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore)
if (mGpuEventsEnabled) if (mGpuEventsEnabled)
{ {
EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter); EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands.getCommandBuffer(), ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName)); TRACE_EVENT_PHASE_BEGIN, eventName));
} }
...@@ -4039,7 +4041,7 @@ angle::Result ContextVk::onBufferRead(VkAccessFlags readAccessType, ...@@ -4039,7 +4041,7 @@ angle::Result ContextVk::onBufferRead(VkAccessFlags readAccessType,
ANGLE_TRY(flushOutsideRenderPassCommands()); ANGLE_TRY(flushOutsideRenderPassCommands());
} }
mOutsideRenderPassCommands.bufferRead(&mResourceUseList, readAccessType, readStage, buffer); mOutsideRenderPassCommands->bufferRead(&mResourceUseList, readAccessType, readStage, buffer);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -4057,7 +4059,7 @@ angle::Result ContextVk::onBufferWrite(VkAccessFlags writeAccessType, ...@@ -4057,7 +4059,7 @@ angle::Result ContextVk::onBufferWrite(VkAccessFlags writeAccessType,
ANGLE_TRY(flushOutsideRenderPassCommands()); ANGLE_TRY(flushOutsideRenderPassCommands());
} }
mOutsideRenderPassCommands.bufferWrite(&mResourceUseList, writeAccessType, writeStage, buffer); mOutsideRenderPassCommands->bufferWrite(&mResourceUseList, writeAccessType, writeStage, buffer);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -4123,8 +4125,8 @@ angle::Result ContextVk::flushAndBeginRenderPass( ...@@ -4123,8 +4125,8 @@ angle::Result ContextVk::flushAndBeginRenderPass(
std::swap(rotatedRenderArea.width, rotatedRenderArea.height); std::swap(rotatedRenderArea.width, rotatedRenderArea.height);
} }
mRenderPassCommands.beginRenderPass(framebuffer, rotatedRenderArea, renderPassDesc, mRenderPassCommands->beginRenderPass(framebuffer, rotatedRenderArea, renderPassDesc,
renderPassAttachmentOps, clearValues, commandBufferOut); renderPassAttachmentOps, clearValues, commandBufferOut);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -4154,13 +4156,13 @@ angle::Result ContextVk::startRenderPass(gl::Rectangle renderArea, ...@@ -4154,13 +4156,13 @@ angle::Result ContextVk::startRenderPass(gl::Rectangle renderArea,
angle::Result ContextVk::endRenderPass() angle::Result ContextVk::endRenderPass()
{ {
if (mRenderPassCommands.empty()) if (mRenderPassCommands->empty())
{ {
onRenderPassFinished(); onRenderPassFinished();
return angle::Result::Continue; return angle::Result::Continue;
} }
ASSERT(mOutsideRenderPassCommands.empty()); ASSERT(mOutsideRenderPassCommands->empty());
if (mActiveQueryAnySamples) if (mActiveQueryAnySamples)
{ {
mActiveQueryAnySamples->getQueryHelper()->endOcclusionQuery(this, mRenderPassCommandBuffer); mActiveQueryAnySamples->getQueryHelper()->endOcclusionQuery(this, mRenderPassCommandBuffer);
...@@ -4180,20 +4182,20 @@ angle::Result ContextVk::endRenderPass() ...@@ -4180,20 +4182,20 @@ angle::Result ContextVk::endRenderPass()
mRenderPassCounter++; mRenderPassCounter++;
EventName eventName = GetTraceEventName("RP", mRenderPassCounter); EventName eventName = GetTraceEventName("RP", mRenderPassCounter);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands.getCommandBuffer(), ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName)); TRACE_EVENT_PHASE_BEGIN, eventName));
ANGLE_TRY(flushOutsideRenderPassCommands()); ANGLE_TRY(flushOutsideRenderPassCommands());
} }
mRenderPassCommands.pauseTransformFeedbackIfStarted(); mRenderPassCommands->pauseTransformFeedbackIfStarted();
ANGLE_TRY(mRenderPassCommands.flushToPrimary(this, &mPrimaryCommands)); ANGLE_TRY(mRenderPassCommands->flushToPrimary(this, &mPrimaryCommands));
mHasPrimaryCommands = true; mHasPrimaryCommands = true;
if (mGpuEventsEnabled) if (mGpuEventsEnabled)
{ {
EventName eventName = GetTraceEventName("RP", mRenderPassCounter); EventName eventName = GetTraceEventName("RP", mRenderPassCounter);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands.getCommandBuffer(), ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_END, eventName)); TRACE_EVENT_PHASE_END, eventName));
ANGLE_TRY(flushOutsideRenderPassCommands()); ANGLE_TRY(flushOutsideRenderPassCommands());
} }
...@@ -4205,7 +4207,7 @@ void ContextVk::onRenderPassImageWrite(VkImageAspectFlags aspectFlags, ...@@ -4205,7 +4207,7 @@ void ContextVk::onRenderPassImageWrite(VkImageAspectFlags aspectFlags,
vk::ImageLayout imageLayout, vk::ImageLayout imageLayout,
vk::ImageHelper *image) vk::ImageHelper *image)
{ {
mRenderPassCommands.imageWrite(&mResourceUseList, aspectFlags, imageLayout, image); mRenderPassCommands->imageWrite(&mResourceUseList, aspectFlags, imageLayout, image);
} }
angle::Result ContextVk::syncExternalMemory() angle::Result ContextVk::syncExternalMemory()
...@@ -4288,9 +4290,9 @@ bool ContextVk::shouldConvertUint8VkIndexType(gl::DrawElementsType glIndexType) ...@@ -4288,9 +4290,9 @@ bool ContextVk::shouldConvertUint8VkIndexType(gl::DrawElementsType glIndexType)
angle::Result ContextVk::flushOutsideRenderPassCommands() angle::Result ContextVk::flushOutsideRenderPassCommands()
{ {
if (!mOutsideRenderPassCommands.empty()) if (!mOutsideRenderPassCommands->empty())
{ {
ANGLE_TRY(mOutsideRenderPassCommands.flushToPrimary(this, &mPrimaryCommands)); ANGLE_TRY(mOutsideRenderPassCommands->flushToPrimary(this, &mPrimaryCommands));
mHasPrimaryCommands = true; mHasPrimaryCommands = true;
} }
return angle::Result::Continue; return angle::Result::Continue;
...@@ -4300,7 +4302,7 @@ void ContextVk::beginOcclusionQuery(QueryVk *queryVk) ...@@ -4300,7 +4302,7 @@ void ContextVk::beginOcclusionQuery(QueryVk *queryVk)
{ {
// To avoid complexity, we always start and end occlusion query inside renderpass. if renderpass // To avoid complexity, we always start and end occlusion query inside renderpass. if renderpass
// not yet started, we just remember it and defer the start call. // not yet started, we just remember it and defer the start call.
if (mRenderPassCommands.started()) if (mRenderPassCommands->started())
{ {
queryVk->getQueryHelper()->beginOcclusionQuery(this, mRenderPassCommandBuffer); queryVk->getQueryHelper()->beginOcclusionQuery(this, mRenderPassCommandBuffer);
} }
...@@ -4322,7 +4324,7 @@ void ContextVk::beginOcclusionQuery(QueryVk *queryVk) ...@@ -4322,7 +4324,7 @@ void ContextVk::beginOcclusionQuery(QueryVk *queryVk)
void ContextVk::endOcclusionQuery(QueryVk *queryVk) void ContextVk::endOcclusionQuery(QueryVk *queryVk)
{ {
if (mRenderPassCommands.started()) if (mRenderPassCommands->started())
{ {
queryVk->getQueryHelper()->endOcclusionQuery(this, mRenderPassCommandBuffer); queryVk->getQueryHelper()->endOcclusionQuery(this, mRenderPassCommandBuffer);
} }
......
...@@ -477,9 +477,9 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -477,9 +477,9 @@ class ContextVk : public ContextImpl, public vk::Context
angle::Result endRenderPassAndGetCommandBuffer(vk::CommandBuffer **commandBufferOut) angle::Result endRenderPassAndGetCommandBuffer(vk::CommandBuffer **commandBufferOut)
{ {
// Only one command buffer should be active at a time // Only one command buffer should be active at a time
ASSERT(mOutsideRenderPassCommands.empty() || mRenderPassCommands.empty()); ASSERT(mOutsideRenderPassCommands->empty() || mRenderPassCommands->empty());
ANGLE_TRY(endRenderPass()); ANGLE_TRY(endRenderPass());
*commandBufferOut = &mOutsideRenderPassCommands.getCommandBuffer(); *commandBufferOut = &mOutsideRenderPassCommands->getCommandBuffer();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -490,12 +490,12 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -490,12 +490,12 @@ class ContextVk : public ContextImpl, public vk::Context
const vk::ClearValuesArray &clearValues, const vk::ClearValuesArray &clearValues,
vk::CommandBuffer **commandBufferOut); vk::CommandBuffer **commandBufferOut);
bool hasStartedRenderPass() const { return !mRenderPassCommands.empty(); } bool hasStartedRenderPass() const { return !mRenderPassCommands->empty(); }
vk::CommandBufferHelper &getStartedRenderPassCommands() vk::CommandBufferHelper &getStartedRenderPassCommands()
{ {
ASSERT(hasStartedRenderPass()); ASSERT(hasStartedRenderPass());
return mRenderPassCommands; return *mRenderPassCommands;
} }
egl::ContextPriority getContextPriority() const override { return mContextPriority; } egl::ContextPriority getContextPriority() const override { return mContextPriority; }
...@@ -909,8 +909,14 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -909,8 +909,14 @@ class ContextVk : public ContextImpl, public vk::Context
// When the command graph is disabled we record commands completely linearly. We have plans to // When the command graph is disabled we record commands completely linearly. We have plans to
// reorder independent draws so that we can create fewer RenderPasses in some scenarios. // reorder independent draws so that we can create fewer RenderPasses in some scenarios.
vk::CommandBufferHelper mOutsideRenderPassCommands; // Currently we just point the inside/outside RenderPass command buffers to respective fixed
vk::CommandBufferHelper mRenderPassCommands; // command buffers in the mCommandBuffers array. In the near future when we move to a worker
// thread there will a larger pool of command buffers and command buffer pointers will be
// assigned from a queue based on availability.
constexpr static size_t kNumCommandBuffers = 2;
std::array<vk::CommandBufferHelper, kNumCommandBuffers> mCommandBuffers;
vk::CommandBufferHelper *mOutsideRenderPassCommands;
vk::CommandBufferHelper *mRenderPassCommands;
vk::PrimaryCommandBuffer mPrimaryCommands; vk::PrimaryCommandBuffer mPrimaryCommands;
bool mHasPrimaryCommands; bool mHasPrimaryCommands;
......
...@@ -511,7 +511,7 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(ImageLayout imageLayout) ...@@ -511,7 +511,7 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(ImageLayout imageLayout)
} }
// CommandBufferHelper implementation. // CommandBufferHelper implementation.
CommandBufferHelper::CommandBufferHelper(bool hasRenderPass, bool mergeBarriers) CommandBufferHelper::CommandBufferHelper()
: mPipelineBarriers(), : mPipelineBarriers(),
mPipelineBarrierMask(), mPipelineBarrierMask(),
mCounter(0), mCounter(0),
...@@ -520,8 +520,8 @@ CommandBufferHelper::CommandBufferHelper(bool hasRenderPass, bool mergeBarriers) ...@@ -520,8 +520,8 @@ CommandBufferHelper::CommandBufferHelper(bool hasRenderPass, bool mergeBarriers)
mTransformFeedbackCounterBuffers{}, mTransformFeedbackCounterBuffers{},
mValidTransformFeedbackBufferCount(0), mValidTransformFeedbackBufferCount(0),
mRebindTransformFeedbackBuffers(false), mRebindTransformFeedbackBuffers(false),
mIsRenderPassCommandBuffer(hasRenderPass), mIsRenderPassCommandBuffer(false),
mMergeBarriers(mergeBarriers) mMergeBarriers(false)
{} {}
CommandBufferHelper::~CommandBufferHelper() CommandBufferHelper::~CommandBufferHelper()
...@@ -529,9 +529,13 @@ CommandBufferHelper::~CommandBufferHelper() ...@@ -529,9 +529,13 @@ CommandBufferHelper::~CommandBufferHelper()
mFramebuffer.setHandle(VK_NULL_HANDLE); mFramebuffer.setHandle(VK_NULL_HANDLE);
} }
void CommandBufferHelper::initialize(angle::PoolAllocator *poolAllocator) void CommandBufferHelper::initialize(angle::PoolAllocator *poolAllocator,
bool isRenderPassCommandBuffer,
bool mergeBarriers)
{ {
mCommandBuffer.initialize(poolAllocator); mCommandBuffer.initialize(poolAllocator);
mIsRenderPassCommandBuffer = isRenderPassCommandBuffer;
mMergeBarriers = mergeBarriers;
} }
void CommandBufferHelper::bufferRead(vk::ResourceUseList *resourceUseList, void CommandBufferHelper::bufferRead(vk::ResourceUseList *resourceUseList,
......
...@@ -824,11 +824,13 @@ class BufferHelper final : public Resource ...@@ -824,11 +824,13 @@ class BufferHelper final : public Resource
struct CommandBufferHelper : angle::NonCopyable struct CommandBufferHelper : angle::NonCopyable
{ {
public: public:
CommandBufferHelper(bool canHaveRenderPass, bool mergeBarriers); CommandBufferHelper();
~CommandBufferHelper(); ~CommandBufferHelper();
// General Functions (non-renderPass specific) // General Functions (non-renderPass specific)
void initialize(angle::PoolAllocator *poolAllocator); void initialize(angle::PoolAllocator *poolAllocator,
bool canHaveRenderPass,
bool mergeBarriers);
void bufferRead(vk::ResourceUseList *resourceUseList, void bufferRead(vk::ResourceUseList *resourceUseList,
VkAccessFlags readAccessType, VkAccessFlags readAccessType,
...@@ -950,8 +952,8 @@ struct CommandBufferHelper : angle::NonCopyable ...@@ -950,8 +952,8 @@ struct CommandBufferHelper : angle::NonCopyable
uint32_t mValidTransformFeedbackBufferCount; uint32_t mValidTransformFeedbackBufferCount;
bool mRebindTransformFeedbackBuffers; bool mRebindTransformFeedbackBuffers;
const bool mIsRenderPassCommandBuffer; bool mIsRenderPassCommandBuffer;
const bool mMergeBarriers; bool mMergeBarriers;
}; };
// Imagine an image going through a few layout transitions: // Imagine an image going through a few layout transitions:
......
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