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(
remainingShaderBits.reset(firstShader);
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
// not track all textures in the renderpass.
......@@ -1497,8 +1497,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
if (image.isDepthOrStencil())
{
if (mRenderPassCommands->started() &&
mRenderPassCommands->isReadOnlyDepthMode())
if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::ReadOnlyAttachment))
{
textureLayout = vk::ImageLayout::DepthStencilReadOnly;
}
......@@ -4579,7 +4578,8 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context)
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.
// Otherwise it will stick with writable layout and cause validation error.
......
......@@ -875,7 +875,6 @@ CommandBufferHelper::CommandBufferHelper()
mRebindTransformFeedbackBuffers(false),
mIsTransformFeedbackActiveUnpaused(false),
mIsRenderPassCommandBuffer(false),
mReadOnlyDepthStencilMode(false),
mHasShaderStorageOutput(false),
mHasGLMemoryBarrierIssued(false),
mDepthAccess(ResourceAccess::Unused),
......@@ -939,7 +938,6 @@ void CommandBufferHelper::reset()
mRenderPassUsedImages.clear();
mDepthStencilImage = nullptr;
mDepthStencilResolveImage = nullptr;
mReadOnlyDepthStencilMode = false;
mColorImages.reset();
mColorResolveImages.reset();
mImageOptimizeForPresent = nullptr;
......@@ -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()
{
// Note that the image may have been deleted since the render pass has started.
......@@ -1338,7 +1367,7 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context)
? mDepthStencilImage->isReadBarrierNecessary(imageLayout)
: true;
}
else if (mReadOnlyDepthStencilMode)
else if (mDepthStencilImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment))
{
imageLayout = ImageLayout::DepthStencilReadOnly;
barrierRequired = mDepthStencilImage->isReadBarrierNecessary(imageLayout);
......@@ -1360,7 +1389,7 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context)
updateImageLayoutAndBarrier(context, mDepthStencilImage, aspectFlags, imageLayout);
}
if (!mReadOnlyDepthStencilMode)
if (!mDepthStencilImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment))
{
ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid);
const PackedAttachmentOpsDesc &dsOps = mAttachmentOps[mDepthStencilAttachmentIndex];
......@@ -1389,7 +1418,7 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex
{
ASSERT(mIsRenderPassCommandBuffer);
ASSERT(mDepthStencilImage);
ASSERT(!mReadOnlyDepthStencilMode);
ASSERT(!mDepthStencilResolveImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment));
ImageLayout imageLayout = ImageLayout::DepthStencilResolveAttachment;
const angle::Format &format = mDepthStencilResolveImage->getFormat().actualImageFormat();
......@@ -1398,7 +1427,7 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex
updateImageLayoutAndBarrier(context, mDepthStencilResolveImage, aspectFlags, imageLayout);
if (!mReadOnlyDepthStencilMode)
if (!mDepthStencilResolveImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment))
{
ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid);
const PackedAttachmentOpsDesc &dsOps = mAttachmentOps[mDepthStencilAttachmentIndex];
......@@ -1427,7 +1456,7 @@ void CommandBufferHelper::finalizeImageLayout(Context *context, const ImageHelpe
{
ASSERT(mIsRenderPassCommandBuffer);
if (image->hasRenderPassUseFlag(RenderPassUsage::RenderTargetAttachment))
if (image->hasRenderPassUsageFlag(RenderPassUsage::RenderTargetAttachment))
{
for (PackedAttachmentIndex index = kAttachmentIndexZero; index < mColorImagesCount; ++index)
{
......@@ -1537,7 +1566,7 @@ void CommandBufferHelper::endRenderPass(ContextVk *contextVk)
// 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.
if (mReadOnlyDepthStencilMode &&
if (dsOps.initialLayout == static_cast<uint16_t>(ImageLayout::DepthStencilReadOnly) &&
contextVk->getFeatures().supportsRenderPassStoreOpNoneQCOM.enabled)
{
if (dsOps.storeOp == RenderPassStoreOp::Store)
......@@ -1564,7 +1593,7 @@ void CommandBufferHelper::endRenderPass(ContextVk *contextVk)
}
// 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));
// Do depth stencil layout change.
......@@ -3719,7 +3748,7 @@ void ImageHelper::resetCachedProperties()
mLevelCount = 0;
mExternalFormat = 0;
mCurrentSingleClearValue.reset();
mRenderPassUseFlags.reset();
mRenderPassUsageFlags.reset();
setEntireContentUndefined();
}
......@@ -4499,23 +4528,28 @@ bool ImageHelper::isDepthOrStencil() const
void ImageHelper::setRenderPassUsageFlag(RenderPassUsage flag)
{
mRenderPassUseFlags.set(flag);
mRenderPassUsageFlags.set(flag);
}
void ImageHelper::clearRenderPassUsageFlag(RenderPassUsage flag)
{
mRenderPassUsageFlags.reset(flag);
}
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
{
return mRenderPassUseFlags[RenderPassUsage::RenderTargetAttachment] &&
mRenderPassUseFlags[RenderPassUsage::TextureSampler];
return mRenderPassUsageFlags[RenderPassUsage::RenderTargetAttachment] &&
mRenderPassUsageFlags[RenderPassUsage::TextureSampler];
}
bool ImageHelper::isReadBarrierNecessary(ImageLayout newLayout) const
......
......@@ -1100,12 +1100,7 @@ class CommandBufferHelper : angle::NonCopyable
void endRenderPass(ContextVk *contextVk);
void updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode)
{
ASSERT(mIsRenderPassCommandBuffer);
ASSERT(mRenderPassStarted);
mReadOnlyDepthStencilMode = readOnlyDepthStencilMode;
}
void updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode);
void beginTransformFeedback(size_t validBufferCount,
const VkBuffer *counterBuffers,
......@@ -1190,8 +1185,6 @@ class CommandBufferHelper : angle::NonCopyable
VK_ATTACHMENT_LOAD_OP_CLEAR;
}
bool isReadOnlyDepthMode() const { return mReadOnlyDepthStencilMode; }
void addCommandDiagnostics(ContextVk *contextVk);
const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; }
......@@ -1259,7 +1252,6 @@ class CommandBufferHelper : angle::NonCopyable
bool mIsTransformFeedbackActiveUnpaused;
bool mIsRenderPassCommandBuffer;
bool mReadOnlyDepthStencilMode;
// 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*
......@@ -1383,13 +1375,19 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(ImageLayout imageLayout);
// How the ImageHelper object is being used by the renderpass
enum class RenderPassUsage
{
// Attached to the render taget of the current renderpass commands. It could be read/write or
// read only access.
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,
InvalidEnum,
EnumCount = InvalidEnum,
};
using RenderPassUseFlags = angle::PackedEnumBitSet<RenderPassUsage, uint16_t>;
using RenderPassUsageFlags = angle::PackedEnumBitSet<RenderPassUsage, uint16_t>;
bool FormatHasNecessaryFeature(RendererVk *renderer,
angle::FormatID formatID,
......@@ -1574,8 +1572,9 @@ class ImageHelper final : public Resource, public angle::Subject
bool isDepthOrStencil() const;
void setRenderPassUsageFlag(RenderPassUsage flag);
void clearRenderPassUsageFlag(RenderPassUsage flag);
void resetRenderPassUsageFlags();
bool hasRenderPassUseFlag(RenderPassUsage flag) const;
bool hasRenderPassUsageFlag(RenderPassUsage flag) const;
bool usedByCurrentRenderPassAsAttachmentAndSampler() const;
// Clear either color or depth/stencil based on image format.
......@@ -2052,7 +2051,7 @@ class ImageHelper final : public Resource, public angle::Subject
ImageLayout mLastNonShaderReadOnlyLayout;
VkPipelineStageFlags mCurrentShaderReadStageMask;
// Track how it is being used by current open renderpass.
RenderPassUseFlags mRenderPassUseFlags;
RenderPassUsageFlags mRenderPassUsageFlags;
// For imported images
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