Commit eb85c021 by Jamie Madill Committed by Commit Bot

Vulkan: Refactor Context CommandBuffer query.

getOutsideRenderPassCommandBuffer returns the command buffer directly since it's now stateless and cannot throw an error. All the RenderPass begin/end and flushing are done by the dependency functions (buffer/ image read/write). Bug: angleproject:4911 Change-Id: I5e7806be9d0e1b5e358524bd485298d660fac942 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2339544 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com>
parent d201ed8b
...@@ -274,8 +274,6 @@ angle::Result BufferVk::copySubData(const gl::Context *context, ...@@ -274,8 +274,6 @@ angle::Result BufferVk::copySubData(const gl::Context *context,
sourceBuffer.unmap(contextVk->getRenderer()); sourceBuffer.unmap(contextVk->getRenderer());
} }
vk::CommandBuffer *commandBuffer = nullptr;
// Check for self-dependency. // Check for self-dependency.
if (sourceBuffer.getBufferSerial() == mBuffer->getBufferSerial()) if (sourceBuffer.getBufferSerial() == mBuffer->getBufferSerial())
{ {
...@@ -286,14 +284,15 @@ angle::Result BufferVk::copySubData(const gl::Context *context, ...@@ -286,14 +284,15 @@ angle::Result BufferVk::copySubData(const gl::Context *context,
ANGLE_TRY(contextVk->onBufferTransferRead(&sourceBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(&sourceBuffer));
ANGLE_TRY(contextVk->onBufferTransferWrite(mBuffer)); ANGLE_TRY(contextVk->onBufferTransferWrite(mBuffer));
} }
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
// Enqueue a copy command on the GPU. // Enqueue a copy command on the GPU.
const VkBufferCopy copyRegion = {static_cast<VkDeviceSize>(sourceOffset), const VkBufferCopy copyRegion = {static_cast<VkDeviceSize>(sourceOffset),
static_cast<VkDeviceSize>(destOffset), static_cast<VkDeviceSize>(destOffset),
static_cast<VkDeviceSize>(size)}; static_cast<VkDeviceSize>(size)};
commandBuffer->copyBuffer(sourceBuffer.getBuffer(), mBuffer->getBuffer(), 1, &copyRegion); commandBuffer.copyBuffer(sourceBuffer.getBuffer(), mBuffer->getBuffer(), 1, &copyRegion);
// The new destination buffer data may require a conversion for the next draw, so mark it dirty. // The new destination buffer data may require a conversion for the next draw, so mark it dirty.
onDataChanged(); onDataChanged();
...@@ -598,12 +597,13 @@ angle::Result BufferVk::copyToBufferImpl(ContextVk *contextVk, ...@@ -598,12 +597,13 @@ angle::Result BufferVk::copyToBufferImpl(ContextVk *contextVk,
uint32_t copyCount, uint32_t copyCount,
const VkBufferCopy *copies) const VkBufferCopy *copies)
{ {
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onBufferTransferWrite(destBuffer)); ANGLE_TRY(contextVk->onBufferTransferWrite(destBuffer));
ANGLE_TRY(contextVk->onBufferTransferRead(mBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(mBuffer));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
commandBuffer->copyBuffer(mBuffer->getBuffer(), destBuffer->getBuffer(), copyCount, copies); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer.copyBuffer(mBuffer->getBuffer(), destBuffer->getBuffer(), copyCount, copies);
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -2481,12 +2481,9 @@ angle::Result ContextVk::insertEventMarker(GLsizei length, const char *marker) ...@@ -2481,12 +2481,9 @@ angle::Result ContextVk::insertEventMarker(GLsizei length, const char *marker)
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer));
VkDebugUtilsLabelEXT label; VkDebugUtilsLabelEXT label;
vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label); vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label);
outsideRenderPassCommandBuffer->insertDebugUtilsLabelEXT(label); mOutsideRenderPassCommands->getCommandBuffer().insertDebugUtilsLabelEXT(label);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2496,12 +2493,9 @@ angle::Result ContextVk::pushGroupMarker(GLsizei length, const char *marker) ...@@ -2496,12 +2493,9 @@ angle::Result ContextVk::pushGroupMarker(GLsizei length, const char *marker)
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer));
VkDebugUtilsLabelEXT label; VkDebugUtilsLabelEXT label;
vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label); vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label);
outsideRenderPassCommandBuffer->beginDebugUtilsLabelEXT(label); mOutsideRenderPassCommands->getCommandBuffer().beginDebugUtilsLabelEXT(label);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2511,9 +2505,7 @@ angle::Result ContextVk::popGroupMarker() ...@@ -2511,9 +2505,7 @@ angle::Result ContextVk::popGroupMarker()
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::CommandBuffer *outsideRenderPassCommandBuffer; mOutsideRenderPassCommands->getCommandBuffer().endDebugUtilsLabelEXT();
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer));
outsideRenderPassCommandBuffer->endDebugUtilsLabelEXT();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2526,12 +2518,9 @@ angle::Result ContextVk::pushDebugGroup(const gl::Context *context, ...@@ -2526,12 +2518,9 @@ angle::Result ContextVk::pushDebugGroup(const gl::Context *context,
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer));
VkDebugUtilsLabelEXT label; VkDebugUtilsLabelEXT label;
vk::MakeDebugUtilsLabel(source, message.c_str(), &label); vk::MakeDebugUtilsLabel(source, message.c_str(), &label);
outsideRenderPassCommandBuffer->beginDebugUtilsLabelEXT(label); mOutsideRenderPassCommands->getCommandBuffer().beginDebugUtilsLabelEXT(label);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2541,9 +2530,7 @@ angle::Result ContextVk::popDebugGroup(const gl::Context *context) ...@@ -2541,9 +2530,7 @@ angle::Result ContextVk::popDebugGroup(const gl::Context *context)
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::CommandBuffer *outsideRenderPassCommandBuffer; mOutsideRenderPassCommands->getCommandBuffer().endDebugUtilsLabelEXT();
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer));
outsideRenderPassCommandBuffer->endDebugUtilsLabelEXT();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -4379,9 +4366,8 @@ angle::Result ContextVk::onImageRead(VkImageAspectFlags aspectFlags, ...@@ -4379,9 +4366,8 @@ angle::Result ContextVk::onImageRead(VkImageAspectFlags aspectFlags,
if (image->isLayoutChangeNecessary(imageLayout)) if (image->isLayoutChangeNecessary(imageLayout))
{ {
vk::CommandBuffer *commandBuffer; image->changeLayout(aspectFlags, imageLayout,
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&commandBuffer)); &mOutsideRenderPassCommands->getCommandBuffer());
image->changeLayout(aspectFlags, imageLayout, commandBuffer);
} }
image->retain(&mResourceUseList); image->retain(&mResourceUseList);
return angle::Result::Continue; return angle::Result::Continue;
...@@ -4399,10 +4385,7 @@ angle::Result ContextVk::onImageWrite(VkImageAspectFlags aspectFlags, ...@@ -4399,10 +4385,7 @@ angle::Result ContextVk::onImageWrite(VkImageAspectFlags aspectFlags,
ANGLE_TRY(endRenderPassIfImageUsed(*image)); ANGLE_TRY(endRenderPassIfImageUsed(*image));
vk::CommandBuffer *commandBuffer; image->changeLayout(aspectFlags, imageLayout, &mOutsideRenderPassCommands->getCommandBuffer());
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&commandBuffer));
image->changeLayout(aspectFlags, imageLayout, commandBuffer);
image->retain(&mResourceUseList); image->retain(&mResourceUseList);
image->onWrite(); image->onWrite();
...@@ -4564,16 +4547,13 @@ void ContextVk::recycleCommandBuffer(vk::CommandBufferHelper *commandBuffer) ...@@ -4564,16 +4547,13 @@ void ContextVk::recycleCommandBuffer(vk::CommandBufferHelper *commandBuffer)
angle::Result ContextVk::syncExternalMemory() angle::Result ContextVk::syncExternalMemory()
{ {
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(getOutsideRenderPassCommandBuffer(&commandBuffer));
VkMemoryBarrier memoryBarrier = {}; VkMemoryBarrier memoryBarrier = {};
memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
memoryBarrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; memoryBarrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
memoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; memoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
commandBuffer->memoryBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, mOutsideRenderPassCommands->getCommandBuffer().memoryBarrier(
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, &memoryBarrier); VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, &memoryBarrier);
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -537,10 +537,9 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -537,10 +537,9 @@ class ContextVk : public ContextImpl, public vk::Context
vk::AliasingMode::Allowed, image); vk::AliasingMode::Allowed, image);
} }
angle::Result getOutsideRenderPassCommandBuffer(vk::CommandBuffer **commandBufferOut) vk::CommandBuffer &getOutsideRenderPassCommandBuffer()
{ {
*commandBufferOut = &mOutsideRenderPassCommands->getCommandBuffer(); return mOutsideRenderPassCommands->getCommandBuffer();
return angle::Result::Continue;
} }
angle::Result beginNewRenderPass(const vk::Framebuffer &framebuffer, angle::Result beginNewRenderPass(const vk::Framebuffer &framebuffer,
......
...@@ -418,9 +418,8 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context, ...@@ -418,9 +418,8 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context,
RenderTargetVk *depthStencilRT = mRenderTargetCache.getDepthStencil(true); RenderTargetVk *depthStencilRT = mRenderTargetCache.getDepthStencil(true);
vk::ImageHelper *image = &depthStencilRT->getImageForWrite(); vk::ImageHelper *image = &depthStencilRT->getImageForWrite();
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onImageTransferWrite(image->getAspectFlags(), image)); ANGLE_TRY(contextVk->onImageTransferWrite(image->getAspectFlags(), image));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkImageSubresourceRange range; VkImageSubresourceRange range;
range.aspectMask = image->getAspectFlags(); range.aspectMask = image->getAspectFlags();
...@@ -429,9 +428,9 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context, ...@@ -429,9 +428,9 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context,
range.baseArrayLayer = depthStencilRT->getLayerIndex(); range.baseArrayLayer = depthStencilRT->getLayerIndex();
range.layerCount = 1; range.layerCount = 1;
commandBuffer->clearDepthStencilImage(image->getImage(), commandBuffer.clearDepthStencilImage(image->getImage(),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
clearDepthStencilValue, 1, &range); clearDepthStencilValue, 1, &range);
clearDepth = false; clearDepth = false;
clearStencil = false; clearStencil = false;
} }
...@@ -784,10 +783,9 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk, ...@@ -784,10 +783,9 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
blitAspectMask &= ~VK_IMAGE_ASPECT_STENCIL_BIT; blitAspectMask &= ~VK_IMAGE_ASPECT_STENCIL_BIT;
} }
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onImageTransferRead(imageAspectMask, srcImage)); ANGLE_TRY(contextVk->onImageTransferRead(imageAspectMask, srcImage));
ANGLE_TRY(contextVk->onImageTransferWrite(imageAspectMask, dstImage)); ANGLE_TRY(contextVk->onImageTransferWrite(imageAspectMask, dstImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkImageBlit blit = {}; VkImageBlit blit = {};
blit.srcSubresource.aspectMask = blitAspectMask; blit.srcSubresource.aspectMask = blitAspectMask;
...@@ -803,9 +801,9 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk, ...@@ -803,9 +801,9 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
blit.dstOffsets[0] = {destArea.x0(), destArea.y0(), 0}; blit.dstOffsets[0] = {destArea.x0(), destArea.y0(), 0};
blit.dstOffsets[1] = {destArea.x1(), destArea.y1(), 1}; blit.dstOffsets[1] = {destArea.x1(), destArea.y1(), 1};
commandBuffer->blitImage(srcImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, commandBuffer.blitImage(srcImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
dstImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, dstImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit,
gl_vk::GetFilter(filter)); gl_vk::GetFilter(filter));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1192,7 +1190,6 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk, ...@@ -1192,7 +1190,6 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk,
const UtilsVk::BlitResolveParameters &params, const UtilsVk::BlitResolveParameters &params,
vk::ImageHelper *srcImage) vk::ImageHelper *srcImage)
{ {
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, srcImage)); ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, srcImage));
VkImageResolve resolveRegion = {}; VkImageResolve resolveRegion = {};
...@@ -1217,14 +1214,15 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk, ...@@ -1217,14 +1214,15 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk,
RenderTargetVk *drawRenderTarget = mRenderTargetCache.getColors()[colorIndexGL]; RenderTargetVk *drawRenderTarget = mRenderTargetCache.getColors()[colorIndexGL];
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT,
&drawRenderTarget->getImageForWrite())); &drawRenderTarget->getImageForWrite()));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
vk::ImageHelper &dstImage = drawRenderTarget->getImageForWrite(); vk::ImageHelper &dstImage = drawRenderTarget->getImageForWrite();
uint32_t levelVK = drawRenderTarget->getLevelIndex() - dstImage.getBaseLevel(); uint32_t levelVK = drawRenderTarget->getLevelIndex() - dstImage.getBaseLevel();
resolveRegion.dstSubresource.mipLevel = levelVK; resolveRegion.dstSubresource.mipLevel = levelVK;
resolveRegion.dstSubresource.baseArrayLayer = drawRenderTarget->getLayerIndex(); resolveRegion.dstSubresource.baseArrayLayer = drawRenderTarget->getLayerIndex();
srcImage->resolve(&dstImage, resolveRegion, commandBuffer); srcImage->resolve(&dstImage, resolveRegion, &commandBuffer);
} }
return angle::Result::Continue; return angle::Result::Continue;
......
...@@ -121,10 +121,9 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk) ...@@ -121,10 +121,9 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk)
&mFontImageView, 0, 1)); &mFontImageView, 0, 1));
// Copy font data from staging buffer. // Copy font data from staging buffer.
vk::CommandBuffer *fontDataUpload;
ANGLE_TRY(contextVk->onBufferTransferRead(&fontDataBuffer.get())); ANGLE_TRY(contextVk->onBufferTransferRead(&fontDataBuffer.get()));
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, &mFontImage)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, &mFontImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&fontDataUpload)); vk::CommandBuffer &fontDataUpload = contextVk->getOutsideRenderPassCommandBuffer();
VkBufferImageCopy copy = {}; VkBufferImageCopy copy = {};
copy.bufferRowLength = gl::overlay::kFontImageWidth; copy.bufferRowLength = gl::overlay::kFontImageWidth;
...@@ -135,9 +134,9 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk) ...@@ -135,9 +134,9 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk)
copy.imageExtent.height = gl::overlay::kFontImageHeight; copy.imageExtent.height = gl::overlay::kFontImageHeight;
copy.imageExtent.depth = 1; copy.imageExtent.depth = 1;
fontDataUpload->copyBufferToImage(fontDataBuffer.get().getBuffer().getHandle(), fontDataUpload.copyBufferToImage(fontDataBuffer.get().getBuffer().getHandle(),
mFontImage.getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, mFontImage.getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
1, &copy); &copy);
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -277,10 +277,9 @@ angle::Result RenderTargetVk::flushStagedUpdates(ContextVk *contextVk, ...@@ -277,10 +277,9 @@ angle::Result RenderTargetVk::flushStagedUpdates(ContextVk *contextVk,
return angle::Result::Continue; return angle::Result::Continue;
} }
vk::CommandBuffer *commandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
return image->flushSingleSubresourceStagedUpdates( return image->flushSingleSubresourceStagedUpdates(
contextVk, mLevelIndexGL, layerIndex, commandBuffer, deferredClears, deferredClearIndex); contextVk, mLevelIndexGL, layerIndex, &commandBuffer, deferredClears, deferredClearIndex);
} }
void RenderTargetVk::retainImageViews(ContextVk *contextVk) const void RenderTargetVk::retainImageViews(ContextVk *contextVk) const
......
...@@ -139,10 +139,9 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex ...@@ -139,10 +139,9 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex
uint32_t rendererQueueFamilyIndex = contextVk->getRenderer()->getQueueFamilyIndex(); uint32_t rendererQueueFamilyIndex = contextVk->getRenderer()->getQueueFamilyIndex();
if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex)) if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex))
{ {
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
mImage->changeLayoutAndQueue(aspect, vk::ImageLayout::ColorAttachment, mImage->changeLayoutAndQueue(aspect, vk::ImageLayout::ColorAttachment,
rendererQueueFamilyIndex, commandBuffer); rendererQueueFamilyIndex, &commandBuffer);
} }
gl::TextureType viewType = imageVk->getImageTextureType(); gl::TextureType viewType = imageVk->getImageTextureType();
......
...@@ -117,12 +117,11 @@ angle::Result SemaphoreVk::wait(gl::Context *context, ...@@ -117,12 +117,11 @@ angle::Result SemaphoreVk::wait(gl::Context *context,
BufferVk *bufferVk = vk::GetImpl(buffer); BufferVk *bufferVk = vk::GetImpl(buffer);
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
vk::CommandBuffer *commandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
// Queue ownership transfer. // Queue ownership transfer.
bufferHelper.acquireFromExternal(contextVk, VK_QUEUE_FAMILY_EXTERNAL, bufferHelper.acquireFromExternal(contextVk, VK_QUEUE_FAMILY_EXTERNAL,
rendererQueueFamilyIndex, commandBuffer); rendererQueueFamilyIndex, &commandBuffer);
} }
} }
...@@ -137,15 +136,14 @@ angle::Result SemaphoreVk::wait(gl::Context *context, ...@@ -137,15 +136,14 @@ angle::Result SemaphoreVk::wait(gl::Context *context,
vk::ImageHelper &image = textureVk->getImage(); vk::ImageHelper &image = textureVk->getImage();
vk::ImageLayout layout = GetVulkanImageLayout(textureAndLayout.layout); vk::ImageLayout layout = GetVulkanImageLayout(textureAndLayout.layout);
vk::CommandBuffer *commandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
// Image should not be accessed while unowned. // Image should not be accessed while unowned.
ASSERT(!textureVk->getImage().hasStagedUpdates()); ASSERT(!textureVk->getImage().hasStagedUpdates());
// Queue ownership transfer and layout transition. // Queue ownership transfer and layout transition.
image.acquireFromExternal(contextVk, VK_QUEUE_FAMILY_EXTERNAL, rendererQueueFamilyIndex, image.acquireFromExternal(contextVk, VK_QUEUE_FAMILY_EXTERNAL, rendererQueueFamilyIndex,
layout, commandBuffer); layout, &commandBuffer);
} }
} }
...@@ -169,12 +167,11 @@ angle::Result SemaphoreVk::signal(gl::Context *context, ...@@ -169,12 +167,11 @@ angle::Result SemaphoreVk::signal(gl::Context *context,
BufferVk *bufferVk = vk::GetImpl(buffer); BufferVk *bufferVk = vk::GetImpl(buffer);
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
vk::CommandBuffer *commandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
// Queue ownership transfer. // Queue ownership transfer.
bufferHelper.releaseToExternal(contextVk, rendererQueueFamilyIndex, bufferHelper.releaseToExternal(contextVk, rendererQueueFamilyIndex,
VK_QUEUE_FAMILY_EXTERNAL, commandBuffer); VK_QUEUE_FAMILY_EXTERNAL, &commandBuffer);
} }
} }
...@@ -198,12 +195,11 @@ angle::Result SemaphoreVk::signal(gl::Context *context, ...@@ -198,12 +195,11 @@ angle::Result SemaphoreVk::signal(gl::Context *context,
ANGLE_TRY(textureVk->ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); ANGLE_TRY(textureVk->ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
// Queue ownership transfer and layout transition. // Queue ownership transfer and layout transition.
image.releaseToExternal(contextVk, rendererQueueFamilyIndex, VK_QUEUE_FAMILY_EXTERNAL, image.releaseToExternal(contextVk, rendererQueueFamilyIndex, VK_QUEUE_FAMILY_EXTERNAL,
layout, commandBuffer); layout, &commandBuffer);
} }
} }
......
...@@ -1167,15 +1167,14 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk, ...@@ -1167,15 +1167,14 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk,
contextVk->optimizeRenderPassForPresent(currentFramebuffer.getHandle()); contextVk->optimizeRenderPassForPresent(currentFramebuffer.getHandle());
} }
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
if (mColorImageMS.valid()) if (mColorImageMS.valid())
{ {
// Transition the multisampled image to TRANSFER_SRC for resolve. // Transition the multisampled image to TRANSFER_SRC for resolve.
ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, &mColorImageMS)); ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, &mColorImageMS));
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, &image.image)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, &image.image));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
VkImageResolve resolveRegion = {}; VkImageResolve resolveRegion = {};
resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
......
...@@ -52,10 +52,8 @@ angle::Result SyncHelper::initialize(ContextVk *contextVk) ...@@ -52,10 +52,8 @@ angle::Result SyncHelper::initialize(ContextVk *contextVk)
mEvent = event.release(); mEvent = event.release();
vk::CommandBuffer *outsideRenderPassCommandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer)); commandBuffer.setEvent(mEvent.getHandle(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
outsideRenderPassCommandBuffer->setEvent(mEvent.getHandle(),
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
retain(&contextVk->getResourceUseList()); retain(&contextVk->getResourceUseList());
return angle::Result::Continue; return angle::Result::Continue;
...@@ -107,11 +105,10 @@ angle::Result SyncHelper::clientWait(Context *context, ...@@ -107,11 +105,10 @@ angle::Result SyncHelper::clientWait(Context *context,
angle::Result SyncHelper::serverWait(ContextVk *contextVk) angle::Result SyncHelper::serverWait(ContextVk *contextVk)
{ {
vk::CommandBuffer *outsideRenderPassCommandBuffer; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer)); commandBuffer.waitEvents(1, mEvent.ptr(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
outsideRenderPassCommandBuffer->waitEvents( VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, nullptr, 0, nullptr, 0,
1, mEvent.ptr(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, nullptr);
0, nullptr, 0, nullptr, 0, nullptr);
retain(&contextVk->getResourceUseList()); retain(&contextVk->getResourceUseList());
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -795,9 +795,8 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -795,9 +795,8 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
// Make sure any updates to the image are already flushed. // Make sure any updates to the image are already flushed.
ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkImageSubresourceLayers destSubresource = srcSubresource; VkImageSubresourceLayers destSubresource = srcSubresource;
destSubresource.mipLevel = level; destSubresource.mipLevel = level;
...@@ -816,7 +815,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -816,7 +815,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
} }
vk::ImageHelper::Copy(srcImage, mImage, srcOffset, destOffsetModified, extents, vk::ImageHelper::Copy(srcImage, mImage, srcOffset, destOffsetModified, extents,
srcSubresource, destSubresource, commandBuffer); srcSubresource, destSubresource, &commandBuffer);
} }
else else
{ {
...@@ -829,9 +828,8 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -829,9 +828,8 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
gl::Extents(sourceBox.width, sourceBox.height, 1), gl::Extents(sourceBox.width, sourceBox.height, 1),
destFormat, kTransferStagingImageFlags, layerCount)); destFormat, kTransferStagingImageFlags, layerCount));
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, stagingImage.get())); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, stagingImage.get()));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkImageSubresourceLayers destSubresource = srcSubresource; VkImageSubresourceLayers destSubresource = srcSubresource;
destSubresource.mipLevel = 0; destSubresource.mipLevel = 0;
...@@ -846,7 +844,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -846,7 +844,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
} }
vk::ImageHelper::Copy(srcImage, stagingImage.get(), srcOffset, gl::kOffsetZero, extents, vk::ImageHelper::Copy(srcImage, stagingImage.get(), srcOffset, gl::kOffsetZero, extents,
srcSubresource, destSubresource, commandBuffer); srcSubresource, destSubresource, &commandBuffer);
// Stage the copy for when the image storage is actually created. // Stage the copy for when the image storage is actually created.
VkImageType imageType = gl_vk::GetImageType(mState.getType()); VkImageType imageType = gl_vk::GetImageType(mState.getType());
...@@ -1110,8 +1108,7 @@ angle::Result TextureVk::setEGLImageTarget(const gl::Context *context, ...@@ -1110,8 +1108,7 @@ angle::Result TextureVk::setEGLImageTarget(const gl::Context *context,
uint32_t rendererQueueFamilyIndex = renderer->getQueueFamilyIndex(); uint32_t rendererQueueFamilyIndex = renderer->getQueueFamilyIndex();
if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex)) if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex))
{ {
vk::CommandBuffer *commandBuffer = nullptr; vk::ImageLayout newLayout = vk::ImageLayout::AllGraphicsShadersReadWrite;
vk::ImageLayout newLayout = vk::ImageLayout::AllGraphicsShadersReadWrite;
if (mImage->getUsage() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) if (mImage->getUsage() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
{ {
newLayout = vk::ImageLayout::ColorAttachment; newLayout = vk::ImageLayout::ColorAttachment;
...@@ -1126,9 +1123,9 @@ angle::Result TextureVk::setEGLImageTarget(const gl::Context *context, ...@@ -1126,9 +1123,9 @@ angle::Result TextureVk::setEGLImageTarget(const gl::Context *context,
newLayout = vk::ImageLayout::AllGraphicsShadersReadOnly; newLayout = vk::ImageLayout::AllGraphicsShadersReadOnly;
} }
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
mImage->changeLayoutAndQueue(mImage->getAspectFlags(), newLayout, rendererQueueFamilyIndex, mImage->changeLayoutAndQueue(mImage->getAspectFlags(), newLayout, rendererQueueFamilyIndex,
commandBuffer); &commandBuffer);
} }
return angle::Result::Continue; return angle::Result::Continue;
...@@ -1400,10 +1397,10 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, ...@@ -1400,10 +1397,10 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
// Make sure the source is initialized and its images are flushed. // Make sure the source is initialized and its images are flushed.
ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer));
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkBufferImageCopy region = {}; VkBufferImageCopy region = {};
region.bufferOffset = offset; region.bufferOffset = offset;
...@@ -1426,8 +1423,8 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, ...@@ -1426,8 +1423,8 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
region.imageSubresource.layerCount = sourceArea.depth; region.imageSubresource.layerCount = sourceArea.depth;
} }
commandBuffer->copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(), commandBuffer.copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(),
mImage->getCurrentLayout(), 1, &region); mImage->getCurrentLayout(), 1, &region);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1933,11 +1930,10 @@ angle::Result TextureVk::flushImageStagedUpdates(ContextVk *contextVk) ...@@ -1933,11 +1930,10 @@ angle::Result TextureVk::flushImageStagedUpdates(ContextVk *contextVk)
{ {
ASSERT(mImage->valid()); ASSERT(mImage->valid());
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
return mImage->flushStagedUpdates(contextVk, getNativeImageLevel(0), mImage->getLevelCount(), return mImage->flushStagedUpdates(contextVk, getNativeImageLevel(0), mImage->getLevelCount(),
getNativeImageLayer(0), mImage->getLayerCount(), getNativeImageLayer(0), mImage->getLayerCount(),
mRedefinedLevels, commandBuffer); mRedefinedLevels, &commandBuffer);
} }
angle::Result TextureVk::initRenderTargets(ContextVk *contextVk, angle::Result TextureVk::initRenderTargets(ContextVk *contextVk,
......
...@@ -1826,11 +1826,10 @@ angle::Result QueryHelper::beginQuery(ContextVk *contextVk) ...@@ -1826,11 +1826,10 @@ angle::Result QueryHelper::beginQuery(ContextVk *contextVk)
ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass()); ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
} }
CommandBuffer *outsideRenderPassCommandBuffer; CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer)); const QueryPool &queryPool = getQueryPool();
const QueryPool &queryPool = getQueryPool(); commandBuffer.resetQueryPool(queryPool.getHandle(), mQuery, 1);
outsideRenderPassCommandBuffer->resetQueryPool(queryPool.getHandle(), mQuery, 1); commandBuffer.beginQuery(queryPool.getHandle(), mQuery, 0);
outsideRenderPassCommandBuffer->beginQuery(queryPool.getHandle(), mQuery, 0);
mMostRecentSerial = contextVk->getCurrentQueueSerial(); mMostRecentSerial = contextVk->getCurrentQueueSerial();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1842,9 +1841,8 @@ angle::Result QueryHelper::endQuery(ContextVk *contextVk) ...@@ -1842,9 +1841,8 @@ angle::Result QueryHelper::endQuery(ContextVk *contextVk)
ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass()); ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
} }
CommandBuffer *outsideRenderPassCommandBuffer; CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer)); commandBuffer.endQuery(getQueryPool().getHandle(), mQuery);
outsideRenderPassCommandBuffer->endQuery(getQueryPool().getHandle(), mQuery);
mMostRecentSerial = contextVk->getCurrentQueueSerial(); mMostRecentSerial = contextVk->getCurrentQueueSerial();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1870,9 +1868,8 @@ angle::Result QueryHelper::flushAndWriteTimestamp(ContextVk *contextVk) ...@@ -1870,9 +1868,8 @@ angle::Result QueryHelper::flushAndWriteTimestamp(ContextVk *contextVk)
ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass()); ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
} }
CommandBuffer *outsideRenderPassCommandBuffer; CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&outsideRenderPassCommandBuffer)); writeTimestamp(contextVk, &commandBuffer);
writeTimestamp(contextVk, outsideRenderPassCommandBuffer);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2478,12 +2475,11 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk, ...@@ -2478,12 +2475,11 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk,
uint32_t regionCount, uint32_t regionCount,
const VkBufferCopy *copyRegions) const VkBufferCopy *copyRegions)
{ {
CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer));
ANGLE_TRY(contextVk->onBufferTransferWrite(this)); ANGLE_TRY(contextVk->onBufferTransferWrite(this));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
commandBuffer->copyBuffer(srcBuffer->getBuffer(), mBuffer, regionCount, copyRegions); CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer.copyBuffer(srcBuffer->getBuffer(), mBuffer, regionCount, copyRegions);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -3478,9 +3474,9 @@ void ImageHelper::Copy(ImageHelper *srcImage, ...@@ -3478,9 +3474,9 @@ void ImageHelper::Copy(ImageHelper *srcImage,
angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint maxLevel) angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint maxLevel)
{ {
CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, this)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, this));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
// We are able to use blitImage since the image format we are using supports it. // We are able to use blitImage since the image format we are using supports it.
int32_t mipWidth = mExtents.width; int32_t mipWidth = mExtents.width;
...@@ -3514,8 +3510,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint ...@@ -3514,8 +3510,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
// We can do it for all layers at once. // We can do it for all layers at once.
commandBuffer->imageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer.imageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
barrier); barrier);
VkImageBlit blit = {}; VkImageBlit blit = {};
blit.srcOffsets[0] = {0, 0, 0}; blit.srcOffsets[0] = {0, 0, 0};
blit.srcOffsets[1] = {mipWidth, mipHeight, mipDepth}; blit.srcOffsets[1] = {mipWidth, mipHeight, mipDepth};
...@@ -3534,8 +3530,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint ...@@ -3534,8 +3530,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint
mipHeight = nextMipHeight; mipHeight = nextMipHeight;
mipDepth = nextMipDepth; mipDepth = nextMipDepth;
commandBuffer->blitImage(mImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, mImage, commandBuffer.blitImage(mImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, mImage,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, filter); VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, filter);
} }
// Transition the last mip level to the same layout as all the other ones, so we can declare // Transition the last mip level to the same layout as all the other ones, so we can declare
...@@ -3545,8 +3541,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint ...@@ -3545,8 +3541,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint
barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
// We can do it for all layers at once. // We can do it for all layers at once.
commandBuffer->imageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer.imageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
barrier); barrier);
// This is just changing the internal state of the image helper so that the next call // This is just changing the internal state of the image helper so that the next call
// to changeLayout will use this layout as the "oldLayout" argument. // to changeLayout will use this layout as the "oldLayout" argument.
mCurrentLayout = ImageLayout::TransferSrc; mCurrentLayout = ImageLayout::TransferSrc;
...@@ -4446,9 +4442,8 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4446,9 +4442,8 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
angle::Result ImageHelper::flushAllStagedUpdates(ContextVk *contextVk) angle::Result ImageHelper::flushAllStagedUpdates(ContextVk *contextVk)
{ {
// Clear the image. // Clear the image.
CommandBuffer *commandBuffer = nullptr; CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); return flushStagedUpdates(contextVk, 0, mLevelCount, 0, mLayerCount, {}, &commandBuffer);
return flushStagedUpdates(contextVk, 0, mLevelCount, 0, mLayerCount, {}, commandBuffer);
} }
bool ImageHelper::isUpdateStaged(uint32_t levelGL, uint32_t layer) bool ImageHelper::isUpdateStaged(uint32_t levelGL, uint32_t layer)
...@@ -4672,14 +4667,13 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, ...@@ -4672,14 +4667,13 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
regions[1].imageSubresource.mipLevel = sourceLevelVk; regions[1].imageSubresource.mipLevel = sourceLevelVk;
} }
CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut)); ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut));
ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, this)); ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, this));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(), CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
(*bufferOut)->getBuffer().getHandle(), 1, regions);
commandBuffer.copyImageToBuffer(mImage, getCurrentLayout(),
(*bufferOut)->getBuffer().getHandle(), 1, regions);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -4823,13 +4817,13 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -4823,13 +4817,13 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
VkImageAspectFlags layoutChangeAspectFlags = src->getAspectFlags(); VkImageAspectFlags layoutChangeAspectFlags = src->getAspectFlags();
// Note that although we're reading from the image, we need to update the layout below. // Note that although we're reading from the image, we need to update the layout below.
CommandBuffer *commandBuffer;
if (isMultisampled) if (isMultisampled)
{ {
ANGLE_TRY(contextVk->onImageTransferWrite(layoutChangeAspectFlags, &resolvedImage.get())); ANGLE_TRY(contextVk->onImageTransferWrite(layoutChangeAspectFlags, &resolvedImage.get()));
} }
ANGLE_TRY(contextVk->onImageTransferRead(layoutChangeAspectFlags, this)); ANGLE_TRY(contextVk->onImageTransferRead(layoutChangeAspectFlags, this));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
const angle::Format *readFormat = &mFormat->actualImageFormat(); const angle::Format *readFormat = &mFormat->actualImageFormat();
...@@ -4871,7 +4865,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -4871,7 +4865,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
resolveRegion.dstOffset = {}; resolveRegion.dstOffset = {};
resolveRegion.extent = srcExtent; resolveRegion.extent = srcExtent;
resolve(&resolvedImage.get(), resolveRegion, commandBuffer); resolve(&resolvedImage.get(), resolveRegion, &commandBuffer);
ANGLE_TRY(contextVk->onImageTransferRead(layoutChangeAspectFlags, &resolvedImage.get())); ANGLE_TRY(contextVk->onImageTransferRead(layoutChangeAspectFlags, &resolvedImage.get()));
...@@ -4899,8 +4893,8 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -4899,8 +4893,8 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
region.imageOffset = srcOffset; region.imageOffset = srcOffset;
region.imageSubresource = srcSubresource; region.imageSubresource = srcSubresource;
commandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(), bufferHandle, 1, commandBuffer.copyImageToBuffer(src->getImage(), src->getCurrentLayout(), bufferHandle, 1,
&region); &region);
// Triggers a full finish. // Triggers a full finish.
// TODO(jmadill): Don't block on asynchronous readback. // TODO(jmadill): Don't block on asynchronous readback.
......
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