Commit e26c5e07 by Jamie Madill Committed by Commit Bot

Vulkan: Add Image serial.

This is owned by the ImageHelper. We'll use it in tracking used images in RenderPasses. Bug: angleproject:4911 Change-Id: Ic71cef2b16eefb86c73c9c5e1e38ee7cd6a60adb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2332895 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent f9dd2c15
...@@ -4361,6 +4361,7 @@ angle::Result ContextVk::onImageRead(VkImageAspectFlags aspectFlags, ...@@ -4361,6 +4361,7 @@ angle::Result ContextVk::onImageRead(VkImageAspectFlags aspectFlags,
vk::ImageHelper *image) vk::ImageHelper *image)
{ {
ASSERT(!image->isReleasedToExternal()); ASSERT(!image->isReleasedToExternal());
ASSERT(image->getImageSerial().valid());
if (image->isLayoutChangeNecessary(imageLayout)) if (image->isLayoutChangeNecessary(imageLayout))
{ {
...@@ -4377,6 +4378,7 @@ angle::Result ContextVk::onImageWrite(VkImageAspectFlags aspectFlags, ...@@ -4377,6 +4378,7 @@ angle::Result ContextVk::onImageWrite(VkImageAspectFlags aspectFlags,
vk::ImageHelper *image) vk::ImageHelper *image)
{ {
ASSERT(!image->isReleasedToExternal()); ASSERT(!image->isReleasedToExternal());
ASSERT(image->getImageSerial().valid());
// Barriers are always required for image writes. // Barriers are always required for image writes.
ASSERT(image->isLayoutChangeNecessary(imageLayout)); ASSERT(image->isLayoutChangeNecessary(imageLayout));
......
...@@ -2580,6 +2580,7 @@ ImageHelper::ImageHelper(ImageHelper &&other) ...@@ -2580,6 +2580,7 @@ ImageHelper::ImageHelper(ImageHelper &&other)
mExtents(other.mExtents), mExtents(other.mExtents),
mFormat(other.mFormat), mFormat(other.mFormat),
mSamples(other.mSamples), mSamples(other.mSamples),
mImageSerial(other.mImageSerial),
mCurrentLayout(other.mCurrentLayout), mCurrentLayout(other.mCurrentLayout),
mCurrentQueueFamilyIndex(other.mCurrentQueueFamilyIndex), mCurrentQueueFamilyIndex(other.mCurrentQueueFamilyIndex),
mLastNonShaderReadOnlyLayout(other.mLastNonShaderReadOnlyLayout), mLastNonShaderReadOnlyLayout(other.mLastNonShaderReadOnlyLayout),
...@@ -2606,11 +2607,12 @@ ImageHelper::~ImageHelper() ...@@ -2606,11 +2607,12 @@ ImageHelper::~ImageHelper()
void ImageHelper::resetCachedProperties() void ImageHelper::resetCachedProperties()
{ {
mImageType = VK_IMAGE_TYPE_2D; mImageType = VK_IMAGE_TYPE_2D;
mTilingMode = VK_IMAGE_TILING_OPTIMAL;
mUsage = 0;
mExtents = {}; mExtents = {};
mFormat = nullptr; mFormat = nullptr;
mSamples = 1; mSamples = 1;
mTilingMode = VK_IMAGE_TILING_OPTIMAL; mImageSerial = kInvalidImageSerial;
mUsage = 0;
mCurrentLayout = ImageLayout::Undefined; mCurrentLayout = ImageLayout::Undefined;
mCurrentQueueFamilyIndex = std::numeric_limits<uint32_t>::max(); mCurrentQueueFamilyIndex = std::numeric_limits<uint32_t>::max();
mLastNonShaderReadOnlyLayout = ImageLayout::Undefined; mLastNonShaderReadOnlyLayout = ImageLayout::Undefined;
...@@ -2619,8 +2621,8 @@ void ImageHelper::resetCachedProperties() ...@@ -2619,8 +2621,8 @@ void ImageHelper::resetCachedProperties()
mMaxLevel = 0; mMaxLevel = 0;
mLayerCount = 0; mLayerCount = 0;
mLevelCount = 0; mLevelCount = 0;
mExternalFormat = 0;
mCurrentSingleClearValue.reset(); mCurrentSingleClearValue.reset();
mExternalFormat = 0;
} }
void ImageHelper::initStagingBuffer(RendererVk *renderer, void ImageHelper::initStagingBuffer(RendererVk *renderer,
...@@ -2663,15 +2665,16 @@ angle::Result ImageHelper::initExternal(Context *context, ...@@ -2663,15 +2665,16 @@ angle::Result ImageHelper::initExternal(Context *context,
{ {
ASSERT(!valid()); ASSERT(!valid());
mImageType = gl_vk::GetImageType(textureType); mImageType = gl_vk::GetImageType(textureType);
mExtents = extents; mExtents = extents;
mFormat = &format; mFormat = &format;
mSamples = std::max(samples, 1); mSamples = std::max(samples, 1);
mBaseLevel = baseLevel; mImageSerial = context->getRenderer()->getResourceSerialFactory().generateImageSerial();
mMaxLevel = maxLevel; mBaseLevel = baseLevel;
mLevelCount = mipLevels; mMaxLevel = maxLevel;
mLayerCount = layerCount; mLevelCount = mipLevels;
mUsage = usage; mLayerCount = layerCount;
mUsage = usage;
// Validate that mLayerCount is compatible with the texture type // Validate that mLayerCount is compatible with the texture type
ASSERT(textureType != gl::TextureType::_3D || mLayerCount == 1); ASSERT(textureType != gl::TextureType::_3D || mLayerCount == 1);
...@@ -2712,6 +2715,7 @@ angle::Result ImageHelper::initExternal(Context *context, ...@@ -2712,6 +2715,7 @@ angle::Result ImageHelper::initExternal(Context *context,
void ImageHelper::releaseImage(RendererVk *renderer) void ImageHelper::releaseImage(RendererVk *renderer)
{ {
renderer->collectGarbageAndReinit(&mUse, &mImage, &mDeviceMemory); renderer->collectGarbageAndReinit(&mUse, &mImage, &mDeviceMemory);
mImageSerial = kInvalidImageSerial;
} }
void ImageHelper::releaseStagingBuffer(RendererVk *renderer) void ImageHelper::releaseStagingBuffer(RendererVk *renderer)
...@@ -2729,6 +2733,7 @@ void ImageHelper::releaseStagingBuffer(RendererVk *renderer) ...@@ -2729,6 +2733,7 @@ void ImageHelper::releaseStagingBuffer(RendererVk *renderer)
void ImageHelper::resetImageWeakReference() void ImageHelper::resetImageWeakReference()
{ {
mImage.reset(); mImage.reset();
mImageSerial = kInvalidImageSerial;
} }
angle::Result ImageHelper::initializeNonZeroMemory(Context *context, VkDeviceSize size) angle::Result ImageHelper::initializeNonZeroMemory(Context *context, VkDeviceSize size)
...@@ -3014,6 +3019,7 @@ void ImageHelper::init2DWeakReference(Context *context, ...@@ -3014,6 +3019,7 @@ void ImageHelper::init2DWeakReference(Context *context,
gl_vk::GetExtent(glExtents, &mExtents); gl_vk::GetExtent(glExtents, &mExtents);
mFormat = &format; mFormat = &format;
mSamples = std::max(samples, 1); mSamples = std::max(samples, 1);
mImageSerial = context->getRenderer()->getResourceSerialFactory().generateImageSerial();
mCurrentLayout = ImageLayout::Undefined; mCurrentLayout = ImageLayout::Undefined;
mLayerCount = 1; mLayerCount = 1;
mLevelCount = 1; mLevelCount = 1;
...@@ -3033,11 +3039,12 @@ angle::Result ImageHelper::init2DStaging(Context *context, ...@@ -3033,11 +3039,12 @@ angle::Result ImageHelper::init2DStaging(Context *context,
ASSERT(!valid()); ASSERT(!valid());
gl_vk::GetExtent(glExtents, &mExtents); gl_vk::GetExtent(glExtents, &mExtents);
mImageType = VK_IMAGE_TYPE_2D; mImageType = VK_IMAGE_TYPE_2D;
mFormat = &format; mFormat = &format;
mSamples = 1; mSamples = 1;
mLayerCount = layerCount; mImageSerial = context->getRenderer()->getResourceSerialFactory().generateImageSerial();
mLevelCount = 1; mLayerCount = layerCount;
mLevelCount = 1;
mCurrentLayout = ImageLayout::Undefined; mCurrentLayout = ImageLayout::Undefined;
...@@ -4109,12 +4116,14 @@ void ImageHelper::stageSelfForBaseLevel() ...@@ -4109,12 +4116,14 @@ void ImageHelper::stageSelfForBaseLevel()
prevImage->mCurrentShaderReadStageMask = mCurrentShaderReadStageMask; prevImage->mCurrentShaderReadStageMask = mCurrentShaderReadStageMask;
prevImage->mLevelCount = 1; prevImage->mLevelCount = 1;
prevImage->mLayerCount = mLayerCount; prevImage->mLayerCount = mLayerCount;
prevImage->mImageSerial = mImageSerial;
// Reset barrier information for current (invalid) image. // Reset information for current (invalid) image.
mCurrentLayout = ImageLayout::Undefined; mCurrentLayout = ImageLayout::Undefined;
mCurrentQueueFamilyIndex = std::numeric_limits<uint32_t>::max(); mCurrentQueueFamilyIndex = std::numeric_limits<uint32_t>::max();
mLastNonShaderReadOnlyLayout = ImageLayout::Undefined; mLastNonShaderReadOnlyLayout = ImageLayout::Undefined;
mCurrentShaderReadStageMask = 0; mCurrentShaderReadStageMask = 0;
mImageSerial = kInvalidImageSerial;
// Stage an update from the previous image. // Stage an update from the previous image.
const gl::ImageIndex baseLevelIndex = const gl::ImageIndex baseLevelIndex =
......
...@@ -1190,6 +1190,12 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1190,6 +1190,12 @@ class ImageHelper final : public Resource, public angle::Subject
const Format &getFormat() const { return *mFormat; } const Format &getFormat() const { return *mFormat; }
GLint getSamples() const { return mSamples; } GLint getSamples() const { return mSamples; }
ImageSerial getImageSerial() const
{
ASSERT(valid() && mImageSerial.valid());
return mImageSerial;
}
void setCurrentImageLayout(ImageLayout newLayout) { mCurrentLayout = newLayout; } void setCurrentImageLayout(ImageLayout newLayout) { mCurrentLayout = newLayout; }
ImageLayout getCurrentImageLayout() const { return mCurrentLayout; } ImageLayout getCurrentImageLayout() const { return mCurrentLayout; }
VkImageLayout getCurrentLayout() const; VkImageLayout getCurrentLayout() const;
...@@ -1570,6 +1576,7 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1570,6 +1576,7 @@ class ImageHelper final : public Resource, public angle::Subject
VkExtent3D mExtents; VkExtent3D mExtents;
const Format *mFormat; const Format *mFormat;
GLint mSamples; GLint mSamples;
ImageSerial mImageSerial;
// Current state. // Current state.
ImageLayout mCurrentLayout; ImageLayout mCurrentLayout;
......
...@@ -694,6 +694,7 @@ class ClearValuesArray final ...@@ -694,6 +694,7 @@ class ClearValuesArray final
// Defines Serials for Vulkan objects. // Defines Serials for Vulkan objects.
#define ANGLE_VK_SERIAL_OP(X) \ #define ANGLE_VK_SERIAL_OP(X) \
X(Buffer) \ X(Buffer) \
X(Image) \
X(ImageView) \ X(ImageView) \
X(Sampler) X(Sampler)
......
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