Commit fb288312 by Charlie Lao Committed by Commit Bot

Vulkan: Consolidate mReadOnlyDepthStencilMode to mRenderPassUsageFlags

Since now ImageHelper object has a mRenderPassUsageFlags tracking how it is been used by current RenderPassCommands, we can consolidate mReadOnlyDepthStencilMode into a bit in the mRenderPassUsageFlags. The read only mode is just a special attachment mode, so this makes code more consistent and able to get rid of the extra dword for mReadOnlyDepthStencilMode. Bug: b/181797383 Change-Id: Ie9b7be1c18c392e5b2712bdae6ab6506de8d6d34 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2821942 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 5eac3169
...@@ -1489,7 +1489,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( ...@@ -1489,7 +1489,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
remainingShaderBits.reset(firstShader); remainingShaderBits.reset(firstShader);
remainingShaderBits.reset(lastShader); remainingShaderBits.reset(lastShader);
if (image.hasRenderPassUseFlag(vk::RenderPassUsage::RenderTargetAttachment)) if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::RenderTargetAttachment))
{ {
// Right now we set this flag only when RenderTargetAttachment is set since we do // Right now we set this flag only when RenderTargetAttachment is set since we do
// not track all textures in the renderpass. // not track all textures in the renderpass.
...@@ -1497,8 +1497,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( ...@@ -1497,8 +1497,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
if (image.isDepthOrStencil()) if (image.isDepthOrStencil())
{ {
if (mRenderPassCommands->started() && if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::ReadOnlyAttachment))
mRenderPassCommands->isReadOnlyDepthMode())
{ {
textureLayout = vk::ImageLayout::DepthStencilReadOnly; textureLayout = vk::ImageLayout::DepthStencilReadOnly;
} }
...@@ -4579,7 +4578,8 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context) ...@@ -4579,7 +4578,8 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context)
if (hasStartedRenderPass()) if (hasStartedRenderPass())
{ {
if (!mRenderPassCommands->isReadOnlyDepthMode()) if (!textureVk->getImage().hasRenderPassUsageFlag(
vk::RenderPassUsage::ReadOnlyAttachment))
{ {
// To enter depth feedback loop, we must flush and start a new renderpass. // To enter depth feedback loop, we must flush and start a new renderpass.
// Otherwise it will stick with writable layout and cause validation error. // Otherwise it will stick with writable layout and cause validation error.
......
...@@ -875,7 +875,6 @@ CommandBufferHelper::CommandBufferHelper() ...@@ -875,7 +875,6 @@ CommandBufferHelper::CommandBufferHelper()
mRebindTransformFeedbackBuffers(false), mRebindTransformFeedbackBuffers(false),
mIsTransformFeedbackActiveUnpaused(false), mIsTransformFeedbackActiveUnpaused(false),
mIsRenderPassCommandBuffer(false), mIsRenderPassCommandBuffer(false),
mReadOnlyDepthStencilMode(false),
mHasShaderStorageOutput(false), mHasShaderStorageOutput(false),
mHasGLMemoryBarrierIssued(false), mHasGLMemoryBarrierIssued(false),
mDepthAccess(ResourceAccess::Unused), mDepthAccess(ResourceAccess::Unused),
...@@ -939,7 +938,6 @@ void CommandBufferHelper::reset() ...@@ -939,7 +938,6 @@ void CommandBufferHelper::reset()
mRenderPassUsedImages.clear(); mRenderPassUsedImages.clear();
mDepthStencilImage = nullptr; mDepthStencilImage = nullptr;
mDepthStencilResolveImage = nullptr; mDepthStencilResolveImage = nullptr;
mReadOnlyDepthStencilMode = false;
mColorImages.reset(); mColorImages.reset();
mColorResolveImages.reset(); mColorResolveImages.reset();
mImageOptimizeForPresent = nullptr; mImageOptimizeForPresent = nullptr;
...@@ -1204,6 +1202,37 @@ bool CommandBufferHelper::onDepthStencilAccess(ResourceAccess access, ...@@ -1204,6 +1202,37 @@ bool CommandBufferHelper::onDepthStencilAccess(ResourceAccess access,
} }
} }
void CommandBufferHelper::updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode)
{
ASSERT(mIsRenderPassCommandBuffer);
ASSERT(mRenderPassStarted);
if (mDepthStencilImage)
{
if (readOnlyDepthStencilMode)
{
mDepthStencilImage->setRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment);
}
else
{
mDepthStencilImage->clearRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment);
}
}
if (mDepthStencilResolveImage)
{
if (readOnlyDepthStencilMode)
{
mDepthStencilResolveImage->setRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment);
}
else
{
mDepthStencilResolveImage->clearRenderPassUsageFlag(
RenderPassUsage::ReadOnlyAttachment);
}
}
}
void CommandBufferHelper::restoreDepthContent() void CommandBufferHelper::restoreDepthContent()
{ {
// Note that the image may have been deleted since the render pass has started. // Note that the image may have been deleted since the render pass has started.
...@@ -1338,7 +1367,7 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context) ...@@ -1338,7 +1367,7 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context)
? mDepthStencilImage->isReadBarrierNecessary(imageLayout) ? mDepthStencilImage->isReadBarrierNecessary(imageLayout)
: true; : true;
} }
else if (mReadOnlyDepthStencilMode) else if (mDepthStencilImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment))
{ {
imageLayout = ImageLayout::DepthStencilReadOnly; imageLayout = ImageLayout::DepthStencilReadOnly;
barrierRequired = mDepthStencilImage->isReadBarrierNecessary(imageLayout); barrierRequired = mDepthStencilImage->isReadBarrierNecessary(imageLayout);
...@@ -1360,7 +1389,7 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context) ...@@ -1360,7 +1389,7 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context)
updateImageLayoutAndBarrier(context, mDepthStencilImage, aspectFlags, imageLayout); updateImageLayoutAndBarrier(context, mDepthStencilImage, aspectFlags, imageLayout);
} }
if (!mReadOnlyDepthStencilMode) if (!mDepthStencilImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment))
{ {
ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid); ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid);
const PackedAttachmentOpsDesc &dsOps = mAttachmentOps[mDepthStencilAttachmentIndex]; const PackedAttachmentOpsDesc &dsOps = mAttachmentOps[mDepthStencilAttachmentIndex];
...@@ -1389,7 +1418,7 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex ...@@ -1389,7 +1418,7 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex
{ {
ASSERT(mIsRenderPassCommandBuffer); ASSERT(mIsRenderPassCommandBuffer);
ASSERT(mDepthStencilImage); ASSERT(mDepthStencilImage);
ASSERT(!mReadOnlyDepthStencilMode); ASSERT(!mDepthStencilResolveImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment));
ImageLayout imageLayout = ImageLayout::DepthStencilResolveAttachment; ImageLayout imageLayout = ImageLayout::DepthStencilResolveAttachment;
const angle::Format &format = mDepthStencilResolveImage->getFormat().actualImageFormat(); const angle::Format &format = mDepthStencilResolveImage->getFormat().actualImageFormat();
...@@ -1398,7 +1427,7 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex ...@@ -1398,7 +1427,7 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex
updateImageLayoutAndBarrier(context, mDepthStencilResolveImage, aspectFlags, imageLayout); updateImageLayoutAndBarrier(context, mDepthStencilResolveImage, aspectFlags, imageLayout);
if (!mReadOnlyDepthStencilMode) if (!mDepthStencilResolveImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment))
{ {
ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid); ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid);
const PackedAttachmentOpsDesc &dsOps = mAttachmentOps[mDepthStencilAttachmentIndex]; const PackedAttachmentOpsDesc &dsOps = mAttachmentOps[mDepthStencilAttachmentIndex];
...@@ -1427,7 +1456,7 @@ void CommandBufferHelper::finalizeImageLayout(Context *context, const ImageHelpe ...@@ -1427,7 +1456,7 @@ void CommandBufferHelper::finalizeImageLayout(Context *context, const ImageHelpe
{ {
ASSERT(mIsRenderPassCommandBuffer); ASSERT(mIsRenderPassCommandBuffer);
if (image->hasRenderPassUseFlag(RenderPassUsage::RenderTargetAttachment)) if (image->hasRenderPassUsageFlag(RenderPassUsage::RenderTargetAttachment))
{ {
for (PackedAttachmentIndex index = kAttachmentIndexZero; index < mColorImagesCount; ++index) for (PackedAttachmentIndex index = kAttachmentIndexZero; index < mColorImagesCount; ++index)
{ {
...@@ -1537,7 +1566,7 @@ void CommandBufferHelper::endRenderPass(ContextVk *contextVk) ...@@ -1537,7 +1566,7 @@ void CommandBufferHelper::endRenderPass(ContextVk *contextVk)
// For read only depth stencil, we can use StoreOpNone if available. DONT_CARE is still // For read only depth stencil, we can use StoreOpNone if available. DONT_CARE is still
// preferred, so do this after finish the DONT_CARE handling. // preferred, so do this after finish the DONT_CARE handling.
if (mReadOnlyDepthStencilMode && if (dsOps.initialLayout == static_cast<uint16_t>(ImageLayout::DepthStencilReadOnly) &&
contextVk->getFeatures().supportsRenderPassStoreOpNoneQCOM.enabled) contextVk->getFeatures().supportsRenderPassStoreOpNoneQCOM.enabled)
{ {
if (dsOps.storeOp == RenderPassStoreOp::Store) if (dsOps.storeOp == RenderPassStoreOp::Store)
...@@ -1564,7 +1593,7 @@ void CommandBufferHelper::endRenderPass(ContextVk *contextVk) ...@@ -1564,7 +1593,7 @@ void CommandBufferHelper::endRenderPass(ContextVk *contextVk)
} }
// Ensure we don't write to a read-only RenderPass. (ReadOnly -> !Write) // Ensure we don't write to a read-only RenderPass. (ReadOnly -> !Write)
ASSERT(!mReadOnlyDepthStencilMode || ASSERT(dsOps.initialLayout != static_cast<uint16_t>(ImageLayout::DepthStencilReadOnly) ||
(mDepthAccess != ResourceAccess::Write && mStencilAccess != ResourceAccess::Write)); (mDepthAccess != ResourceAccess::Write && mStencilAccess != ResourceAccess::Write));
// Do depth stencil layout change. // Do depth stencil layout change.
...@@ -3719,7 +3748,7 @@ void ImageHelper::resetCachedProperties() ...@@ -3719,7 +3748,7 @@ void ImageHelper::resetCachedProperties()
mLevelCount = 0; mLevelCount = 0;
mExternalFormat = 0; mExternalFormat = 0;
mCurrentSingleClearValue.reset(); mCurrentSingleClearValue.reset();
mRenderPassUseFlags.reset(); mRenderPassUsageFlags.reset();
setEntireContentUndefined(); setEntireContentUndefined();
} }
...@@ -4499,23 +4528,28 @@ bool ImageHelper::isDepthOrStencil() const ...@@ -4499,23 +4528,28 @@ bool ImageHelper::isDepthOrStencil() const
void ImageHelper::setRenderPassUsageFlag(RenderPassUsage flag) void ImageHelper::setRenderPassUsageFlag(RenderPassUsage flag)
{ {
mRenderPassUseFlags.set(flag); mRenderPassUsageFlags.set(flag);
}
void ImageHelper::clearRenderPassUsageFlag(RenderPassUsage flag)
{
mRenderPassUsageFlags.reset(flag);
} }
void ImageHelper::resetRenderPassUsageFlags() void ImageHelper::resetRenderPassUsageFlags()
{ {
mRenderPassUseFlags.reset(); mRenderPassUsageFlags.reset();
} }
bool ImageHelper::hasRenderPassUseFlag(RenderPassUsage flag) const bool ImageHelper::hasRenderPassUsageFlag(RenderPassUsage flag) const
{ {
return mRenderPassUseFlags.test(flag); return mRenderPassUsageFlags.test(flag);
} }
bool ImageHelper::usedByCurrentRenderPassAsAttachmentAndSampler() const bool ImageHelper::usedByCurrentRenderPassAsAttachmentAndSampler() const
{ {
return mRenderPassUseFlags[RenderPassUsage::RenderTargetAttachment] && return mRenderPassUsageFlags[RenderPassUsage::RenderTargetAttachment] &&
mRenderPassUseFlags[RenderPassUsage::TextureSampler]; mRenderPassUsageFlags[RenderPassUsage::TextureSampler];
} }
bool ImageHelper::isReadBarrierNecessary(ImageLayout newLayout) const bool ImageHelper::isReadBarrierNecessary(ImageLayout newLayout) const
......
...@@ -1100,12 +1100,7 @@ class CommandBufferHelper : angle::NonCopyable ...@@ -1100,12 +1100,7 @@ class CommandBufferHelper : angle::NonCopyable
void endRenderPass(ContextVk *contextVk); void endRenderPass(ContextVk *contextVk);
void updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode) void updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode);
{
ASSERT(mIsRenderPassCommandBuffer);
ASSERT(mRenderPassStarted);
mReadOnlyDepthStencilMode = readOnlyDepthStencilMode;
}
void beginTransformFeedback(size_t validBufferCount, void beginTransformFeedback(size_t validBufferCount,
const VkBuffer *counterBuffers, const VkBuffer *counterBuffers,
...@@ -1190,8 +1185,6 @@ class CommandBufferHelper : angle::NonCopyable ...@@ -1190,8 +1185,6 @@ class CommandBufferHelper : angle::NonCopyable
VK_ATTACHMENT_LOAD_OP_CLEAR; VK_ATTACHMENT_LOAD_OP_CLEAR;
} }
bool isReadOnlyDepthMode() const { return mReadOnlyDepthStencilMode; }
void addCommandDiagnostics(ContextVk *contextVk); void addCommandDiagnostics(ContextVk *contextVk);
const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; } const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; }
...@@ -1259,7 +1252,6 @@ class CommandBufferHelper : angle::NonCopyable ...@@ -1259,7 +1252,6 @@ class CommandBufferHelper : angle::NonCopyable
bool mIsTransformFeedbackActiveUnpaused; bool mIsTransformFeedbackActiveUnpaused;
bool mIsRenderPassCommandBuffer; bool mIsRenderPassCommandBuffer;
bool mReadOnlyDepthStencilMode;
// Whether the command buffers contains any draw/dispatch calls that possibly output data // Whether the command buffers contains any draw/dispatch calls that possibly output data
// through storage buffers and images. This is used to determine whether glMemoryBarrier* // through storage buffers and images. This is used to determine whether glMemoryBarrier*
...@@ -1383,13 +1375,19 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(ImageLayout imageLayout); ...@@ -1383,13 +1375,19 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(ImageLayout imageLayout);
// How the ImageHelper object is being used by the renderpass // How the ImageHelper object is being used by the renderpass
enum class RenderPassUsage enum class RenderPassUsage
{ {
// Attached to the render taget of the current renderpass commands. It could be read/write or
// read only access.
RenderTargetAttachment, RenderTargetAttachment,
// This is special case of RenderTargetAttachment where the render target access is read only.
// Right now it is only tracked for depth stencil attachment
ReadOnlyAttachment,
// Attached to the texture sampler of the current renderpass commands
TextureSampler, TextureSampler,
InvalidEnum, InvalidEnum,
EnumCount = InvalidEnum, EnumCount = InvalidEnum,
}; };
using RenderPassUseFlags = angle::PackedEnumBitSet<RenderPassUsage, uint16_t>; using RenderPassUsageFlags = angle::PackedEnumBitSet<RenderPassUsage, uint16_t>;
bool FormatHasNecessaryFeature(RendererVk *renderer, bool FormatHasNecessaryFeature(RendererVk *renderer,
angle::FormatID formatID, angle::FormatID formatID,
...@@ -1574,8 +1572,9 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1574,8 +1572,9 @@ class ImageHelper final : public Resource, public angle::Subject
bool isDepthOrStencil() const; bool isDepthOrStencil() const;
void setRenderPassUsageFlag(RenderPassUsage flag); void setRenderPassUsageFlag(RenderPassUsage flag);
void clearRenderPassUsageFlag(RenderPassUsage flag);
void resetRenderPassUsageFlags(); void resetRenderPassUsageFlags();
bool hasRenderPassUseFlag(RenderPassUsage flag) const; bool hasRenderPassUsageFlag(RenderPassUsage flag) const;
bool usedByCurrentRenderPassAsAttachmentAndSampler() const; bool usedByCurrentRenderPassAsAttachmentAndSampler() const;
// Clear either color or depth/stencil based on image format. // Clear either color or depth/stencil based on image format.
...@@ -2052,7 +2051,7 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -2052,7 +2051,7 @@ class ImageHelper final : public Resource, public angle::Subject
ImageLayout mLastNonShaderReadOnlyLayout; ImageLayout mLastNonShaderReadOnlyLayout;
VkPipelineStageFlags mCurrentShaderReadStageMask; VkPipelineStageFlags mCurrentShaderReadStageMask;
// Track how it is being used by current open renderpass. // Track how it is being used by current open renderpass.
RenderPassUseFlags mRenderPassUseFlags; RenderPassUsageFlags mRenderPassUsageFlags;
// For imported images // For imported images
BindingPointer<SamplerYcbcrConversion> mYuvConversionSampler; BindingPointer<SamplerYcbcrConversion> mYuvConversionSampler;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment