aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libANGLE/renderer/vulkan/ContextVk.cpp16
-rw-r--r--src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp8
-rw-r--r--src/libANGLE/renderer/vulkan/TextureVk.cpp11
-rw-r--r--src/libANGLE/renderer/vulkan/UtilsVk.cpp27
-rw-r--r--src/libANGLE/renderer/vulkan/vk_cache_utils.cpp58
-rw-r--r--src/libANGLE/renderer/vulkan/vk_cache_utils.h4
-rw-r--r--src/libANGLE/renderer/vulkan/vk_helpers.cpp250
-rw-r--r--src/libANGLE/renderer/vulkan/vk_helpers.h56
-rw-r--r--src/libANGLE/renderer/vulkan/vk_ref_counted_event.cpp7
-rw-r--r--src/libANGLE/renderer/vulkan/vk_ref_counted_event.h4
-rw-r--r--src/libANGLE/renderer/vulkan/vk_renderer.cpp27
-rw-r--r--src/libANGLE/renderer/vulkan/vk_renderer.h12
-rw-r--r--src/tests/perf_tests/TracePerfTest.cpp10
-rw-r--r--src/tests/test_utils/angle_test_instantiate.cpp14
-rw-r--r--src/tests/test_utils/angle_test_instantiate.h3
15 files changed, 279 insertions, 228 deletions
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index a4fdc56eaa..46fe2dd23a 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -7608,21 +7608,9 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore,
memoryBarrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
memoryBarrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT;
- const VkPipelineStageFlags supportedShaderStages =
- (VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
- VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
- VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
- VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) &
- mRenderer->getSupportedVulkanPipelineStageMask();
- const VkPipelineStageFlags bufferWriteStages =
- VK_PIPELINE_STAGE_TRANSFER_BIT | supportedShaderStages |
- (getFeatures().supportsTransformFeedbackExtension.enabled
- ? VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
- : 0);
-
mOutsideRenderPassCommands->getCommandBuffer().memoryBarrier(
- bufferWriteStages, VK_PIPELINE_STAGE_HOST_BIT, memoryBarrier);
+ mRenderer->getSupportedBufferWritePipelineStageMask(), VK_PIPELINE_STAGE_HOST_BIT,
+ memoryBarrier);
mIsAnyHostVisibleBufferWritten = false;
}
diff --git a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
index 76061ab2ef..f590b5ae58 100644
--- a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
@@ -1913,8 +1913,8 @@ angle::Result ProgramExecutableVk::getOrAllocateDescriptorSet(
if (*newSharedCacheKeyOut != nullptr)
{
// Cache miss. A new cache entry has been created.
- descriptorSetDesc.updateDescriptorSet(context, writeDescriptorDescs, updateBuilder,
- mDescriptorSets[setIndex]);
+ descriptorSetDesc.updateDescriptorSet(context->getRenderer(), writeDescriptorDescs,
+ updateBuilder, mDescriptorSets[setIndex]);
}
else
{
@@ -1996,8 +1996,8 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(
ANGLE_TRY(fullDesc.updateFullActiveTextures(
context, mVariableInfoMap, mTextureWriteDescriptorDescs, *mExecutable, textures,
samplers, emulateSeamfulCubeMapSampling, pipelineType, newSharedCacheKey));
- fullDesc.updateDescriptorSet(context, mTextureWriteDescriptorDescs, updateBuilder,
- mDescriptorSets[DescriptorSetIndex::Texture]);
+ fullDesc.updateDescriptorSet(context->getRenderer(), mTextureWriteDescriptorDescs,
+ updateBuilder, mDescriptorSets[DescriptorSetIndex::Texture]);
}
else
{
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index ac38decdd6..ca7ed0ee7b 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -1427,7 +1427,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
extents.depth = 1;
}
- vk::ImageHelper::Copy(contextVk, srcImage, mImage, srcOffset, dstOffsetModified, extents,
+ vk::ImageHelper::Copy(renderer, srcImage, mImage, srcOffset, dstOffsetModified, extents,
srcSubresource, destSubresource, commandBuffer);
contextVk->trackImagesWithOutsideRenderPassEvent(srcImage, mImage);
@@ -1462,7 +1462,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
extents.depth = 1;
}
- vk::ImageHelper::Copy(contextVk, srcImage, &stagingImage->get(), srcOffset, gl::kOffsetZero,
+ vk::ImageHelper::Copy(renderer, srcImage, &stagingImage->get(), srcOffset, gl::kOffsetZero,
extents, srcSubresource, destSubresource, commandBuffer);
contextVk->trackImagesWithOutsideRenderPassEvent(srcImage, &stagingImage->get());
@@ -2154,7 +2154,8 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
commandBuffer->copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(),
- mImage->getCurrentLayout(contextVk), 1, &region);
+ mImage->getCurrentLayout(contextVk->getRenderer()), 1,
+ &region);
contextVk->trackImageWithOutsideRenderPassEvent(mImage);
@@ -2465,9 +2466,9 @@ angle::Result TextureVk::copyAndStageImageData(ContextVk *contextVk,
copyRegion.dstSubresource.mipLevel = levelVk.get();
gl_vk::GetExtent(levelExtents, &copyRegion.extent);
- commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(contextVk),
+ commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(renderer),
stagingImage->get().getImage(),
- stagingImage->get().getCurrentLayout(contextVk), 1, &copyRegion);
+ stagingImage->get().getCurrentLayout(renderer), 1, &copyRegion);
}
contextVk->trackImagesWithOutsideRenderPassEvent(srcImage, &stagingImage->get());
diff --git a/src/libANGLE/renderer/vulkan/UtilsVk.cpp b/src/libANGLE/renderer/vulkan/UtilsVk.cpp
index 05feb1fd66..bb7f194f8a 100644
--- a/src/libANGLE/renderer/vulkan/UtilsVk.cpp
+++ b/src/libANGLE/renderer/vulkan/UtilsVk.cpp
@@ -2884,17 +2884,17 @@ angle::Result UtilsVk::blitResolveImpl(ContextVk *contextVk,
if (blitColor)
{
imageInfos[0].imageView = srcColorView->getHandle();
- imageInfos[0].imageLayout = src->getCurrentLayout(contextVk);
+ imageInfos[0].imageLayout = src->getCurrentLayout(renderer);
}
if (blitDepth)
{
imageInfos[0].imageView = srcDepthView->getHandle();
- imageInfos[0].imageLayout = src->getCurrentLayout(contextVk);
+ imageInfos[0].imageLayout = src->getCurrentLayout(renderer);
}
if (blitStencil)
{
imageInfos[1].imageView = srcStencilView->getHandle();
- imageInfos[1].imageLayout = src->getCurrentLayout(contextVk);
+ imageInfos[1].imageLayout = src->getCurrentLayout(renderer);
}
VkDescriptorImageInfo samplerInfo = {};
@@ -3104,7 +3104,7 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
// Blit/resolve stencil into the buffer.
VkDescriptorImageInfo imageInfo = {};
imageInfo.imageView = srcStencilView->getHandle();
- imageInfo.imageLayout = src->getCurrentLayout(contextVk);
+ imageInfo.imageLayout = src->getCurrentLayout(renderer);
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = blitBuffer.get().getBuffer().getHandle();
@@ -3176,7 +3176,7 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
commandBuffer->copyBufferToImage(blitBuffer.get().getBuffer().getHandle(),
depthStencilImage->getImage(),
- depthStencilImage->getCurrentLayout(contextVk), 1, &region);
+ depthStencilImage->getCurrentLayout(renderer), 1, &region);
return angle::Result::Continue;
}
@@ -3355,7 +3355,7 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk,
VkDescriptorImageInfo imageInfo = {};
imageInfo.imageView = srcView->getHandle();
- imageInfo.imageLayout = src->getCurrentLayout(contextVk);
+ imageInfo.imageLayout = src->getCurrentLayout(renderer);
VkWriteDescriptorSet writeInfo = {};
writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@@ -3508,7 +3508,7 @@ angle::Result UtilsVk::copyImageBits(ContextVk *contextVk,
srcRegion.imageExtent.height = params.copyExtents[1];
srcRegion.imageExtent.depth = isSrc3D ? params.copyExtents[2] : 1;
- commandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(contextVk),
+ commandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(renderer),
srcBuffer.get().getBuffer().getHandle(), 1, &srcRegion);
// Add a barrier prior to dispatch call.
@@ -3634,7 +3634,7 @@ angle::Result UtilsVk::copyImageBits(ContextVk *contextVk,
dstRegion.imageExtent.depth = isDst3D ? params.copyExtents[2] : 1;
commandBuffer->copyBufferToImage(dstBuffer.get().getBuffer().getHandle(), dst->getImage(),
- dst->getCurrentLayout(contextVk), 1, &dstRegion);
+ dst->getCurrentLayout(renderer), 1, &dstRegion);
return angle::Result::Continue;
}
@@ -3644,6 +3644,7 @@ angle::Result UtilsVk::copyImageToBuffer(ContextVk *contextVk,
vk::ImageHelper *src,
const CopyImageToBufferParameters &params)
{
+ vk::Renderer *renderer = contextVk->getRenderer();
ANGLE_TRY(ensureCopyImageToBufferResourcesInitialized(contextVk));
const angle::Format &srcFormat = src->getActualFormat();
@@ -3705,7 +3706,7 @@ angle::Result UtilsVk::copyImageToBuffer(ContextVk *contextVk,
VkDescriptorImageInfo imageInfo = {};
imageInfo.imageView = srcView.get().getHandle();
- imageInfo.imageLayout = src->getCurrentLayout(contextVk);
+ imageInfo.imageLayout = src->getCurrentLayout(renderer);
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = dst->getBuffer().getHandle();
@@ -3956,6 +3957,8 @@ angle::Result UtilsVk::generateMipmap(ContextVk *contextVk,
const vk::Sampler &sampler,
const GenerateMipmapParameters &params)
{
+ vk::Renderer *renderer = contextVk->getRenderer();
+
ANGLE_TRY(ensureGenerateMipmapResourcesInitialized(contextVk));
const gl::Extents &srcExtents = src->getLevelExtents(vk::LevelIndex(params.srcLevel));
@@ -3984,12 +3987,12 @@ angle::Result UtilsVk::generateMipmap(ContextVk *contextVk,
for (uint32_t level = 0; level < kGenerateMipmapMaxLevels; ++level)
{
destImageInfos[level].imageView = destLevelViews[level]->getHandle();
- destImageInfos[level].imageLayout = dst->getCurrentLayout(contextVk);
+ destImageInfos[level].imageLayout = dst->getCurrentLayout(renderer);
}
VkDescriptorImageInfo srcImageInfo = {};
srcImageInfo.imageView = srcLevelZeroView->getHandle();
- srcImageInfo.imageLayout = src->getCurrentLayout(contextVk);
+ srcImageInfo.imageLayout = src->getCurrentLayout(renderer);
srcImageInfo.sampler = sampler.getHandle();
VkWriteDescriptorSet writeInfos[2] = {};
@@ -4381,7 +4384,7 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk,
VkDescriptorImageInfo imageInfo = {};
imageInfo.imageView = fontView->getHandle();
- imageInfo.imageLayout = font->getCurrentLayout(contextVk);
+ imageInfo.imageLayout = font->getCurrentLayout(renderer);
VkDescriptorBufferInfo bufferInfos[2] = {};
bufferInfos[0].buffer = textWidgetsBuffer->getBuffer().getHandle();
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
index f277e78741..e00d6d5415 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
@@ -238,7 +238,7 @@ uint8_t PackGLBlendFactor(gl::BlendFactorType blendFactor)
}
}
-void UnpackAttachmentDesc(Context *context,
+void UnpackAttachmentDesc(Renderer *renderer,
VkAttachmentDescription2 *desc,
angle::FormatID formatID,
uint8_t samples,
@@ -247,7 +247,7 @@ void UnpackAttachmentDesc(Context *context,
*desc = {};
desc->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
desc->format = GetVkFormatFromFormatID(formatID);
- desc->samples = gl_vk::GetSamples(samples, context->getFeatures().limitSampleCountTo2.enabled);
+ desc->samples = gl_vk::GetSamples(samples, renderer->getFeatures().limitSampleCountTo2.enabled);
desc->loadOp = ConvertRenderPassLoadOpToVkLoadOp(static_cast<RenderPassLoadOp>(ops.loadOp));
desc->storeOp =
ConvertRenderPassStoreOpToVkStoreOp(static_cast<RenderPassStoreOp>(ops.storeOp));
@@ -256,9 +256,9 @@ void UnpackAttachmentDesc(Context *context,
desc->stencilStoreOp =
ConvertRenderPassStoreOpToVkStoreOp(static_cast<RenderPassStoreOp>(ops.stencilStoreOp));
desc->initialLayout =
- ConvertImageLayoutToVkImageLayout(context, static_cast<ImageLayout>(ops.initialLayout));
+ ConvertImageLayoutToVkImageLayout(renderer, static_cast<ImageLayout>(ops.initialLayout));
desc->finalLayout =
- ConvertImageLayoutToVkImageLayout(context, static_cast<ImageLayout>(ops.finalLayout));
+ ConvertImageLayoutToVkImageLayout(renderer, static_cast<ImageLayout>(ops.finalLayout));
}
struct AttachmentInfo
@@ -5431,7 +5431,7 @@ void WriteDescriptorDescs::streamOut(std::ostream &ostr) const
}
// DescriptorSetDesc implementation.
-void DescriptorSetDesc::updateDescriptorSet(Context *context,
+void DescriptorSetDesc::updateDescriptorSet(Renderer *renderer,
const WriteDescriptorDescs &writeDescriptorDescs,
UpdateDescriptorSetsBuilder *updateBuilder,
const DescriptorDescHandles *handles,
@@ -5508,9 +5508,10 @@ void DescriptorSetDesc::updateDescriptorSet(Context *context,
ImageLayout imageLayout = static_cast<ImageLayout>(infoDesc.imageLayoutOrRange);
- imageInfo.imageLayout = ConvertImageLayoutToVkImageLayout(context, imageLayout);
- imageInfo.imageView = handles[infoDescIndex + arrayElement].imageView;
- imageInfo.sampler = handles[infoDescIndex + arrayElement].sampler;
+ imageInfo.imageLayout =
+ ConvertImageLayoutToVkImageLayout(renderer, imageLayout);
+ imageInfo.imageView = handles[infoDescIndex + arrayElement].imageView;
+ imageInfo.sampler = handles[infoDescIndex + arrayElement].sampler;
}
writeSet.pImageInfo = writeImages;
break;
@@ -6269,12 +6270,12 @@ angle::Result DescriptorSetDescBuilder::updateInputAttachments(
return angle::Result::Continue;
}
-void DescriptorSetDescBuilder::updateDescriptorSet(Context *context,
+void DescriptorSetDescBuilder::updateDescriptorSet(Renderer *renderer,
const WriteDescriptorDescs &writeDescriptorDescs,
UpdateDescriptorSetsBuilder *updateBuilder,
VkDescriptorSet descriptorSet) const
{
- mDesc.updateDescriptorSet(context, writeDescriptorDescs, updateBuilder, mHandles.data(),
+ mDesc.updateDescriptorSet(renderer, writeDescriptorDescs, updateBuilder, mHandles.data(),
descriptorSet);
}
@@ -6718,6 +6719,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
vk::RenderPass *renderPass,
vk::RenderPassPerfCounters *renderPassCounters)
{
+ vk::Renderer *renderer = context->getRenderer();
constexpr VkAttachmentReference2 kUnusedAttachment = {VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
nullptr, VK_ATTACHMENT_UNUSED,
VK_IMAGE_LAYOUT_UNDEFINED, 0};
@@ -6725,8 +6727,8 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
const bool needInputAttachments = desc.hasFramebufferFetch();
const bool isRenderToTextureThroughExtension =
desc.isRenderToTexture() &&
- (context->getFeatures().supportsMultisampledRenderToSingleSampled.enabled ||
- context->getFeatures().supportsMultisampledRenderToSingleSampledGOOGLEX.enabled);
+ (renderer->getFeatures().supportsMultisampledRenderToSingleSampled.enabled ||
+ renderer->getFeatures().supportsMultisampledRenderToSingleSampledGOOGLEX.enabled);
const bool isRenderToTextureThroughEmulation =
desc.isRenderToTexture() && !isRenderToTextureThroughExtension;
@@ -6784,8 +6786,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
ASSERT(attachmentFormatID != angle::FormatID::NONE);
bool isYUVExternalFormat = vk::IsYUVExternalFormat(attachmentFormatID);
- if (isYUVExternalFormat &&
- context->getRenderer()->nullColorAttachmentWithExternalFormatResolve())
+ if (isYUVExternalFormat && renderer->nullColorAttachmentWithExternalFormatResolve())
{
colorAttachmentRefs.push_back(kUnusedAttachment);
// temporary workaround for ARM driver assertion. Will remove once driver fix lands
@@ -6801,11 +6802,11 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
needInputAttachments
? VK_IMAGE_LAYOUT_GENERAL
: vk::ConvertImageLayoutToVkImageLayout(
- context, static_cast<vk::ImageLayout>(ops[attachmentCount].initialLayout));
+ renderer, static_cast<vk::ImageLayout>(ops[attachmentCount].initialLayout));
colorRef.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
colorAttachmentRefs.push_back(colorRef);
- vk::UnpackAttachmentDesc(context, &attachmentDescs[attachmentCount.get()],
+ vk::UnpackAttachmentDesc(renderer, &attachmentDescs[attachmentCount.get()],
attachmentFormatID, attachmentSamples, ops[attachmentCount]);
// If this renderpass uses EXT_srgb_write_control, we need to override the format to its
@@ -6823,8 +6824,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
if (isYUVExternalFormat)
{
const vk::ExternalYuvFormatInfo &externalFormatInfo =
- context->getRenderer()->getExternalFormatTable()->getExternalFormatInfo(
- attachmentFormatID);
+ renderer->getExternalFormatTable()->getExternalFormatInfo(attachmentFormatID);
attachmentDescs[attachmentCount.get()].format =
externalFormatInfo.colorAttachmentFormat;
}
@@ -6858,11 +6858,11 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
depthStencilAttachmentRef.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
depthStencilAttachmentRef.attachment = attachmentCount.get();
depthStencilAttachmentRef.layout = ConvertImageLayoutToVkImageLayout(
- context, static_cast<vk::ImageLayout>(ops[attachmentCount].initialLayout));
+ renderer, static_cast<vk::ImageLayout>(ops[attachmentCount].initialLayout));
depthStencilAttachmentRef.aspectMask =
VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
- vk::UnpackAttachmentDesc(context, &attachmentDescs[attachmentCount.get()],
+ vk::UnpackAttachmentDesc(renderer, &attachmentDescs[attachmentCount.get()],
attachmentFormatID, attachmentSamples, ops[attachmentCount]);
if (isRenderToTextureThroughEmulation)
@@ -6920,10 +6920,9 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
const bool isInvalidated = isMSRTTEmulationColorInvalidated.test(colorIndexGL);
- if (isYUVExternalFormat &&
- context->getRenderer()->nullColorAttachmentWithExternalFormatResolve())
+ if (isYUVExternalFormat && renderer->nullColorAttachmentWithExternalFormatResolve())
{
- vk::UnpackAttachmentDesc(context, &attachmentDescs[attachmentCount.get()],
+ vk::UnpackAttachmentDesc(renderer, &attachmentDescs[attachmentCount.get()],
attachmentFormatID, attachmentSamples, ops[attachmentCount]);
}
else
@@ -6938,8 +6937,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
if (isYUVExternalFormat)
{
const vk::ExternalYuvFormatInfo &externalFormatInfo =
- context->getRenderer()->getExternalFormatTable()->getExternalFormatInfo(
- attachmentFormatID);
+ renderer->getExternalFormatTable()->getExternalFormatInfo(attachmentFormatID);
externalFormat.externalFormat = externalFormatInfo.externalFormat;
VkAttachmentDescription2 &attachment = attachmentDescs[attachmentCount.get()];
attachment.pNext = &externalFormat;
@@ -7044,7 +7042,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
// Specify rasterization order for color on the subpass when available and
// there is framebuffer fetch. This is required when the corresponding
// flag is set on the pipeline.
- if (context->getFeatures().supportsRasterizationOrderAttachmentAccess.enabled &&
+ if (renderer->getFeatures().supportsRasterizationOrderAttachmentAccess.enabled &&
desc.hasFramebufferFetch())
{
for (VkSubpassDescription2 &subpass : subpassDesc)
@@ -7054,7 +7052,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
}
}
- if (context->getFeatures().supportsLegacyDithering.enabled && desc.isLegacyDitherEnabled())
+ if (renderer->getFeatures().supportsLegacyDithering.enabled && desc.isLegacyDitherEnabled())
{
subpassDesc.back().flags |= VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT;
}
@@ -7074,7 +7072,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
depthStencilResolve.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE;
- if (!context->getFeatures().supportsDepthStencilIndependentResolveNone.enabled)
+ if (!renderer->getFeatures().supportsDepthStencilIndependentResolveNone.enabled)
{
// Assert that depth/stencil is not separately resolved without this feature
ASSERT(desc.hasDepthResolveAttachment() || angleFormat.depthBits == 0);
@@ -7125,7 +7123,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
fragmentShadingRateAttachmentInfo.pFragmentShadingRateAttachment =
&fragmentShadingRateAttachmentRef;
fragmentShadingRateAttachmentInfo.shadingRateAttachmentTexelSize =
- context->getRenderer()->getMaxFragmentShadingRateAttachmentTexelSize();
+ renderer->getMaxFragmentShadingRateAttachmentTexelSize();
vk::AddToPNextChain(&subpassDesc.back(), &fragmentShadingRateAttachmentInfo);
}
@@ -7164,7 +7162,7 @@ angle::Result RenderPassCache::MakeRenderPass(vk::Context *context,
// If VK_KHR_create_renderpass2 is not supported, we must use core Vulkan 1.0. This is
// increasingly uncommon. Note that extensions that require chaining information to subpasses
// are automatically not used when this extension is not available.
- if (!context->getFeatures().supportsRenderpass2.enabled)
+ if (!renderer->getFeatures().supportsRenderpass2.enabled)
{
ANGLE_TRY(vk::CreateRenderPass1(context, createInfo, desc.viewCount(), renderPass));
}
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index 19d6249371..2150a0a85c 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -1735,7 +1735,7 @@ class DescriptorSetDesc
return mDescriptorInfos[infoDescIndex];
}
- void updateDescriptorSet(Context *context,
+ void updateDescriptorSet(Renderer *renderer,
const WriteDescriptorDescs &writeDescriptorDescs,
UpdateDescriptorSetsBuilder *updateBuilder,
const DescriptorDescHandles *handles,
@@ -1872,7 +1872,7 @@ class DescriptorSetDescBuilder final
PipelineType pipelineType,
const SharedDescriptorSetCacheKey &sharedCacheKey);
- void updateDescriptorSet(Context *context,
+ void updateDescriptorSet(Renderer *renderer,
const WriteDescriptorDescs &writeDescriptorDescs,
UpdateDescriptorSetsBuilder *updateBuilder,
VkDescriptorSet descriptorSet) const;
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index 7460172fb5..2f3f39fb16 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -71,34 +71,6 @@ constexpr gl::ShaderMap<PipelineStage> kPipelineStageShaderMap = {
{gl::ShaderType::Compute, PipelineStage::ComputeShader},
};
-struct ImageMemoryBarrierData
-{
- const char *name;
-
- // The Vk layout corresponding to the ImageLayout key.
- VkImageLayout layout;
-
- // The stage in which the image is used (or Bottom/Top if not using any specific stage). Unless
- // Bottom/Top (Bottom used for transition to and Top used for transition from), the two values
- // should match.
- VkPipelineStageFlags dstStageMask;
- VkPipelineStageFlags srcStageMask;
- // Access mask when transitioning into this layout.
- VkAccessFlags dstAccessMask;
- // Access mask when transitioning out from this layout. Note that source access mask never
- // needs a READ bit, as WAR hazards don't need memory barriers (just execution barriers).
- VkAccessFlags srcAccessMask;
- // Read or write.
- ResourceAccess type;
- // *CommandBufferHelper track an array of PipelineBarriers. This indicates which array element
- // this should be merged into. Right now we track individual barrier for every PipelineStage. If
- // layout has a single stage mask bit, we use that stage as index. If layout has multiple stage
- // mask bits, we pick the lowest stage as the index since it is the first stage that needs
- // barrier.
- PipelineStage barrierIndex;
- EventStage eventStage;
-};
-
// clang-format off
constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemoryBarrierData = {
{
@@ -114,6 +86,7 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
0,
ResourceAccess::ReadOnly,
PipelineStage::InvalidEnum,
+ // We do not directly using this layout in SetEvent. We transit to other layout before using
EventStage::InvalidEnum,
},
},
@@ -433,7 +406,8 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
0,
ResourceAccess::ReadOnly,
PipelineStage::BottomOfPipe,
- EventStage::BottomOfPipe,
+ // We do not directly using this layout in SetEvent.
+ EventStage::InvalidEnum,
},
},
{
@@ -475,7 +449,8 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
VK_ACCESS_MEMORY_WRITE_BIT,
ResourceAccess::ReadOnly,
PipelineStage::InvalidEnum,
- EventStage::BottomOfPipe,
+ // We do not directly using this layout in SetEvent. We transit to internal layout before using
+ EventStage::InvalidEnum,
},
},
{
@@ -492,7 +467,8 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
ResourceAccess::ReadOnly,
// In case of multiple destination stages, We barrier the earliest stage
PipelineStage::TopOfPipe,
- EventStage::AllCommands,
+ // We do not directly using this layout in SetEvent. We transit to internal layout before using
+ EventStage::InvalidEnum,
},
},
{
@@ -509,7 +485,8 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
ResourceAccess::ReadWrite,
// In case of multiple destination stages, We barrier the earliest stage
PipelineStage::TopOfPipe,
- EventStage::AllCommands,
+ // We do not directly using this layout in SetEvent. We transit to internal layout before using
+ EventStage::InvalidEnum,
},
},
{
@@ -575,7 +552,8 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
0,
ResourceAccess::ReadOnly,
PipelineStage::InvalidEnum,
- EventStage::BottomOfPipe,
+ // We do not directly using this layout in SetEvent.
+ EventStage::InvalidEnum,
},
},
{
@@ -778,18 +756,6 @@ constexpr angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> kImageMemory
};
// clang-format on
-VkPipelineStageFlags GetImageLayoutSrcStageMask(Context *context,
- const ImageMemoryBarrierData &transition)
-{
- return transition.srcStageMask & context->getRenderer()->getSupportedVulkanPipelineStageMask();
-}
-
-VkPipelineStageFlags GetImageLayoutDstStageMask(Context *context,
- const ImageMemoryBarrierData &transition)
-{
- return transition.dstStageMask & context->getRenderer()->getSupportedVulkanPipelineStageMask();
-}
-
EventStage GetImageLayoutEventStage(ImageLayout layout)
{
const ImageMemoryBarrierData &barrierData = kImageMemoryBarrierData[layout];
@@ -1198,12 +1164,12 @@ GLenum ConvertImageLayoutToGLImageLayout(ImageLayout layout)
return GL_NONE;
}
-VkImageLayout ConvertImageLayoutToVkImageLayout(Context *context, ImageLayout imageLayout)
+VkImageLayout ConvertImageLayoutToVkImageLayout(Renderer *renderer, ImageLayout imageLayout)
{
- const ImageMemoryBarrierData &transition = kImageMemoryBarrierData[imageLayout];
+ const ImageMemoryBarrierData &transition = renderer->getImageMemoryBarrierData(imageLayout);
VkImageLayout layout = transition.layout;
- if (ANGLE_LIKELY(context->getFeatures().supportsMixedReadWriteDepthStencilLayouts.enabled))
+ if (ANGLE_LIKELY(renderer->getFeatures().supportsMixedReadWriteDepthStencilLayouts.enabled))
{
return layout;
}
@@ -1226,17 +1192,28 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(Context *context, ImageLayout im
return layout;
}
-bool EventAndPipelineBarrierHaveMatchingStageFlags(
- const angle::PackedEnumMap<EventStage, VkPipelineStageFlags> &map,
+void InitializeImageLayoutAndMemoryBarrierDataMap(
+ angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> *map,
VkPipelineStageFlags supportedVulkanPipelineStageMask)
{
- // kImageMemoryBarrierData's dstStageMask should match EventStage's
+ *map = kImageMemoryBarrierData;
+ for (ImageMemoryBarrierData &barrierData : *map)
+ {
+ barrierData.srcStageMask &= supportedVulkanPipelineStageMask;
+ barrierData.dstStageMask &= supportedVulkanPipelineStageMask;
+ }
+}
+
+bool EventAndPipelineBarrierHaveMatchingStageFlags(
+ const angle::PackedEnumMap<EventStage, VkPipelineStageFlags> &eventStageMap,
+ const angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> &barrierDataMap)
+{
+ // mImageLayoutAndMemoryBarrierData's dstStageMask should match EventStage's
// kEventStageAndPipelineStageFlagsMap
- for (const ImageMemoryBarrierData &barrierData : kImageMemoryBarrierData)
+ for (const ImageMemoryBarrierData &barrierData : barrierDataMap)
{
if (barrierData.eventStage != EventStage::InvalidEnum &&
- map[barrierData.eventStage] !=
- (barrierData.dstStageMask & supportedVulkanPipelineStageMask))
+ eventStageMap[barrierData.eventStage] != barrierData.dstStageMask)
{
return false;
}
@@ -1715,7 +1692,7 @@ void CommandBufferHelperCommon::imageReadImpl(Context *context,
BarrierType barrierType,
ImageHelper *image)
{
- if (image->isReadBarrierNecessary(imageLayout))
+ if (image->isReadBarrierNecessary(context->getRenderer(), imageLayout))
{
updateImageLayoutAndBarrier(context, image, aspectFlags, imageLayout, barrierType);
}
@@ -2506,7 +2483,8 @@ void RenderPassCommandBufferHelper::finalizeDepthStencilImageLayout(Context *con
imageLayout == ImageLayout::DepthReadStencilWriteAllShadersDepthRead ||
imageLayout == ImageLayout::DepthReadStencilReadFragmentShaderRead ||
imageLayout == ImageLayout::DepthReadStencilReadAllShadersRead);
- barrierRequired = depthStencilImage->isReadBarrierNecessary(imageLayout);
+ barrierRequired =
+ depthStencilImage->isReadBarrierNecessary(context->getRenderer(), imageLayout);
}
}
else
@@ -2522,8 +2500,9 @@ void RenderPassCommandBufferHelper::finalizeDepthStencilImageLayout(Context *con
: ImageLayout::DepthWriteStencilWrite;
}
- barrierRequired = !isReadOnlyDepth || !isReadOnlyStencil ||
- depthStencilImage->isReadBarrierNecessary(imageLayout);
+ barrierRequired =
+ !isReadOnlyDepth || !isReadOnlyStencil ||
+ depthStencilImage->isReadBarrierNecessary(context->getRenderer(), imageLayout);
}
mAttachmentOps.setLayouts(mDepthStencilAttachmentIndex, imageLayout, imageLayout);
@@ -2582,7 +2561,7 @@ void RenderPassCommandBufferHelper::finalizeFragmentShadingRateImageLayout(Conte
ImageHelper *image = mFragmentShadingRateAtachment.getImage();
ImageLayout imageLayout = ImageLayout::FragmentShadingRateAttachmentReadOnly;
ASSERT(image && image->valid());
- if (image->isReadBarrierNecessary(imageLayout))
+ if (image->isReadBarrierNecessary(context->getRenderer(), imageLayout))
{
updateImageLayoutAndBarrier(context, image, VK_IMAGE_ASPECT_COLOR_BIT, imageLayout,
BarrierType::Event);
@@ -6062,7 +6041,7 @@ angle::Result ImageHelper::initExternal(Context *context,
imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
imageInfo.queueFamilyIndexCount = 0;
imageInfo.pQueueFamilyIndices = nullptr;
- imageInfo.initialLayout = ConvertImageLayoutToVkImageLayout(context, initialLayout);
+ imageInfo.initialLayout = ConvertImageLayoutToVkImageLayout(renderer, initialLayout);
mCurrentLayout = initialLayout;
mCurrentDeviceQueueIndex = kInvalidDeviceQueueIndex;
@@ -6297,6 +6276,7 @@ angle::Result ImageHelper::initializeNonZeroMemory(Context *context,
{
// If available, memory mapping should be used.
Renderer *renderer = context->getRenderer();
+
if ((flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)
{
// Wipe memory to an invalid value when the 'allocateNonZeroMemory' feature is enabled. The
@@ -6404,7 +6384,7 @@ angle::Result ImageHelper::initializeNonZeroMemory(Context *context,
clearValue.uint32[2] = kInitValue;
clearValue.uint32[3] = kInitValue;
- commandBuffer.clearColorImage(mImage, getCurrentLayout(context), clearValue, 1,
+ commandBuffer.clearColorImage(mImage, getCurrentLayout(renderer), clearValue, 1,
&subresource);
}
else
@@ -6413,7 +6393,7 @@ angle::Result ImageHelper::initializeNonZeroMemory(Context *context,
clearValue.depth = kInitValueFloat;
clearValue.stencil = kInitValue;
- commandBuffer.clearDepthStencilImage(mImage, getCurrentLayout(context), clearValue, 1,
+ commandBuffer.clearDepthStencilImage(mImage, getCurrentLayout(renderer), clearValue, 1,
&subresource);
}
}
@@ -6825,7 +6805,7 @@ angle::Result ImageHelper::initStaging(Context *context,
imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
imageInfo.queueFamilyIndexCount = 0;
imageInfo.pQueueFamilyIndices = nullptr;
- imageInfo.initialLayout = getCurrentLayout(context);
+ imageInfo.initialLayout = getCurrentLayout(context->getRenderer());
ANGLE_VK_TRY(context, mImage.init(context->getDevice(), imageInfo));
@@ -6921,9 +6901,9 @@ bool ImageHelper::isCombinedDepthStencilFormat() const
return (getAspectFlags() & kDepthStencilAspects) == kDepthStencilAspects;
}
-VkImageLayout ImageHelper::getCurrentLayout(Context *context) const
+VkImageLayout ImageHelper::getCurrentLayout(Renderer *renderer) const
{
- return ConvertImageLayoutToVkImageLayout(context, mCurrentLayout);
+ return ConvertImageLayoutToVkImageLayout(renderer, mCurrentLayout);
}
gl::Extents ImageHelper::getLevelExtents(LevelIndex levelVk) const
@@ -6996,7 +6976,7 @@ bool ImageHelper::usedByCurrentRenderPassAsAttachmentAndSampler(
mRenderPassUsageFlags[textureSamplerUsage];
}
-bool ImageHelper::isReadBarrierNecessary(ImageLayout newLayout) const
+bool ImageHelper::isReadBarrierNecessary(Renderer *renderer, ImageLayout newLayout) const
{
// If transitioning to a different layout, we need always need a barrier.
if (mCurrentLayout != newLayout)
@@ -7009,7 +6989,7 @@ bool ImageHelper::isReadBarrierNecessary(ImageLayout newLayout) const
// RAW (read-after-write) hazards always require a memory barrier. This can only happen if the
// layout (same as new layout) is writable which in turn is only possible if the image is
// simultaneously bound for shader write (i.e. the layout is GENERAL or SHARED_PRESENT).
- const ImageMemoryBarrierData &layoutData = kImageMemoryBarrierData[mCurrentLayout];
+ const ImageMemoryBarrierData &layoutData = renderer->getImageMemoryBarrierData(mCurrentLayout);
return HasResourceWriteAccess(layoutData.type);
}
@@ -7158,7 +7138,7 @@ gl::LevelIndex ImageHelper::toGLLevel(LevelIndex levelIndexVk) const
}
ANGLE_INLINE void ImageHelper::initImageMemoryBarrierStruct(
- Context *context,
+ Renderer *renderer,
VkImageAspectFlags aspectMask,
ImageLayout newLayout,
uint32_t newQueueFamilyIndex,
@@ -7167,14 +7147,15 @@ ANGLE_INLINE void ImageHelper::initImageMemoryBarrierStruct(
ASSERT(mCurrentDeviceQueueIndex.familyIndex() != QueueFamily::kInvalidIndex);
ASSERT(newQueueFamilyIndex != QueueFamily::kInvalidIndex);
- const ImageMemoryBarrierData &transitionFrom = kImageMemoryBarrierData[mCurrentLayout];
- const ImageMemoryBarrierData &transitionTo = kImageMemoryBarrierData[newLayout];
+ const ImageMemoryBarrierData &transitionFrom =
+ renderer->getImageMemoryBarrierData(mCurrentLayout);
+ const ImageMemoryBarrierData &transitionTo = renderer->getImageMemoryBarrierData(newLayout);
imageMemoryBarrier->sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
imageMemoryBarrier->srcAccessMask = transitionFrom.srcAccessMask;
imageMemoryBarrier->dstAccessMask = transitionTo.dstAccessMask;
- imageMemoryBarrier->oldLayout = ConvertImageLayoutToVkImageLayout(context, mCurrentLayout);
- imageMemoryBarrier->newLayout = ConvertImageLayoutToVkImageLayout(context, newLayout);
+ imageMemoryBarrier->oldLayout = ConvertImageLayoutToVkImageLayout(renderer, mCurrentLayout);
+ imageMemoryBarrier->newLayout = ConvertImageLayoutToVkImageLayout(renderer, newLayout);
imageMemoryBarrier->srcQueueFamilyIndex = mCurrentDeviceQueueIndex.familyIndex();
imageMemoryBarrier->dstQueueFamilyIndex = newQueueFamilyIndex;
imageMemoryBarrier->image = mImage.getHandle();
@@ -7197,6 +7178,7 @@ void ImageHelper::barrierImpl(Context *context,
CommandBufferT *commandBuffer,
VkSemaphore *acquireNextImageSemaphoreOut)
{
+ Renderer *renderer = context->getRenderer();
// mCurrentEvent must be invalid if useVkEventForImageBarrieris disabled.
ASSERT(context->getRenderer()->getFeatures().useVkEventForImageBarrier.enabled ||
!mCurrentEvent.valid());
@@ -7210,11 +7192,12 @@ void ImageHelper::barrierImpl(Context *context,
// future.
mCurrentEvent.release(context);
- const ImageMemoryBarrierData &transition = kImageMemoryBarrierData[mCurrentLayout];
- VkMemoryBarrier memoryBarrier = {};
- memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
- memoryBarrier.srcAccessMask = transition.srcAccessMask;
- memoryBarrier.dstAccessMask = transition.dstAccessMask;
+ const ImageMemoryBarrierData &transition =
+ renderer->getImageMemoryBarrierData(mCurrentLayout);
+ VkMemoryBarrier memoryBarrier = {};
+ memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+ memoryBarrier.srcAccessMask = transition.srcAccessMask;
+ memoryBarrier.dstAccessMask = transition.dstAccessMask;
commandBuffer->memoryBarrier(transition.srcStageMask, transition.dstStageMask,
memoryBarrier);
@@ -7224,14 +7207,15 @@ void ImageHelper::barrierImpl(Context *context,
// Make sure we never transition out of SharedPresent
ASSERT(mCurrentLayout != ImageLayout::SharedPresent || newLayout == ImageLayout::SharedPresent);
- const ImageMemoryBarrierData &transitionFrom = kImageMemoryBarrierData[mCurrentLayout];
- const ImageMemoryBarrierData &transitionTo = kImageMemoryBarrierData[newLayout];
+ const ImageMemoryBarrierData &transitionFrom =
+ renderer->getImageMemoryBarrierData(mCurrentLayout);
+ const ImageMemoryBarrierData &transitionTo = renderer->getImageMemoryBarrierData(newLayout);
VkImageMemoryBarrier imageMemoryBarrier = {};
- initImageMemoryBarrierStruct(context, aspectMask, newLayout, newDeviceQueueIndex.familyIndex(),
+ initImageMemoryBarrierStruct(renderer, aspectMask, newLayout, newDeviceQueueIndex.familyIndex(),
&imageMemoryBarrier);
- VkPipelineStageFlags dstStageMask = GetImageLayoutDstStageMask(context, transitionTo);
+ VkPipelineStageFlags dstStageMask = transitionTo.dstStageMask;
// Fallback to pipelineBarrier if there is no event tracking image.
// VkCmdWaitEvent requires the srcQueueFamilyIndex and dstQueueFamilyIndex members of any
@@ -7257,7 +7241,7 @@ void ImageHelper::barrierImpl(Context *context,
else
{
// There might be other shaderRead operations there other than the current layout.
- VkPipelineStageFlags srcStageMask = GetImageLayoutSrcStageMask(context, transitionFrom);
+ VkPipelineStageFlags srcStageMask = transitionFrom.srcStageMask;
if (mCurrentShaderReadStageMask)
{
srcStageMask |= mCurrentShaderReadStageMask;
@@ -7378,7 +7362,7 @@ void ImageHelper::recordReadBarrier(Context *context,
ImageLayout newLayout,
OutsideRenderPassCommandBufferHelper *commands)
{
- if (!isReadBarrierNecessary(newLayout))
+ if (!isReadBarrierNecessary(context->getRenderer(), newLayout))
{
return;
}
@@ -7410,7 +7394,8 @@ void ImageHelper::updateLayoutAndBarrier(Context *context,
ASSERT(!mBarrierQueueSerial.valid() ||
mBarrierQueueSerial.getIndex() != queueSerial.getIndex() ||
mBarrierQueueSerial.getSerial() <= queueSerial.getSerial());
- ASSERT(kImageMemoryBarrierData[newLayout].barrierIndex != PipelineStage::InvalidEnum);
+ ASSERT(renderer->getImageMemoryBarrierData(newLayout).barrierIndex !=
+ PipelineStage::InvalidEnum);
// mCurrentEvent must be invalid if useVkEventForImageBarrieris disabled.
ASSERT(renderer->getFeatures().useVkEventForImageBarrier.enabled || !mCurrentEvent.valid());
@@ -7443,7 +7428,8 @@ void ImageHelper::updateLayoutAndBarrier(Context *context,
return;
}
- const ImageMemoryBarrierData &layoutData = kImageMemoryBarrierData[mCurrentLayout];
+ const ImageMemoryBarrierData &layoutData =
+ renderer->getImageMemoryBarrierData(mCurrentLayout);
// RAR is not a hazard and doesn't require a barrier, especially as the image layout hasn't
// changed. The following asserts that such a barrier is not attempted.
ASSERT(HasResourceWriteAccess(layoutData.type));
@@ -7451,18 +7437,16 @@ void ImageHelper::updateLayoutAndBarrier(Context *context,
// No layout change, only memory barrier is required
if (barrierType == BarrierType::Event)
{
- eventBarriers->addMemoryEvent(renderer, mCurrentEvent,
- GetImageLayoutDstStageMask(context, layoutData),
+ eventBarriers->addMemoryEvent(renderer, mCurrentEvent, layoutData.dstStageMask,
layoutData.dstAccessMask);
// Garbage collect the event, which tracks GPU completion automatically.
eventCollector->emplace_back(std::move(mCurrentEvent));
}
else
{
- pipelineBarriers->mergeMemoryBarrier(
- layoutData.barrierIndex, GetImageLayoutSrcStageMask(context, layoutData),
- GetImageLayoutDstStageMask(context, layoutData), layoutData.srcAccessMask,
- layoutData.dstAccessMask);
+ pipelineBarriers->mergeMemoryBarrier(layoutData.barrierIndex, layoutData.dstStageMask,
+ layoutData.dstStageMask, layoutData.srcAccessMask,
+ layoutData.dstAccessMask);
// Release it. No need to garbage collect since we did not use the event here. ALl
// previous use of event should garbage tracked already.
@@ -7472,10 +7456,11 @@ void ImageHelper::updateLayoutAndBarrier(Context *context,
}
else
{
- const ImageMemoryBarrierData &transitionFrom = kImageMemoryBarrierData[mCurrentLayout];
- const ImageMemoryBarrierData &transitionTo = kImageMemoryBarrierData[newLayout];
- VkPipelineStageFlags srcStageMask = GetImageLayoutSrcStageMask(context, transitionFrom);
- VkPipelineStageFlags dstStageMask = GetImageLayoutDstStageMask(context, transitionTo);
+ const ImageMemoryBarrierData &transitionFrom =
+ renderer->getImageMemoryBarrierData(mCurrentLayout);
+ const ImageMemoryBarrierData &transitionTo = renderer->getImageMemoryBarrierData(newLayout);
+ VkPipelineStageFlags srcStageMask = transitionFrom.srcStageMask;
+ VkPipelineStageFlags dstStageMask = transitionTo.dstStageMask;
if (transitionFrom.layout == transitionTo.layout && IsShaderReadOnlyLayout(transitionTo) &&
mBarrierQueueSerial == queueSerial)
@@ -7512,10 +7497,10 @@ void ImageHelper::updateLayoutAndBarrier(Context *context,
else
{
const ImageMemoryBarrierData &layoutData =
- kImageMemoryBarrierData[mLastNonShaderReadOnlyLayout];
+ renderer->getImageMemoryBarrierData(mLastNonShaderReadOnlyLayout);
pipelineBarriers->mergeMemoryBarrier(
- transitionTo.barrierIndex, GetImageLayoutSrcStageMask(context, layoutData),
- dstStageMask, layoutData.srcAccessMask, transitionTo.dstAccessMask);
+ transitionTo.barrierIndex, layoutData.srcStageMask, dstStageMask,
+ layoutData.srcAccessMask, transitionTo.dstAccessMask);
}
mBarrierQueueSerial = queueSerial;
@@ -7532,7 +7517,7 @@ void ImageHelper::updateLayoutAndBarrier(Context *context,
else
{
VkImageMemoryBarrier imageMemoryBarrier = {};
- initImageMemoryBarrierStruct(context, aspectMask, newLayout,
+ initImageMemoryBarrierStruct(renderer, aspectMask, newLayout,
context->getDeviceQueueIndex().familyIndex(),
&imageMemoryBarrier);
@@ -7648,7 +7633,7 @@ void ImageHelper::setCurrentRefCountedEvent(Context *context, EventMaps &eventMa
mCurrentEvent = eventMaps.map[stage];
}
-void ImageHelper::clearColor(Context *context,
+void ImageHelper::clearColor(Renderer *renderer,
const VkClearColorValue &color,
LevelIndex baseMipLevelVk,
uint32_t levelCount,
@@ -7676,10 +7661,10 @@ void ImageHelper::clearColor(Context *context,
range.layerCount = 1;
}
- commandBuffer->clearColorImage(mImage, getCurrentLayout(context), color, 1, &range);
+ commandBuffer->clearColorImage(mImage, getCurrentLayout(renderer), color, 1, &range);
}
-void ImageHelper::clearDepthStencil(Context *context,
+void ImageHelper::clearDepthStencil(Renderer *renderer,
VkImageAspectFlags clearAspectFlags,
const VkClearDepthStencilValue &depthStencil,
LevelIndex baseMipLevelVk,
@@ -7707,11 +7692,11 @@ void ImageHelper::clearDepthStencil(Context *context,
range.layerCount = 1;
}
- commandBuffer->clearDepthStencilImage(mImage, getCurrentLayout(context), depthStencil, 1,
+ commandBuffer->clearDepthStencilImage(mImage, getCurrentLayout(renderer), depthStencil, 1,
&range);
}
-void ImageHelper::clear(Context *context,
+void ImageHelper::clear(Renderer *renderer,
VkImageAspectFlags aspectFlags,
const VkClearValue &value,
LevelIndex mipLevel,
@@ -7724,14 +7709,14 @@ void ImageHelper::clear(Context *context,
if (isDepthStencil)
{
- clearDepthStencil(context, aspectFlags, value.depthStencil, mipLevel, 1, baseArrayLayer,
+ clearDepthStencil(renderer, aspectFlags, value.depthStencil, mipLevel, 1, baseArrayLayer,
layerCount, commandBuffer);
}
else
{
ASSERT(!angleFormat.isBlock);
- clearColor(context, value.color, mipLevel, 1, baseArrayLayer, layerCount, commandBuffer);
+ clearColor(renderer, value.color, mipLevel, 1, baseArrayLayer, layerCount, commandBuffer);
}
}
@@ -7768,7 +7753,7 @@ angle::Result ImageHelper::clearEmulatedChannels(ContextVk *contextVk,
}
// static
-void ImageHelper::Copy(Context *context,
+void ImageHelper::Copy(Renderer *renderer,
ImageHelper *srcImage,
ImageHelper *dstImage,
const gl::Offset &srcOffset,
@@ -7780,8 +7765,8 @@ void ImageHelper::Copy(Context *context,
{
ASSERT(commandBuffer->valid() && srcImage->valid() && dstImage->valid());
- ASSERT(srcImage->getCurrentLayout(context) == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
- ASSERT(dstImage->getCurrentLayout(context) == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ ASSERT(srcImage->getCurrentLayout(renderer) == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ ASSERT(dstImage->getCurrentLayout(renderer) == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
VkImageCopy region = {};
region.srcSubresource = srcSubresource;
@@ -7796,8 +7781,9 @@ void ImageHelper::Copy(Context *context,
region.extent.height = copySize.height;
region.extent.depth = copySize.depth;
- commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(context),
- dstImage->getImage(), dstImage->getCurrentLayout(context), 1, &region);
+ commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(renderer),
+ dstImage->getImage(), dstImage->getCurrentLayout(renderer), 1,
+ &region);
}
// static
@@ -7817,6 +7803,7 @@ angle::Result ImageHelper::CopyImageSubData(const gl::Context *context,
GLsizei srcDepth)
{
ContextVk *contextVk = GetImpl(context);
+ Renderer *renderer = contextVk->getRenderer();
VkImageTiling srcTilingMode = srcImage->getTilingMode();
VkImageTiling destTilingMode = dstImage->getTilingMode();
@@ -7824,7 +7811,7 @@ angle::Result ImageHelper::CopyImageSubData(const gl::Context *context,
const gl::LevelIndex srcLevelGL = gl::LevelIndex(srcLevel);
const gl::LevelIndex dstLevelGL = gl::LevelIndex(dstLevel);
- if (CanCopyWithTransferForCopyImage(contextVk->getRenderer(), srcImage, srcTilingMode, dstImage,
+ if (CanCopyWithTransferForCopyImage(renderer, srcImage, srcTilingMode, dstImage,
destTilingMode))
{
bool isSrc3D = srcImage->getType() == VK_IMAGE_TYPE_3D;
@@ -7874,13 +7861,13 @@ angle::Result ImageHelper::CopyImageSubData(const gl::Context *context,
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
ASSERT(srcImage->valid() && dstImage->valid());
- ASSERT(srcImage->getCurrentLayout(contextVk) == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ||
- srcImage->getCurrentLayout(contextVk) == VK_IMAGE_LAYOUT_GENERAL);
- ASSERT(dstImage->getCurrentLayout(contextVk) == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ||
- dstImage->getCurrentLayout(contextVk) == VK_IMAGE_LAYOUT_GENERAL);
+ ASSERT(srcImage->getCurrentLayout(renderer) == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ||
+ srcImage->getCurrentLayout(renderer) == VK_IMAGE_LAYOUT_GENERAL);
+ ASSERT(dstImage->getCurrentLayout(renderer) == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ||
+ dstImage->getCurrentLayout(renderer) == VK_IMAGE_LAYOUT_GENERAL);
- commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(contextVk),
- dstImage->getImage(), dstImage->getCurrentLayout(contextVk), 1,
+ commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(renderer),
+ dstImage->getImage(), dstImage->getCurrentLayout(renderer), 1,
&region);
}
else if (!srcImage->getIntendedFormat().isBlock && !dstImage->getIntendedFormat().isBlock)
@@ -7920,6 +7907,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk,
LevelIndex baseLevel,
LevelIndex maxLevel)
{
+ Renderer *renderer = contextVk->getRenderer();
+
CommandBufferAccess access;
gl::LevelIndex baseLevelGL = toGLLevel(baseLevel);
access.onImageTransferWrite(baseLevelGL + 1, maxLevel.get(), 0, mLayerCount,
@@ -7957,7 +7946,7 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk,
if (mipLevel > baseLevel && mipLevel <= maxLevel)
{
barrier.subresourceRange.baseMipLevel = mipLevel.get() - 1;
- barrier.oldLayout = getCurrentLayout(contextVk);
+ barrier.oldLayout = getCurrentLayout(renderer);
barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
@@ -8489,7 +8478,7 @@ angle::Result ImageHelper::updateSubresourceOnHost(Context *context,
mCurrentLayout = ImageLayout::HostCopy;
}
else if (mCurrentLayout != ImageLayout::HostCopy &&
- !IsAnyLayout(getCurrentLayout(context), hostImageCopyProperties.pCopyDstLayouts,
+ !IsAnyLayout(getCurrentLayout(renderer), hostImageCopyProperties.pCopyDstLayouts,
hostImageCopyProperties.copyDstLayoutCount))
{
return angle::Result::Continue;
@@ -8510,7 +8499,7 @@ angle::Result ImageHelper::updateSubresourceOnHost(Context *context,
auto doCopy = [context, image = mImage.getHandle(), source, memoryRowLength, memoryImageHeight,
aspectMask, levelVk = toVkLevel(updateLevelGL), isArray, baseArrayLayer,
layerCount, offset, glExtents,
- layout = getCurrentLayout(context)](void *resultOut) {
+ layout = getCurrentLayout(renderer)](void *resultOut) {
ANGLE_TRACE_EVENT0("gpu.angle", "Upload image data on host");
ANGLE_UNUSED_VARIABLE(resultOut);
@@ -9717,7 +9706,7 @@ angle::Result ImageHelper::flushStagedUpdatesImpl(ContextVk *contextVk,
case UpdateSource::Clear:
case UpdateSource::ClearAfterInvalidate:
{
- clear(contextVk, update.data.clear.aspectFlags, update.data.clear.value,
+ clear(renderer, update.data.clear.aspectFlags, update.data.clear.value,
updateMipLevelVk, updateBaseLayer, updateLayerCount,
&commandBuffer->getCommandBuffer());
// Remember the latest operation is a clear call.
@@ -9755,7 +9744,7 @@ angle::Result ImageHelper::flushStagedUpdatesImpl(ContextVk *contextVk,
bufferAccess, &commandBuffer));
commandBuffer->getCommandBuffer().copyBufferToImage(
currentBuffer->getBuffer().getHandle(), mImage,
- getCurrentLayout(contextVk), 1, copyRegion);
+ getCurrentLayout(renderer), 1, copyRegion);
}
bool commandBufferWasFlushed = false;
ANGLE_TRY(contextVk->onCopyUpdate(currentBuffer->getSize(),
@@ -9783,8 +9772,8 @@ angle::Result ImageHelper::flushStagedUpdatesImpl(ContextVk *contextVk,
VkImageCopy *copyRegion = &update.data.image.copyRegion;
commandBuffer->getCommandBuffer().copyImage(
update.refCounted.image->get().getImage(),
- update.refCounted.image->get().getCurrentLayout(contextVk), mImage,
- getCurrentLayout(contextVk), 1, copyRegion);
+ update.refCounted.image->get().getCurrentLayout(renderer), mImage,
+ getCurrentLayout(renderer), 1, copyRegion);
onWrite(updateMipLevelGL, 1, updateBaseLayer, updateLayerCount,
copyRegion->dstSubresource.aspectMask);
break;
@@ -10223,6 +10212,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
uint8_t **outDataPtr)
{
ANGLE_TRACE_EVENT0("gpu.angle", "ImageHelper::copyImageDataToBuffer");
+ Renderer *renderer = contextVk->getRenderer();
const angle::Format &imageFormat = getActualFormat();
@@ -10273,7 +10263,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
OutsideRenderPassCommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
- commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(contextVk), bufferHandle, regionCount,
+ commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(renderer), bufferHandle, regionCount,
&regions);
// Track completion of this copy.
contextVk->trackImageWithOutsideRenderPassEvent(this);
@@ -10319,7 +10309,7 @@ angle::Result ImageHelper::copySurfaceImageToBuffer(DisplayVk *displayVk,
barrierImpl(displayVk, getAspectFlags(), ImageLayout::TransferSrc,
displayVk->getDeviceQueueIndex(), nullptr, &primaryCommandBuffer,
&acquireNextImageSemaphore);
- primaryCommandBuffer.copyImageToBuffer(mImage, getCurrentLayout(displayVk),
+ primaryCommandBuffer.copyImageToBuffer(mImage, getCurrentLayout(renderer),
bufferHelper->getBuffer().getHandle(), 1, &region);
ANGLE_VK_TRY(displayVk, primaryCommandBuffer.end());
@@ -10372,7 +10362,7 @@ angle::Result ImageHelper::copyBufferToSurfaceImage(DisplayVk *displayVk,
displayVk->getDeviceQueueIndex(), nullptr, &commandBuffer,
&acquireNextImageSemaphore);
commandBuffer.copyBufferToImage(bufferHelper->getBuffer().getHandle(), mImage,
- getCurrentLayout(displayVk), 1, &region);
+ getCurrentLayout(renderer), 1, &region);
ANGLE_VK_TRY(displayVk, commandBuffer.end());
@@ -10898,7 +10888,7 @@ angle::Result ImageHelper::readPixelsImpl(ContextVk *contextVk,
region.imageOffset = srcOffset;
region.imageSubresource = srcSubresource;
- copyCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(contextVk),
+ copyCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(renderer),
packBuffer.getBuffer().getHandle(), 1, &region);
contextVk->trackImageWithOutsideRenderPassEvent(this);
return angle::Result::Continue;
@@ -10952,7 +10942,7 @@ angle::Result ImageHelper::readPixelsImpl(ContextVk *contextVk,
OutsideRenderPassCommandBuffer *readbackCommandBuffer;
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(readbackAccess, &readbackCommandBuffer));
- readbackCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(contextVk),
+ readbackCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(renderer),
bufferHandle, 1, &region);
ANGLE_VK_PERF_WARNING(contextVk, GL_DEBUG_SEVERITY_HIGH, "GPU stall due to ReadPixels");
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index 1f6bc67df3..708c979330 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -167,7 +167,7 @@ ImageLayout GetImageLayoutFromGLImageLayout(Context *context, GLenum layout);
GLenum ConvertImageLayoutToGLImageLayout(ImageLayout imageLayout);
-VkImageLayout ConvertImageLayoutToVkImageLayout(Context *context, ImageLayout imageLayout);
+VkImageLayout ConvertImageLayoutToVkImageLayout(Renderer *renderer, ImageLayout imageLayout);
// A dynamic buffer is conceptually an infinitely long buffer. Each time you write to the buffer,
// you will always write to a previously unused portion. After a series of writes, you must flush
@@ -753,6 +753,41 @@ using PipelineStagesMask = angle::PackedEnumBitSet<PipelineStage, uint32_t>;
PipelineStage GetPipelineStage(gl::ShaderType stage);
+struct ImageMemoryBarrierData
+{
+ const char *name;
+
+ // The Vk layout corresponding to the ImageLayout key.
+ VkImageLayout layout;
+
+ // The stage in which the image is used (or Bottom/Top if not using any specific stage). Unless
+ // Bottom/Top (Bottom used for transition to and Top used for transition from), the two values
+ // should match.
+ VkPipelineStageFlags dstStageMask;
+ VkPipelineStageFlags srcStageMask;
+ // Access mask when transitioning into this layout.
+ VkAccessFlags dstAccessMask;
+ // Access mask when transitioning out from this layout. Note that source access mask never
+ // needs a READ bit, as WAR hazards don't need memory barriers (just execution barriers).
+ VkAccessFlags srcAccessMask;
+ // Read or write.
+ ResourceAccess type;
+ // *CommandBufferHelper track an array of PipelineBarriers. This indicates which array element
+ // this should be merged into. Right now we track individual barrier for every PipelineStage. If
+ // layout has a single stage mask bit, we use that stage as index. If layout has multiple stage
+ // mask bits, we pick the lowest stage as the index since it is the first stage that needs
+ // barrier.
+ PipelineStage barrierIndex;
+ EventStage eventStage;
+};
+// Initialize ImageLayout to ImageMemoryBarrierData mapping table.
+void InitializeImageLayoutAndMemoryBarrierDataMap(
+ angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> *mapping,
+ VkPipelineStageFlags supportedVulkanPipelineStageMask);
+bool EventAndPipelineBarrierHaveMatchingStageFlags(
+ const angle::PackedEnumMap<EventStage, VkPipelineStageFlags> &eventStageMap,
+ const angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> &barrierDataMap);
+
// This wraps data and API for vkCmdPipelineBarrier call
class PipelineBarrier : angle::NonCopyable
{
@@ -2306,7 +2341,7 @@ class ImageHelper final : public Resource, public angle::Subject
mCurrentLayout = newLayout;
}
ImageLayout getCurrentImageLayout() const { return mCurrentLayout; }
- VkImageLayout getCurrentLayout(Context *context) const;
+ VkImageLayout getCurrentLayout(Renderer *renderer) const;
const QueueSerial &getBarrierQueueSerial() const { return mBarrierQueueSerial; }
gl::Extents getLevelExtents(LevelIndex levelVk) const;
@@ -2323,7 +2358,7 @@ class ImageHelper final : public Resource, public angle::Subject
bool hasRenderPassUsageFlag(RenderPassUsage flag) const;
bool usedByCurrentRenderPassAsAttachmentAndSampler(RenderPassUsage textureSamplerUsage) const;
- static void Copy(Context *context,
+ static void Copy(Renderer *renderer,
ImageHelper *srcImage,
ImageHelper *dstImage,
const gl::Offset &srcOffset,
@@ -2522,7 +2557,7 @@ class ImageHelper final : public Resource, public angle::Subject
}
// This function can be used to prevent issuing redundant layout transition commands.
- bool isReadBarrierNecessary(ImageLayout newLayout) const;
+ bool isReadBarrierNecessary(Renderer *renderer, ImageLayout newLayout) const;
bool isReadSubresourceBarrierNecessary(ImageLayout newLayout,
gl::LevelIndex levelStart,
uint32_t levelCount,
@@ -2841,7 +2876,7 @@ class ImageHelper final : public Resource, public angle::Subject
// extents are not known).
void removeSupersededUpdates(ContextVk *contextVk, const gl::TexLevelMask skipLevelsAllFaces);
- void initImageMemoryBarrierStruct(Context *context,
+ void initImageMemoryBarrierStruct(Renderer *renderer,
VkImageAspectFlags aspectMask,
ImageLayout newLayout,
uint32_t newQueueFamilyIndex,
@@ -2876,7 +2911,7 @@ class ImageHelper final : public Resource, public angle::Subject
bool verifyEmulatedClearsAreBeforeOtherUpdates(const std::vector<SubresourceUpdate> &updates);
// Clear either color or depth/stencil based on image format.
- void clear(Context *context,
+ void clear(Renderer *renderer,
VkImageAspectFlags aspectFlags,
const VkClearValue &value,
LevelIndex mipLevel,
@@ -2884,7 +2919,7 @@ class ImageHelper final : public Resource, public angle::Subject
uint32_t layerCount,
OutsideRenderPassCommandBuffer *commandBuffer);
- void clearColor(Context *context,
+ void clearColor(Renderer *renderer,
const VkClearColorValue &color,
LevelIndex baseMipLevelVk,
uint32_t levelCount,
@@ -2892,7 +2927,7 @@ class ImageHelper final : public Resource, public angle::Subject
uint32_t layerCount,
OutsideRenderPassCommandBuffer *commandBuffer);
- void clearDepthStencil(Context *context,
+ void clearDepthStencil(Renderer *renderer,
VkImageAspectFlags clearAspectFlags,
const VkClearDepthStencilValue &depthStencil,
LevelIndex baseMipLevelVk,
@@ -3859,11 +3894,6 @@ enum class PresentMode
VkPresentModeKHR ConvertPresentModeToVkPresentMode(PresentMode presentMode);
PresentMode ConvertVkPresentModeToPresentMode(VkPresentModeKHR vkPresentMode);
-
-bool EventAndPipelineBarrierHaveMatchingStageFlags(
- const angle::PackedEnumMap<EventStage, VkPipelineStageFlags> &map,
- VkPipelineStageFlags supportedVulkanPipelineStageMask);
-
} // namespace vk
} // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/vk_ref_counted_event.cpp b/src/libANGLE/renderer/vulkan/vk_ref_counted_event.cpp
index 07dd8cb3ad..fe23462334 100644
--- a/src/libANGLE/renderer/vulkan/vk_ref_counted_event.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_ref_counted_event.cpp
@@ -42,9 +42,7 @@ constexpr angle::PackedEnumMap<EventStage, VkPipelineStageFlags>
{EventStage::AllFragmentTestAndAllShaders,
kAllShadersPipelineStageFlags | kAllDepthStencilPipelineStageFlags},
{EventStage::TransferAndComputeShader,
- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT},
- {EventStage::AllCommands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT},
- {EventStage::BottomOfPipe, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT}};
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT}};
void DestroyRefCountedEvents(VkDevice device, RefCountedEventCollector &events)
{
@@ -65,9 +63,6 @@ void InitializeEventAndPipelineStagesMap(
{
flag &= supportedVulkanPipelineStageMask;
}
- // kEventStageAndPipelineStageFlagsMap supposedly should match the value in dstStageMask of
- // kImageMemoryBarrierData
- ASSERT(EventAndPipelineBarrierHaveMatchingStageFlags(*map, supportedVulkanPipelineStageMask));
}
bool RefCountedEvent::init(Context *context, EventStage eventStage)
diff --git a/src/libANGLE/renderer/vulkan/vk_ref_counted_event.h b/src/libANGLE/renderer/vulkan/vk_ref_counted_event.h
index cb761fa53f..087407326b 100644
--- a/src/libANGLE/renderer/vulkan/vk_ref_counted_event.h
+++ b/src/libANGLE/renderer/vulkan/vk_ref_counted_event.h
@@ -69,9 +69,7 @@ enum class EventStage : uint32_t
AllFragmentTestAndFragmentShader = 12,
AllFragmentTestAndAllShaders = 13,
TransferAndComputeShader = 14,
- AllCommands = 15,
- BottomOfPipe = 16,
- InvalidEnum = 17,
+ InvalidEnum = 15,
EnumCount = InvalidEnum,
};
diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.cpp b/src/libANGLE/renderer/vulkan/vk_renderer.cpp
index 2ba6336bf0..f71eadc448 100644
--- a/src/libANGLE/renderer/vulkan/vk_renderer.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_renderer.cpp
@@ -1464,7 +1464,7 @@ Renderer::Renderer()
mPipelineCacheInitialized(false),
mValidationMessageCount(0),
mCommandProcessor(this, &mCommandQueue),
- mSupportedVulkanPipelineStageMask(0),
+ mSupportedBufferWritePipelineStageMask(0),
mSupportedVulkanShaderStageMask(0),
mMemoryAllocationTracker(MemoryAllocationTracker(this)),
mPlaceHolderDescriptorSetLayout(nullptr)
@@ -3610,6 +3610,10 @@ angle::Result Renderer::createDeviceAndQueue(vk::Context *context, uint32_t queu
VkPipelineStageFlags unsupportedStages = 0;
mSupportedVulkanShaderStageMask =
VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT;
+ mSupportedBufferWritePipelineStageMask =
+ VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
+
if (!mPhysicalDeviceFeatures.tessellationShader)
{
unsupportedStages |= VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
@@ -3619,6 +3623,9 @@ angle::Result Renderer::createDeviceAndQueue(vk::Context *context, uint32_t queu
{
mSupportedVulkanShaderStageMask |=
VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+ mSupportedBufferWritePipelineStageMask |=
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;
}
if (!mPhysicalDeviceFeatures.geometryShader)
{
@@ -3627,10 +3634,22 @@ angle::Result Renderer::createDeviceAndQueue(vk::Context *context, uint32_t queu
else
{
mSupportedVulkanShaderStageMask |= VK_SHADER_STAGE_GEOMETRY_BIT;
+ mSupportedBufferWritePipelineStageMask |= VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
}
- mSupportedVulkanPipelineStageMask = ~unsupportedStages;
- InitializeEventAndPipelineStagesMap(&mEventStageAndPipelineStageFlagsMap,
- mSupportedVulkanPipelineStageMask);
+
+ if (getFeatures().supportsTransformFeedbackExtension.enabled)
+ {
+ mSupportedBufferWritePipelineStageMask |= VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
+ }
+
+ // Initialize the barrierData tables by removing unsupported pipeline stage bits
+ InitializeEventAndPipelineStagesMap(&mEventStageAndPipelineStageFlagsMap, ~unsupportedStages);
+ InitializeImageLayoutAndMemoryBarrierDataMap(&mImageLayoutAndMemoryBarrierDataMap,
+ ~unsupportedStages);
+ // mEventStageAndPipelineStageFlagsMap supposedly should match the value in dstStageMask of
+ // mImageLayoutAndMemoryBarrierData
+ ASSERT(EventAndPipelineBarrierHaveMatchingStageFlags(mEventStageAndPipelineStageFlagsMap,
+ mImageLayoutAndMemoryBarrierDataMap));
ANGLE_TRY(initializeMemoryAllocator(context));
diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.h b/src/libANGLE/renderer/vulkan/vk_renderer.h
index 15fb13dde0..984f3cb3d9 100644
--- a/src/libANGLE/renderer/vulkan/vk_renderer.h
+++ b/src/libANGLE/renderer/vulkan/vk_renderer.h
@@ -518,10 +518,11 @@ class Renderer : angle::NonCopyable
// Log cache stats for all caches
void logCacheStats() const;
- VkPipelineStageFlags getSupportedVulkanPipelineStageMask() const
+ VkPipelineStageFlags getSupportedBufferWritePipelineStageMask() const
{
- return mSupportedVulkanPipelineStageMask;
+ return mSupportedBufferWritePipelineStageMask;
}
+
VkPipelineStageFlags getPipelineStageMask(EventStage eventStage) const
{
return mEventStageAndPipelineStageFlagsMap[eventStage];
@@ -530,6 +531,10 @@ class Renderer : angle::NonCopyable
{
return mEventStageAndPipelineStageFlagsMap[refCountedEvent.getEventStage()];
}
+ const ImageMemoryBarrierData &getImageMemoryBarrierData(ImageLayout layout) const
+ {
+ return mImageLayoutAndMemoryBarrierDataMap[layout];
+ }
VkShaderStageFlags getSupportedVulkanShaderStageMask() const
{
@@ -1083,10 +1088,11 @@ class Renderer : angle::NonCopyable
// Note that this mask can have bits set that don't correspond to valid stages, so it's
// strictly only useful for masking out unsupported stages in an otherwise valid set of
// stages.
- VkPipelineStageFlags mSupportedVulkanPipelineStageMask;
+ VkPipelineStageFlags mSupportedBufferWritePipelineStageMask;
VkShaderStageFlags mSupportedVulkanShaderStageMask;
// The 1:1 mapping between EventStage and VkPipelineStageFlags
angle::PackedEnumMap<EventStage, VkPipelineStageFlags> mEventStageAndPipelineStageFlagsMap;
+ angle::PackedEnumMap<ImageLayout, ImageMemoryBarrierData> mImageLayoutAndMemoryBarrierDataMap;
// Use thread pool to compress cache data.
std::shared_ptr<angle::WaitableEvent> mCompressEvent;
diff --git a/src/tests/perf_tests/TracePerfTest.cpp b/src/tests/perf_tests/TracePerfTest.cpp
index 567f92e49c..02bf8d563b 100644
--- a/src/tests/perf_tests/TracePerfTest.cpp
+++ b/src/tests/perf_tests/TracePerfTest.cpp
@@ -1761,6 +1761,16 @@ TracePerfTest::TracePerfTest(std::unique_ptr<const TracePerfParams> params)
}
}
+ if (traceNameIs("modern_combat_5"))
+ {
+ if (IsPixel6() && !IsAndroid14OrNewer())
+ {
+ skipTest(
+ "https://issuetracker.google.com/42267261 Causing thermal failures on Pixel 6 with "
+ "Android 13");
+ }
+ }
+
if (IsGalaxyS22())
{
if (traceNameIs("cod_mobile") || traceNameIs("dota_underlords") ||
diff --git a/src/tests/test_utils/angle_test_instantiate.cpp b/src/tests/test_utils/angle_test_instantiate.cpp
index 45dffbe5f0..e8ccd7346a 100644
--- a/src/tests/test_utils/angle_test_instantiate.cpp
+++ b/src/tests/test_utils/angle_test_instantiate.cpp
@@ -131,20 +131,25 @@ bool IsAndroidDevice(const std::string &deviceName)
return false;
}
-bool IsAndroid9OrNewer()
+bool IsAndroidSdkLevelOrNewer(int level)
{
if (!IsAndroid())
{
return false;
}
SystemInfo *systemInfo = GetTestSystemInfo();
- if (systemInfo->androidSdkLevel >= 28)
+ if (systemInfo->androidSdkLevel >= level)
{
return true;
}
return false;
}
+bool IsAndroid9OrNewer()
+{
+ return IsAndroidSdkLevelOrNewer(28);
+}
+
GPUDeviceInfo *GetActiveGPUDeviceInfo()
{
SystemInfo *systemInfo = GetTestSystemInfo();
@@ -319,6 +324,11 @@ bool IsNVIDIAShield()
return IsAndroidDevice("SHIELD Android TV");
}
+bool IsAndroid14OrNewer()
+{
+ return IsAndroidSdkLevelOrNewer(34);
+}
+
bool IsIntel()
{
return HasSystemVendorID(kVendorID_Intel);
diff --git a/src/tests/test_utils/angle_test_instantiate.h b/src/tests/test_utils/angle_test_instantiate.h
index 70bee1c90f..279b74d0d2 100644
--- a/src/tests/test_utils/angle_test_instantiate.h
+++ b/src/tests/test_utils/angle_test_instantiate.h
@@ -37,6 +37,9 @@ bool IsPixel6();
bool IsGalaxyS22();
bool IsNVIDIAShield();
+// Android versions
+bool IsAndroid14OrNewer();
+
// GPU vendors.
bool IsIntel();
bool IsAMD();