diff options
author | Jamie Madill <jmadill@chromium.org> | 2022-04-14 13:32:07 -0400 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-04-20 19:02:34 +0000 |
commit | 7d229d047f742e93ca194272da9b93959e49d75e (patch) | |
tree | 1b99733e569d6b202ddb48e31b13161be08099f8 | |
parent | 7c091cb35feb4df35a6ef5674274d4fb5614d5cd (diff) | |
download | angle-7d229d047f742e93ca194272da9b93959e49d75e.tar.gz |
Vulkan: Cache ImageView serials on texture changes.
This significantly reduces overhead when changing textures before
draw calls in the Vulkan back-end.
Bug: angleproject:6776
Change-Id: I24e2938c0122c3b23db4a90ec85b7d8f459cc063
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3583360
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
-rw-r--r-- | src/libANGLE/renderer/vulkan/TextureVk.cpp | 27 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/TextureVk.h | 26 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_cache_utils.h | 6 |
3 files changed, 50 insertions, 9 deletions
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp index 6004027531..b650aa3c8a 100644 --- a/src/libANGLE/renderer/vulkan/TextureVk.cpp +++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp @@ -303,7 +303,9 @@ TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer) mImageCreateFlags(0), mImageObserverBinding(this, kTextureImageSubjectIndex), mCurrentBaseLevel(state.getBaseLevel()), - mCurrentMaxLevel(state.getMaxLevel()) + mCurrentMaxLevel(state.getMaxLevel()), + mCachedImageViewSubresourceSerialSRGBDecode{}, + mCachedImageViewSubresourceSerialSkipDecode{} {} TextureVk::~TextureVk() = default; @@ -2753,6 +2755,8 @@ angle::Result TextureVk::syncState(const gl::Context *context, &mImage->getYcbcrConversionDesc(), mImage->getIntendedFormatID()); ANGLE_TRY(renderer->getSamplerCache().getSampler(contextVk, samplerDesc, &mSampler)); + updateCachedImageViewSerials(); + return angle::Result::Continue; } @@ -3036,6 +3040,8 @@ angle::Result TextureVk::initImageViews(ContextVk *contextVk, levelCount, baseLayer, layerCount, createExtraSRGBViews, mImageUsageFlags & ~VK_IMAGE_USAGE_STORAGE_BIT, mState.getSamplerState())); + updateCachedImageViewSerials(); + return angle::Result::Continue; } @@ -3322,18 +3328,17 @@ void TextureVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMe onStateChange(message); } -vk::ImageOrBufferViewSubresourceSerial TextureVk::getImageViewSubresourceSerial( - const gl::SamplerState &samplerState) const +vk::ImageOrBufferViewSubresourceSerial TextureVk::getImageViewSubresourceSerialImpl( + GLenum srgbDecode) const { gl::LevelIndex baseLevel(mState.getEffectiveBaseLevel()); // getMipmapMaxLevel will clamp to the max level if it is smaller than the number of mips. uint32_t levelCount = gl::LevelIndex(mState.getMipmapMaxLevel()) - baseLevel + 1; - const angle::Format &angleFormat = mImage->getActualFormat(); - vk::SrgbDecodeMode srgbDecodeMode = - (angleFormat.isSRGB && (samplerState.getSRGBDecode() == GL_DECODE_EXT)) - ? vk::SrgbDecodeMode::SrgbDecode - : vk::SrgbDecodeMode::SkipDecode; + const angle::Format &angleFormat = mImage->getActualFormat(); + vk::SrgbDecodeMode srgbDecodeMode = (angleFormat.isSRGB && (srgbDecode == GL_DECODE_EXT)) + ? vk::SrgbDecodeMode::SrgbDecode + : vk::SrgbDecodeMode::SkipDecode; gl::SrgbOverride srgbOverrideMode = (!angleFormat.isSRGB && (mState.getSRGBOverride() == gl::SrgbOverride::SRGB)) ? gl::SrgbOverride::SRGB @@ -3503,4 +3508,10 @@ void TextureVk::stageSelfAsSubresourceUpdates(ContextVk *contextVk) mImage->stageSelfAsSubresourceUpdates(contextVk, mImage->getLevelCount(), mRedefinedLevels); } +void TextureVk::updateCachedImageViewSerials() +{ + mCachedImageViewSubresourceSerialSRGBDecode = getImageViewSubresourceSerialImpl(GL_DECODE_EXT); + mCachedImageViewSubresourceSerialSkipDecode = + getImageViewSubresourceSerialImpl(GL_SKIP_DECODE_EXT); +} } // namespace rx diff --git a/src/libANGLE/renderer/vulkan/TextureVk.h b/src/libANGLE/renderer/vulkan/TextureVk.h index 829e5086d2..3d134226af 100644 --- a/src/libANGLE/renderer/vulkan/TextureVk.h +++ b/src/libANGLE/renderer/vulkan/TextureVk.h @@ -239,7 +239,22 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface angle::Result ensureImageInitialized(ContextVk *contextVk, ImageMipLevels mipLevels); vk::ImageOrBufferViewSubresourceSerial getImageViewSubresourceSerial( - const gl::SamplerState &samplerState) const; + const gl::SamplerState &samplerState) const + { + if (samplerState.getSRGBDecode() == GL_DECODE_EXT) + { + ASSERT(getImageViewSubresourceSerialImpl(GL_DECODE_EXT) == + mCachedImageViewSubresourceSerialSRGBDecode); + return mCachedImageViewSubresourceSerialSRGBDecode; + } + else + { + ASSERT(getImageViewSubresourceSerialImpl(GL_SKIP_DECODE_EXT) == + mCachedImageViewSubresourceSerialSkipDecode); + return mCachedImageViewSubresourceSerialSkipDecode; + } + } + vk::ImageOrBufferViewSubresourceSerial getBufferViewSerial() const; GLenum getColorReadFormat(const gl::Context *context) override; @@ -502,6 +517,11 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface void stageSelfAsSubresourceUpdates(ContextVk *contextVk); + vk::ImageOrBufferViewSubresourceSerial getImageViewSubresourceSerialImpl( + GLenum srgbDecode) const; + + void updateCachedImageViewSerials(); + bool mOwnsImage; bool mRequiresMutableStorage; vk::ImageAccess mRequiredImageAccess; @@ -584,6 +604,10 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface // Saved between updates. gl::LevelIndex mCurrentBaseLevel; gl::LevelIndex mCurrentMaxLevel; + + // Cached subresource indexes. + vk::ImageOrBufferViewSubresourceSerial mCachedImageViewSubresourceSerialSRGBDecode; + vk::ImageOrBufferViewSubresourceSerial mCachedImageViewSubresourceSerialSkipDecode; }; } // namespace rx diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h index 7d32d38a7f..bc1955ac92 100644 --- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h +++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h @@ -1118,6 +1118,12 @@ struct ImageOrBufferViewSubresourceSerial ImageSubresourceRange subresource; }; +inline bool operator==(const ImageOrBufferViewSubresourceSerial &a, + const ImageOrBufferViewSubresourceSerial &b) +{ + return a.viewSerial == b.viewSerial && a.subresource == b.subresource; +} + constexpr ImageOrBufferViewSubresourceSerial kInvalidImageOrBufferViewSubresourceSerial = { kInvalidImageOrBufferViewSerial, kInvalidImageSubresourceRange}; |