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);
enum class SrgbOverride
{
Default = 0,
Linear,
SRGB
SRGB,
Linear
};
} // namespace gl
......
......@@ -71,8 +71,9 @@ vk::ImageViewSubresourceSerial RenderTargetVk::getSubresourceSerialImpl(
ASSERT(mLayerIndex < std::numeric_limits<uint16_t>::max());
ASSERT(mLevelIndexGL.get() < std::numeric_limits<uint16_t>::max());
vk::ImageViewSubresourceSerial imageViewSerial = imageViews->getSubresourceSerial(
mLevelIndexGL, 1, mLayerIndex, vk::LayerMode::Single, vk::SrgbDecodeMode::SkipDecode);
vk::ImageViewSubresourceSerial imageViewSerial =
imageViews->getSubresourceSerial(mLevelIndexGL, 1, mLayerIndex, vk::LayerMode::Single,
vk::SrgbDecodeMode::SkipDecode, gl::SrgbOverride::Default);
return imageViewSerial;
}
......
......@@ -2247,9 +2247,14 @@ angle::Result TextureVk::syncState(const gl::Context *context,
if (localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_RED) ||
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_GREEN) ||
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_BLUE) ||
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA) ||
localBits.test(gl::Texture::DIRTY_BIT_SRGB_OVERRIDE) ||
localBits.test(gl::Texture::DIRTY_BIT_SRGB_DECODE))
localBits.test(gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA))
{
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));
}
......@@ -2434,8 +2439,7 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
: vk::ConvertToSRGB(imageFormat);
VkImageFormatListCreateInfoKHR formatListInfo = {};
if (renderer->getFeatures().supportsImageFormatList.enabled &&
(imageListFormat != VK_FORMAT_UNDEFINED))
if (renderer->getFeatures().supportsImageFormatList.enabled)
{
mRequiresMutableStorage = true;
......@@ -2702,12 +2706,17 @@ vk::ImageViewSubresourceSerial TextureVk::getImageViewSubresourceSerial(
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;
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::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,
srgbDecodeMode);
srgbDecodeMode, srgbOverrideMode);
}
angle::Result TextureVk::refreshImageViews(ContextVk *contextVk)
......
......@@ -988,16 +988,17 @@ ANGLE_INLINE PipelineHelper::PipelineHelper(Pipeline &&pipeline) : mPipeline(std
struct ImageSubresourceRange
{
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 layer : 14; // Implementation max is 2048 (11 bits).
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 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 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 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");
constexpr ImageSubresourceRange kInvalidImageSubresourceRange = {0, 0, 0, 0, 0};
constexpr ImageSubresourceRange kInvalidImageSubresourceRange = {0, 0, 0, 0, 0, 0};
struct ImageViewSubresourceSerial
{
......
......@@ -6481,7 +6481,8 @@ ImageViewSubresourceSerial ImageViewHelper::getSubresourceSerial(
uint32_t levelCount,
uint32_t layer,
LayerMode layerMode,
SrgbDecodeMode srgbDecodeMode) const
SrgbDecodeMode srgbDecodeMode,
gl::SrgbOverride srgbOverrideMode) const
{
ASSERT(mImageViewSerial.valid());
......@@ -6492,6 +6493,7 @@ ImageViewSubresourceSerial ImageViewHelper::getSubresourceSerial(
SetBitField(serial.subresource.layer, layer);
SetBitField(serial.subresource.singleLayer, layerMode == LayerMode::Single ? 1 : 0);
SetBitField(serial.subresource.srgbDecodeMode, srgbDecodeMode);
SetBitField(serial.subresource.srgbOverrideMode, srgbOverrideMode);
return serial;
}
......
......@@ -2017,7 +2017,8 @@ class ImageViewHelper : angle::NonCopyable
uint32_t levelCount,
uint32_t layer,
LayerMode layerMode,
SrgbDecodeMode srgbDecodeMode) const;
SrgbDecodeMode srgbDecodeMode,
gl::SrgbOverride srgbOverrideMode) const;
private:
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