Commit 6d905c76 by Charlie Lao Committed by Commit Bot

Vulkan: Remove initImmutableImage and use initImage instead

This is follow up of crrev.com/c/2368038. There was concern that initImmutableImage and initImage are a bit duplicated. This CL gets rid of initImmutableImage and uses initImage instead. Bug: b/181800403 Change-Id: I2c73c7ce979792cc762214f1e5ef9978eeab6212 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2800422 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: 's avatarIan Elliott <ianelliott@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 92d3912d
...@@ -1294,7 +1294,15 @@ angle::Result TextureVk::setStorageMultisample(const gl::Context *context, ...@@ -1294,7 +1294,15 @@ angle::Result TextureVk::setStorageMultisample(const gl::Context *context,
ASSERT(mState.getImmutableFormat()); ASSERT(mState.getImmutableFormat());
ASSERT(!mRedefinedLevels.any()); ASSERT(!mRedefinedLevels.any());
ANGLE_TRY(initImmutableImage(contextVk, format));
// For immutable texture, we always allocate the full immutable levels specified by texStorage
// call.
const gl::ImageDesc &Level0Desc = mState.getLevelZeroDesc();
const gl::Extents &Level0Extents = Level0Desc.size;
const uint32_t levelCount = mState.getImmutableLevels();
ANGLE_TRY(
initImage(contextVk, format, Level0Desc.format.info->sized, Level0Extents, 0, levelCount));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2053,18 +2061,25 @@ angle::Result TextureVk::respecifyImageStorageAndLevels(ContextVk *contextVk, ...@@ -2053,18 +2061,25 @@ angle::Result TextureVk::respecifyImageStorageAndLevels(ContextVk *contextVk,
// Create the image helper // Create the image helper
ANGLE_TRY(ensureImageAllocated(contextVk, format)); ANGLE_TRY(ensureImageAllocated(contextVk, format));
// Create the image // Create the image. For immutable texture, we always allocate the full immutable levels
// specified by texStorage call. Otherwise we only try to allocate from base to max levels.
if (mState.getImmutableFormat()) if (mState.getImmutableFormat())
{ {
ANGLE_TRY(initImmutableImage(contextVk, format)); const gl::ImageDesc &Level0Desc = mState.getLevelZeroDesc();
const gl::Extents &Level0Extents = Level0Desc.size;
const uint32_t levelCount = mState.getImmutableLevels();
ANGLE_TRY(initImage(contextVk, format, Level0Desc.format.info->sized, Level0Extents, 0,
levelCount));
} }
else else
{ {
const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc(); const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
const gl::Extents &baseLevelExtents = baseLevelDesc.size; const gl::Extents &baseLevelExtents = baseLevelDesc.size;
const uint32_t levelCount = getMipLevelCount(ImageMipLevels::EnabledLevels); const uint32_t levelCount = getMipLevelCount(ImageMipLevels::EnabledLevels);
ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized, ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized,
baseLevelExtents, levelCount)); baseLevelExtents, mState.getEffectiveBaseLevel(), levelCount));
} }
// Set the newly created mImage as the destination for the staging operation // Set the newly created mImage as the destination for the staging operation
...@@ -2134,13 +2149,16 @@ angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context, ...@@ -2134,13 +2149,16 @@ angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context,
if (!mImage->valid()) if (!mImage->valid())
{ {
// Immutable texture must already have a valid image
ASSERT(!mState.getImmutableFormat());
const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc(); const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
const gl::Extents &baseLevelExtents = baseLevelDesc.size; const gl::Extents &baseLevelExtents = baseLevelDesc.size;
const uint32_t levelCount = getMipLevelCount(ImageMipLevels::EnabledLevels); const uint32_t levelCount = getMipLevelCount(ImageMipLevels::EnabledLevels);
const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer()); const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized, baseLevelExtents, ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized, baseLevelExtents,
levelCount)); mState.getEffectiveBaseLevel(), levelCount));
} }
const bool hasRenderToTextureEXT = const bool hasRenderToTextureEXT =
...@@ -2199,9 +2217,17 @@ angle::Result TextureVk::ensureImageInitialized(ContextVk *contextVk, ImageMipLe ...@@ -2199,9 +2217,17 @@ angle::Result TextureVk::ensureImageInitialized(ContextVk *contextVk, ImageMipLe
ASSERT(!mRedefinedLevels.any()); ASSERT(!mRedefinedLevels.any());
const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer()); const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
// For immutable texture, we always allocate the full immutable levels specified by
// texStorage call. Otherwise we only try to allocate from base to max levels.
if (mState.getImmutableFormat()) if (mState.getImmutableFormat())
{ {
ANGLE_TRY(initImmutableImage(contextVk, format)); const gl::ImageDesc &Level0Desc = mState.getLevelZeroDesc();
const gl::Extents &Level0Extents = Level0Desc.size;
const uint32_t levelCount = mState.getImmutableLevels();
ANGLE_TRY(initImage(contextVk, format, Level0Desc.format.info->sized, Level0Extents, 0,
levelCount));
} }
else else
{ {
...@@ -2210,7 +2236,7 @@ angle::Result TextureVk::ensureImageInitialized(ContextVk *contextVk, ImageMipLe ...@@ -2210,7 +2236,7 @@ angle::Result TextureVk::ensureImageInitialized(ContextVk *contextVk, ImageMipLe
const uint32_t levelCount = getMipLevelCount(mipLevels); const uint32_t levelCount = getMipLevelCount(mipLevels);
ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized, ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized,
baseLevelExtents, levelCount)); baseLevelExtents, mState.getEffectiveBaseLevel(), levelCount));
} }
if (mipLevels == ImageMipLevels::FullMipChain) if (mipLevels == ImageMipLevels::FullMipChain)
...@@ -2453,7 +2479,8 @@ angle::Result TextureVk::syncState(const gl::Context *context, ...@@ -2453,7 +2479,8 @@ angle::Result TextureVk::syncState(const gl::Context *context,
// usage flags), make sure it's recreated. // usage flags), make sure it's recreated.
if (isGenerateMipmap && mImage->valid() && if (isGenerateMipmap && mImage->valid() &&
(oldUsageFlags != mImageUsageFlags || (oldUsageFlags != mImageUsageFlags ||
mImage->getLevelCount() != getMipLevelCount(ImageMipLevels::FullMipChain))) (!mState.getImmutableFormat() &&
mImage->getLevelCount() != getMipLevelCount(ImageMipLevels::FullMipChain))))
{ {
ASSERT(mOwnsImage); ASSERT(mOwnsImage);
// Immutable texture is not expected to reach here. The usage flag change should have // Immutable texture is not expected to reach here. The usage flag change should have
...@@ -2713,21 +2740,22 @@ angle::Result TextureVk::getBufferViewAndRecordUse(ContextVk *contextVk, ...@@ -2713,21 +2740,22 @@ angle::Result TextureVk::getBufferViewAndRecordUse(ContextVk *contextVk,
angle::Result TextureVk::initImage(ContextVk *contextVk, angle::Result TextureVk::initImage(ContextVk *contextVk,
const vk::Format &format, const vk::Format &format,
const bool sized, const bool sized,
const gl::Extents &extents, const gl::Extents &firstLevelExtents,
const uint32_t firstLevel,
const uint32_t levelCount) const uint32_t levelCount)
{ {
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
VkExtent3D vkExtent; VkExtent3D vkExtent;
uint32_t layerCount; uint32_t layerCount;
gl_vk::GetExtentsAndLayerCount(mState.getType(), extents, &vkExtent, &layerCount); gl_vk::GetExtentsAndLayerCount(mState.getType(), firstLevelExtents, &vkExtent, &layerCount);
GLint samples = mState.getBaseLevelDesc().samples ? mState.getBaseLevelDesc().samples : 1; GLint samples = mState.getBaseLevelDesc().samples ? mState.getBaseLevelDesc().samples : 1;
bool imageFormatListEnabled = false; bool imageFormatListEnabled = false;
ANGLE_TRY(mImage->initExternal( ANGLE_TRY(mImage->initExternal(
contextVk, mState.getType(), vkExtent, format, samples, mImageUsageFlags, mImageCreateFlags, contextVk, mState.getType(), vkExtent, format, samples, mImageUsageFlags, mImageCreateFlags,
vk::ImageLayout::Undefined, nullptr, gl::LevelIndex(mState.getEffectiveBaseLevel()), vk::ImageLayout::Undefined, nullptr, gl::LevelIndex(firstLevel), levelCount, layerCount,
levelCount, layerCount, contextVk->isRobustResourceInitEnabled(), &imageFormatListEnabled)); contextVk->isRobustResourceInitEnabled(), &imageFormatListEnabled));
mRequiresMutableStorage = (mImageCreateFlags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) != 0; mRequiresMutableStorage = (mImageCreateFlags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) != 0;
...@@ -2735,40 +2763,9 @@ angle::Result TextureVk::initImage(ContextVk *contextVk, ...@@ -2735,40 +2763,9 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags)); ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
ANGLE_TRY(initImageViews(contextVk, format, sized, levelCount, layerCount)); const uint32_t viewLevelCount =
mState.getImmutableFormat() ? getMipLevelCount(ImageMipLevels::EnabledLevels) : levelCount;
return angle::Result::Continue; ANGLE_TRY(initImageViews(contextVk, format, sized, viewLevelCount, layerCount));
}
angle::Result TextureVk::initImmutableImage(ContextVk *contextVk, const vk::Format &format)
{
ASSERT(mState.getImmutableFormat());
// For immutable texture, we always create a underlying image object with levels [0,
// immutableLevels-1] regardless of base level and max level. base/max level information are
// used to create ImageViewHelper object.
VkExtent3D vkExtentLevel0;
uint32_t layerCount;
const gl::ImageDesc &Level0Desc = mState.getLevelZeroDesc();
const gl::Extents &Level0Extents = Level0Desc.size;
gl_vk::GetExtentsAndLayerCount(mState.getType(), Level0Extents, &vkExtentLevel0, &layerCount);
GLint samples = mState.getBaseLevelDesc().samples ? mState.getBaseLevelDesc().samples : 1;
bool imageFormatListEnabled = false;
ANGLE_TRY(mImage->initExternal(contextVk, mState.getType(), vkExtentLevel0, format, samples,
mImageUsageFlags, mImageCreateFlags, vk::ImageLayout::Undefined,
nullptr, gl::LevelIndex(0), mState.getImmutableLevels(),
layerCount, contextVk->isRobustResourceInitEnabled(),
&imageFormatListEnabled));
mRequiresMutableStorage = (mImageCreateFlags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) != 0;
RendererVk *renderer = contextVk->getRenderer();
const VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
ANGLE_TRY(initImageViews(contextVk, format, Level0Desc.format.info->sized,
getMipLevelCount(ImageMipLevels::EnabledLevels), layerCount));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2857,14 +2854,13 @@ uint32_t TextureVk::getMipLevelCount(ImageMipLevels mipLevels) const ...@@ -2857,14 +2854,13 @@ uint32_t TextureVk::getMipLevelCount(ImageMipLevels mipLevels) const
{ {
switch (mipLevels) switch (mipLevels)
{ {
// Returns level count from base to max that has been specified, i.e, enabled.
case ImageMipLevels::EnabledLevels: case ImageMipLevels::EnabledLevels:
return mState.getEnabledLevelCount(); return mState.getEnabledLevelCount();
// Returns all mipmap levels from base to max regardless if an image has been specified or
// not.
case ImageMipLevels::FullMipChain: case ImageMipLevels::FullMipChain:
// For immutable textures, it is the same during life time of the texture regardless of return getMaxLevelCount() - mState.getEffectiveBaseLevel();
// base/max level setting.
return mState.getImmutableFormat()
? mState.getImmutableLevels()
: getMaxLevelCount() - mState.getEffectiveBaseLevel();
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -2874,11 +2870,8 @@ uint32_t TextureVk::getMipLevelCount(ImageMipLevels mipLevels) const ...@@ -2874,11 +2870,8 @@ uint32_t TextureVk::getMipLevelCount(ImageMipLevels mipLevels) const
uint32_t TextureVk::getMaxLevelCount() const uint32_t TextureVk::getMaxLevelCount() const
{ {
// For immutable textures, it is always the same during life time of the texture. For mutable // getMipmapMaxLevel will be 0 here if mipmaps are not used, so the levelCount is always +1.
// texture, getMipmapMaxLevel will be 0 here if mipmaps are not used, so the levelCount is return mState.getMipmapMaxLevel() + 1;
// always +1.
return mState.getImmutableFormat() ? mState.getImmutableLevels()
: mState.getMipmapMaxLevel() + 1;
} }
angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk, angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
......
...@@ -410,9 +410,9 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -410,9 +410,9 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
angle::Result initImage(ContextVk *contextVk, angle::Result initImage(ContextVk *contextVk,
const vk::Format &format, const vk::Format &format,
const bool sized, const bool sized,
const gl::Extents &extents, const gl::Extents &firstLevelExtents,
const uint32_t firstLevel,
const uint32_t levelCount); const uint32_t levelCount);
angle::Result initImmutableImage(ContextVk *contextVk, const vk::Format &format);
void releaseImage(ContextVk *contextVk); void releaseImage(ContextVk *contextVk);
void releaseStagingBuffer(ContextVk *contextVk); void releaseStagingBuffer(ContextVk *contextVk);
uint32_t getMipLevelCount(ImageMipLevels mipLevels) const; uint32_t getMipLevelCount(ImageMipLevels mipLevels) const;
......
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