Commit 55934550 by Mohan Maiya Committed by Commit Bot

Vulkan: Don't refresh image views unnecessarily

If the underlying ICD supports VK_KHR_image_format_list extension we will have created both the linear and sRGB image views, reuse them instead of refreshing them. Bug: angleproject:3609 Bug: angleproject:4561 Bug: angleproject:5281 Change-Id: Ie34f08b3554a07f94911bebf925e38d702bc3c36 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2518387Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent 43acf3ba
...@@ -234,8 +234,8 @@ const char *GetDebugMessageSeverityString(GLenum severity); ...@@ -234,8 +234,8 @@ const char *GetDebugMessageSeverityString(GLenum severity);
enum class SrgbOverride enum class SrgbOverride
{ {
Default = 0, Default = 0,
Linear, SRGB,
SRGB Linear
}; };
} // namespace gl } // namespace gl
......
...@@ -71,8 +71,9 @@ vk::ImageViewSubresourceSerial RenderTargetVk::getSubresourceSerialImpl( ...@@ -71,8 +71,9 @@ vk::ImageViewSubresourceSerial RenderTargetVk::getSubresourceSerialImpl(
ASSERT(mLayerIndex < std::numeric_limits<uint16_t>::max()); ASSERT(mLayerIndex < std::numeric_limits<uint16_t>::max());
ASSERT(mLevelIndexGL.get() < std::numeric_limits<uint16_t>::max()); ASSERT(mLevelIndexGL.get() < std::numeric_limits<uint16_t>::max());
vk::ImageViewSubresourceSerial imageViewSerial = imageViews->getSubresourceSerial( vk::ImageViewSubresourceSerial imageViewSerial =
mLevelIndexGL, 1, mLayerIndex, vk::LayerMode::Single, vk::SrgbDecodeMode::SkipDecode); imageViews->getSubresourceSerial(mLevelIndexGL, 1, mLayerIndex, vk::LayerMode::Single,
vk::SrgbDecodeMode::SkipDecode, gl::SrgbOverride::Default);
return imageViewSerial; return imageViewSerial;
} }
......
...@@ -2247,9 +2247,14 @@ angle::Result TextureVk::syncState(const gl::Context *context, ...@@ -2247,9 +2247,14 @@ angle::Result TextureVk::syncState(const gl::Context *context,
if (localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_RED) || if (localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_RED) ||
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_GREEN) || localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_GREEN) ||
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_BLUE) || localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_BLUE) ||
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA) || localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA))
localBits.test(gl::Texture::DIRTY_BIT_SRGB_OVERRIDE) || {
localBits.test(gl::Texture::DIRTY_BIT_SRGB_DECODE)) ANGLE_TRY(refreshImageViews(contextVk));
}
if (!renderer->getFeatures().supportsImageFormatList.enabled &&
(localBits.test(gl::Texture::DIRTY_BIT_SRGB_OVERRIDE) ||
localBits.test(gl::Texture::DIRTY_BIT_SRGB_DECODE)))
{ {
ANGLE_TRY(refreshImageViews(contextVk)); ANGLE_TRY(refreshImageViews(contextVk));
} }
...@@ -2434,8 +2439,7 @@ angle::Result TextureVk::initImage(ContextVk *contextVk, ...@@ -2434,8 +2439,7 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
: vk::ConvertToSRGB(imageFormat); : vk::ConvertToSRGB(imageFormat);
VkImageFormatListCreateInfoKHR formatListInfo = {}; VkImageFormatListCreateInfoKHR formatListInfo = {};
if (renderer->getFeatures().supportsImageFormatList.enabled && if (renderer->getFeatures().supportsImageFormatList.enabled)
(imageListFormat != VK_FORMAT_UNDEFINED))
{ {
mRequiresMutableStorage = true; mRequiresMutableStorage = true;
...@@ -2702,12 +2706,17 @@ vk::ImageViewSubresourceSerial TextureVk::getImageViewSubresourceSerial( ...@@ -2702,12 +2706,17 @@ vk::ImageViewSubresourceSerial TextureVk::getImageViewSubresourceSerial(
gl::LevelIndex baseLevel(mState.getEffectiveBaseLevel()); gl::LevelIndex baseLevel(mState.getEffectiveBaseLevel());
// getMipmapMaxLevel will clamp to the max level if it is smaller than the number of mips. // 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; uint32_t levelCount = gl::LevelIndex(mState.getMipmapMaxLevel()) - baseLevel + 1;
vk::SrgbDecodeMode srgbDecodeMode = (samplerState.getSRGBDecode() == GL_DECODE_EXT) vk::SrgbDecodeMode srgbDecodeMode = (mImage->getFormat().actualImageFormat().isSRGB &&
(samplerState.getSRGBDecode() == GL_DECODE_EXT))
? vk::SrgbDecodeMode::SrgbDecode ? vk::SrgbDecodeMode::SrgbDecode
: vk::SrgbDecodeMode::SkipDecode; : vk::SrgbDecodeMode::SkipDecode;
gl::SrgbOverride srgbOverrideMode = (!mImage->getFormat().actualImageFormat().isSRGB &&
(mState.getSRGBOverride() == gl::SrgbOverride::SRGB))
? gl::SrgbOverride::SRGB
: gl::SrgbOverride::Default;
return getImageViews().getSubresourceSerial(baseLevel, levelCount, 0, vk::LayerMode::All, return getImageViews().getSubresourceSerial(baseLevel, levelCount, 0, vk::LayerMode::All,
srgbDecodeMode); srgbDecodeMode, srgbOverrideMode);
} }
angle::Result TextureVk::refreshImageViews(ContextVk *contextVk) angle::Result TextureVk::refreshImageViews(ContextVk *contextVk)
......
...@@ -988,16 +988,17 @@ ANGLE_INLINE PipelineHelper::PipelineHelper(Pipeline &&pipeline) : mPipeline(std ...@@ -988,16 +988,17 @@ ANGLE_INLINE PipelineHelper::PipelineHelper(Pipeline &&pipeline) : mPipeline(std
struct ImageSubresourceRange struct ImageSubresourceRange
{ {
uint16_t level : 10; // GL max is 1000 (fits in 10 bits). uint16_t level : 10; // GL max is 1000 (fits in 10 bits).
uint16_t levelCount : 6; // Max 63 levels (2 ** 6 - 1). If we need more, take from layer. uint16_t levelCount : 6; // Max 63 levels (2 ** 6 - 1). If we need more, take from layer.
uint16_t layer : 14; // Implementation max is 2048 (11 bits). uint16_t layer : 13; // Implementation max is 2048 (11 bits).
uint16_t singleLayer : 1; // true/false only. Not possible to use sub-slices of levels. uint16_t singleLayer : 1; // true/false only. Not possible to use sub-slices of levels.
uint16_t srgbDecodeMode : 1; // Values from vk::SrgbDecodeMode. uint16_t srgbDecodeMode : 1; // Values from vk::SrgbDecodeMode.
uint16_t srgbOverrideMode : 1; // Values from gl::SrgbOverride, either Default or SRGB.
}; };
static_assert(sizeof(ImageSubresourceRange) == sizeof(uint32_t), "Size mismatch"); static_assert(sizeof(ImageSubresourceRange) == sizeof(uint32_t), "Size mismatch");
constexpr ImageSubresourceRange kInvalidImageSubresourceRange = {0, 0, 0, 0, 0}; constexpr ImageSubresourceRange kInvalidImageSubresourceRange = {0, 0, 0, 0, 0, 0};
struct ImageViewSubresourceSerial struct ImageViewSubresourceSerial
{ {
......
...@@ -6481,7 +6481,8 @@ ImageViewSubresourceSerial ImageViewHelper::getSubresourceSerial( ...@@ -6481,7 +6481,8 @@ ImageViewSubresourceSerial ImageViewHelper::getSubresourceSerial(
uint32_t levelCount, uint32_t levelCount,
uint32_t layer, uint32_t layer,
LayerMode layerMode, LayerMode layerMode,
SrgbDecodeMode srgbDecodeMode) const SrgbDecodeMode srgbDecodeMode,
gl::SrgbOverride srgbOverrideMode) const
{ {
ASSERT(mImageViewSerial.valid()); ASSERT(mImageViewSerial.valid());
...@@ -6492,6 +6493,7 @@ ImageViewSubresourceSerial ImageViewHelper::getSubresourceSerial( ...@@ -6492,6 +6493,7 @@ ImageViewSubresourceSerial ImageViewHelper::getSubresourceSerial(
SetBitField(serial.subresource.layer, layer); SetBitField(serial.subresource.layer, layer);
SetBitField(serial.subresource.singleLayer, layerMode == LayerMode::Single ? 1 : 0); SetBitField(serial.subresource.singleLayer, layerMode == LayerMode::Single ? 1 : 0);
SetBitField(serial.subresource.srgbDecodeMode, srgbDecodeMode); SetBitField(serial.subresource.srgbDecodeMode, srgbDecodeMode);
SetBitField(serial.subresource.srgbOverrideMode, srgbOverrideMode);
return serial; return serial;
} }
......
...@@ -2017,7 +2017,8 @@ class ImageViewHelper : angle::NonCopyable ...@@ -2017,7 +2017,8 @@ class ImageViewHelper : angle::NonCopyable
uint32_t levelCount, uint32_t levelCount,
uint32_t layer, uint32_t layer,
LayerMode layerMode, LayerMode layerMode,
SrgbDecodeMode srgbDecodeMode) const; SrgbDecodeMode srgbDecodeMode,
gl::SrgbOverride srgbOverrideMode) const;
private: private:
ImageView &getReadImageView() ImageView &getReadImageView()
......
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