aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Madill <jmadill@chromium.org>2022-04-14 13:32:07 -0400
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-04-20 19:02:34 +0000
commit7d229d047f742e93ca194272da9b93959e49d75e (patch)
tree1b99733e569d6b202ddb48e31b13161be08099f8
parent7c091cb35feb4df35a6ef5674274d4fb5614d5cd (diff)
downloadangle-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.cpp27
-rw-r--r--src/libANGLE/renderer/vulkan/TextureVk.h26
-rw-r--r--src/libANGLE/renderer/vulkan/vk_cache_utils.h6
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};