diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libANGLE/renderer/vulkan/ContextVk.cpp | 16 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp | 8 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/TextureVk.cpp | 11 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/UtilsVk.cpp | 27 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_cache_utils.cpp | 58 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_cache_utils.h | 4 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_helpers.cpp | 250 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_helpers.h | 56 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_ref_counted_event.cpp | 7 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_ref_counted_event.h | 4 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_renderer.cpp | 27 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_renderer.h | 12 | ||||
-rw-r--r-- | src/tests/perf_tests/TracePerfTest.cpp | 10 | ||||
-rw-r--r-- | src/tests/test_utils/angle_test_instantiate.cpp | 14 | ||||
-rw-r--r-- | src/tests/test_utils/angle_test_instantiate.h | 3 |
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, ®ion); + mImage->getCurrentLayout(contextVk->getRenderer()), 1, + ®ion); contextVk->trackImageWithOutsideRenderPassEvent(mImage); @@ -2465,9 +2466,9 @@ angle::Result TextureVk::copyAndStageImageData(ContextVk *contextVk, copyRegion.dstSubresource.mipLevel = levelVk.get(); gl_vk::GetExtent(levelExtents, ©Region.extent); - commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(contextVk), + commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(renderer), stagingImage->get().getImage(), - stagingImage->get().getCurrentLayout(contextVk), 1, ©Region); + stagingImage->get().getCurrentLayout(renderer), 1, ©Region); } 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, ®ion); + depthStencilImage->getCurrentLayout(renderer), 1, ®ion); 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 ¶ms) { + 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 ¶ms) { + 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, ®ion); + commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(renderer), + dstImage->getImage(), dstImage->getCurrentLayout(renderer), 1, + ®ion); } // 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, ®ion); } 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, ®ions); // 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, ®ion); 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, ®ion); + getCurrentLayout(renderer), 1, ®ion); 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, ®ion); 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, ®ion); 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(); |