Commit 28ff9922 by Jamie Madill Committed by Commit Bot

Vulkan: Get rid of "TextureVkViews".

This struct was used to implement different views for stencil mode. It is replaced with a single stencil mode view for sampling. We shouldn't be using a stencil-specific view for our render view. In cases where we're attaching a Depth/Stencil texture to a Framebuffer's special depth/stencil attachment point we will still need to use a single 'Draw' view attached to depth/stencil. So there's no need for a separate 'Draw' view for stencil. Also there's no current support for a separate 'Fetch' view for stencil textures. There may not be any easy way to trigger this path as it's only used in seamful cube map emulation and image copy. Seamful emulation is ES 2.0 only while stencil textures are ES 3.1 so that's not a possible use. Image copy doesn't seem to be possible either as it stands right now. Bug: angleproject:3975 Change-Id: Ic999f9471ea533d1184a364732c569124aa802bf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1842230 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com>
parent 2fa9d734
...@@ -107,65 +107,6 @@ bool HasBothDepthAndStencilAspects(VkImageAspectFlags aspectFlags) ...@@ -107,65 +107,6 @@ bool HasBothDepthAndStencilAspects(VkImageAspectFlags aspectFlags)
} }
} // anonymous namespace } // anonymous namespace
TextureVk::TextureVkViews::TextureVkViews() {}
TextureVk::TextureVkViews::~TextureVkViews() {}
void TextureVk::TextureVkViews::release(ContextVk *contextVk)
{
contextVk->addGarbage(&mDrawImageView);
contextVk->addGarbage(&mReadImageView);
contextVk->addGarbage(&mFetchImageView);
}
angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
const angle::Format &sourceFormat,
GLuint layer,
GLuint firstMipLevel,
GLuint maxMipLevel,
const size_t sourceWidth,
const size_t sourceHeight,
const size_t sourceRowPitch,
uint8_t *sourceData)
{
size_t previousLevelWidth = sourceWidth;
size_t previousLevelHeight = sourceHeight;
uint8_t *previousLevelData = sourceData;
size_t previousLevelRowPitch = sourceRowPitch;
for (GLuint currentMipLevel = firstMipLevel; currentMipLevel <= maxMipLevel; currentMipLevel++)
{
// Compute next level width and height.
size_t mipWidth = std::max<size_t>(1, previousLevelWidth >> 1);
size_t mipHeight = std::max<size_t>(1, previousLevelHeight >> 1);
// With the width and height of the next mip, we can allocate the next buffer we need.
uint8_t *destData = nullptr;
size_t destRowPitch = mipWidth * sourceFormat.pixelBytes;
size_t mipAllocationSize = destRowPitch * mipHeight;
gl::Extents mipLevelExtents(static_cast<int>(mipWidth), static_cast<int>(mipHeight), 1);
ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(
contextVk, mipAllocationSize,
gl::ImageIndex::MakeFromType(mState.getType(), currentMipLevel, layer), mipLevelExtents,
gl::Offset(), &destData));
onStagingBufferChange();
// Generate the mipmap into that new buffer
sourceFormat.mipGenerationFunction(previousLevelWidth, previousLevelHeight, 1,
previousLevelData, previousLevelRowPitch, 0, destData,
destRowPitch, 0);
// Swap for the next iteration
previousLevelWidth = mipWidth;
previousLevelHeight = mipHeight;
previousLevelData = destData;
previousLevelRowPitch = destRowPitch;
}
return angle::Result::Continue;
}
// TextureVk implementation. // TextureVk implementation.
TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer) TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer)
: TextureImpl(state), : TextureImpl(state),
...@@ -953,8 +894,7 @@ void TextureVk::setImageHelper(ContextVk *contextVk, ...@@ -953,8 +894,7 @@ void TextureVk::setImageHelper(ContextVk *contextVk,
mImage->initStagingBuffer(contextVk->getRenderer(), format, vk::kStagingBufferFlags, mImage->initStagingBuffer(contextVk->getRenderer(), format, vk::kStagingBufferFlags,
mStagingBufferInitialSize); mStagingBufferInitialSize);
mRenderTarget.init(mImage, &mDefaultViews.mDrawImageView, getNativeImageLevel(0), mRenderTarget.init(mImage, &mDrawImageView, getNativeImageLevel(0), getNativeImageLayer(0));
getNativeImageLayer(0));
// Force re-creation of layered render targets next time they are needed // Force re-creation of layered render targets next time they are needed
mLayerRenderTargets.clear(); mLayerRenderTargets.clear();
...@@ -1522,33 +1462,25 @@ void TextureVk::releaseOwnershipOfImage(const gl::Context *context) ...@@ -1522,33 +1462,25 @@ void TextureVk::releaseOwnershipOfImage(const gl::Context *context)
releaseAndDeleteImage(contextVk); releaseAndDeleteImage(contextVk);
} }
const TextureVk::TextureVkViews *TextureVk::getTextureViews() const
{
VkImageAspectFlags aspectFlags = mImage->getAspectFlags();
if (HasBothDepthAndStencilAspects(aspectFlags) && mState.isStencilMode())
{
return &mStencilViews;
}
return &mDefaultViews;
}
const vk::ImageView &TextureVk::getReadImageView() const const vk::ImageView &TextureVk::getReadImageView() const
{ {
ASSERT(mImage->valid()); ASSERT(mImage->valid());
const TextureVkViews *activeView = getTextureViews();
return activeView->mReadImageView; if (mState.isStencilMode() && mStencilReadImageView.valid())
{
return mStencilReadImageView;
}
return mReadImageView;
} }
const vk::ImageView &TextureVk::getFetchImageView() const const vk::ImageView &TextureVk::getFetchImageView() const
{ {
ASSERT(mImage->valid()); ASSERT(mImage->valid());
const TextureVkViews *activeViews = getTextureViews();
if (activeViews->mFetchImageView.valid()) // We don't currently support fetch for depth/stencil cube map textures.
{ ASSERT(!mStencilReadImageView.valid() || !mFetchImageView.valid());
return activeViews->mFetchImageView; return (mFetchImageView.valid() ? mFetchImageView : mReadImageView);
}
return activeViews->mReadImageView;
} }
vk::ImageView *TextureVk::getLayerLevelImageViewImpl(vk::LayerLevelImageViewVector *imageViews, vk::ImageView *TextureVk::getLayerLevelImageViewImpl(vk::LayerLevelImageViewVector *imageViews,
...@@ -1713,20 +1645,34 @@ angle::Result TextureVk::initImage(ContextVk *contextVk, ...@@ -1713,20 +1645,34 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
return angle::Result::Continue; return angle::Result::Continue;
} }
angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk, angle::Result TextureVk::initImageViews(ContextVk *contextVk,
const vk::Format &format, const vk::Format &format,
const bool sized,
uint32_t levelCount, uint32_t levelCount,
uint32_t layerCount, uint32_t layerCount)
TextureVkViews *view,
VkImageAspectFlags aspectFlags,
gl::SwizzleState mappedSwizzle)
{ {
uint32_t baseLevel = getNativeImageLevel(0); uint32_t baseLevel = getNativeImageLevel(0);
uint32_t baseLayer = getNativeImageLayer(0); uint32_t baseLayer = getNativeImageLayer(0);
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), aspectFlags, mappedSwizzle, gl::SwizzleState mappedSwizzle;
&view->mReadImageView, baseLevel, levelCount, baseLayer, MapSwizzleState(contextVk, format, sized, mState.getSwizzleState(), &mappedSwizzle);
layerCount));
const VkImageAspectFlags aspectFlags = vk::GetFormatAspectFlags(format.angleFormat());
if (HasBothDepthAndStencilAspects(aspectFlags))
{
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), VK_IMAGE_ASPECT_DEPTH_BIT,
mappedSwizzle, &mReadImageView, baseLevel, levelCount,
baseLayer, layerCount));
ANGLE_TRY(mImage->initLayerImageView(
contextVk, mState.getType(), VK_IMAGE_ASPECT_STENCIL_BIT, mappedSwizzle,
&mStencilReadImageView, baseLevel, levelCount, baseLayer, layerCount));
}
else
{
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), aspectFlags,
mappedSwizzle, &mReadImageView, baseLevel, levelCount,
baseLayer, layerCount));
}
if (mState.getType() == gl::TextureType::CubeMap || if (mState.getType() == gl::TextureType::CubeMap ||
mState.getType() == gl::TextureType::_2DArray || mState.getType() == gl::TextureType::_2DArray ||
...@@ -1735,40 +1681,16 @@ angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk, ...@@ -1735,40 +1681,16 @@ angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk,
gl::TextureType arrayType = vk::Get2DTextureType(layerCount, mImage->getSamples()); gl::TextureType arrayType = vk::Get2DTextureType(layerCount, mImage->getSamples());
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspectFlags, mappedSwizzle, ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspectFlags, mappedSwizzle,
&view->mFetchImageView, baseLevel, levelCount, &mFetchImageView, baseLevel, levelCount, baseLayer,
baseLayer, layerCount)); layerCount));
} }
if (!format.imageFormat().isBlock) if (!format.imageFormat().isBlock)
{ {
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), aspectFlags, ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), aspectFlags,
gl::SwizzleState(), &view->mDrawImageView, baseLevel, gl::SwizzleState(), &mDrawImageView, baseLevel, 1,
1, baseLayer, layerCount)); baseLayer, layerCount));
}
return angle::Result::Continue;
}
angle::Result TextureVk::initImageViews(ContextVk *contextVk,
const vk::Format &format,
const bool sized,
uint32_t levelCount,
uint32_t layerCount)
{
ASSERT(mImage != nullptr);
gl::SwizzleState mappedSwizzle;
MapSwizzleState(contextVk, format, sized, mState.getSwizzleState(), &mappedSwizzle);
VkImageAspectFlags aspectFlags = vk::GetFormatAspectFlags(format.angleFormat());
if (HasBothDepthAndStencilAspects(aspectFlags))
{
ANGLE_TRY(initImageViewImpl(contextVk, format, levelCount, layerCount, &mStencilViews,
VK_IMAGE_ASPECT_STENCIL_BIT, mappedSwizzle));
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
} }
ANGLE_TRY(initImageViewImpl(contextVk, format, levelCount, layerCount, &mDefaultViews,
aspectFlags, mappedSwizzle));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1796,8 +1718,10 @@ void TextureVk::releaseImage(ContextVk *contextVk) ...@@ -1796,8 +1718,10 @@ void TextureVk::releaseImage(ContextVk *contextVk)
void TextureVk::releaseImageViews(ContextVk *contextVk) void TextureVk::releaseImageViews(ContextVk *contextVk)
{ {
mDefaultViews.release(contextVk); contextVk->addGarbage(&mReadImageView);
mStencilViews.release(contextVk); contextVk->addGarbage(&mFetchImageView);
contextVk->addGarbage(&mStencilReadImageView);
contextVk->addGarbage(&mDrawImageView);
for (vk::ImageViewVector &layerViews : mLayerLevelDrawImageViews) for (vk::ImageViewVector &layerViews : mLayerLevelDrawImageViews)
{ {
...@@ -1827,4 +1751,53 @@ uint32_t TextureVk::getLevelCount() const ...@@ -1827,4 +1751,53 @@ uint32_t TextureVk::getLevelCount() const
// getMipmapMaxLevel will be 0 here if mipmaps are not used, so the levelCount is always +1. // getMipmapMaxLevel will be 0 here if mipmaps are not used, so the levelCount is always +1.
return mState.getMipmapMaxLevel() + 1; return mState.getMipmapMaxLevel() + 1;
} }
angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
const angle::Format &sourceFormat,
GLuint layer,
GLuint firstMipLevel,
GLuint maxMipLevel,
const size_t sourceWidth,
const size_t sourceHeight,
const size_t sourceRowPitch,
uint8_t *sourceData)
{
size_t previousLevelWidth = sourceWidth;
size_t previousLevelHeight = sourceHeight;
uint8_t *previousLevelData = sourceData;
size_t previousLevelRowPitch = sourceRowPitch;
for (GLuint currentMipLevel = firstMipLevel; currentMipLevel <= maxMipLevel; currentMipLevel++)
{
// Compute next level width and height.
size_t mipWidth = std::max<size_t>(1, previousLevelWidth >> 1);
size_t mipHeight = std::max<size_t>(1, previousLevelHeight >> 1);
// With the width and height of the next mip, we can allocate the next buffer we need.
uint8_t *destData = nullptr;
size_t destRowPitch = mipWidth * sourceFormat.pixelBytes;
size_t mipAllocationSize = destRowPitch * mipHeight;
gl::Extents mipLevelExtents(static_cast<int>(mipWidth), static_cast<int>(mipHeight), 1);
ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(
contextVk, mipAllocationSize,
gl::ImageIndex::MakeFromType(mState.getType(), currentMipLevel, layer), mipLevelExtents,
gl::Offset(), &destData));
onStagingBufferChange();
// Generate the mipmap into that new buffer
sourceFormat.mipGenerationFunction(previousLevelWidth, previousLevelHeight, 1,
previousLevelData, previousLevelRowPitch, 0, destData,
destRowPitch, 0);
// Swap for the next iteration
previousLevelWidth = mipWidth;
previousLevelHeight = mipHeight;
previousLevelData = destData;
previousLevelRowPitch = destRowPitch;
}
return angle::Result::Continue;
}
} // namespace rx } // namespace rx
...@@ -179,18 +179,6 @@ class TextureVk : public TextureImpl ...@@ -179,18 +179,6 @@ class TextureVk : public TextureImpl
} }
private: private:
struct TextureVkViews final : angle::NonCopyable
{
TextureVkViews();
~TextureVkViews();
void release(ContextVk *contextVk);
vk::ImageView mDrawImageView;
vk::ImageView mReadImageView;
vk::ImageView mFetchImageView;
};
// Transform an image index from the frontend into one that can be used on the backing // Transform an image index from the frontend into one that can be used on the backing
// ImageHelper, taking into account mipmap or cube face offsets // ImageHelper, taking into account mipmap or cube face offsets
gl::ImageIndex getNativeImageIndex(const gl::ImageIndex &inputImageIndex) const; gl::ImageIndex getNativeImageIndex(const gl::ImageIndex &inputImageIndex) const;
...@@ -311,13 +299,6 @@ class TextureVk : public TextureImpl ...@@ -311,13 +299,6 @@ class TextureVk : public TextureImpl
const bool sized, const bool sized,
uint32_t levelCount, uint32_t levelCount,
uint32_t layerCount); uint32_t layerCount);
angle::Result initImageViewImpl(ContextVk *contextVk,
const vk::Format &format,
uint32_t levelCount,
uint32_t layerCount,
TextureVkViews *views,
VkImageAspectFlags aspectFlags,
gl::SwizzleState mappedSwizzle);
angle::Result initLayerRenderTargets(ContextVk *contextVk, GLuint layerCount); angle::Result initLayerRenderTargets(ContextVk *contextVk, GLuint layerCount);
vk::ImageView *getLevelImageViewImpl(vk::ImageViewVector *imageViews, size_t level); vk::ImageView *getLevelImageViewImpl(vk::ImageViewVector *imageViews, size_t level);
vk::ImageView *getLayerLevelImageViewImpl(vk::LayerLevelImageViewVector *imageViews, vk::ImageView *getLayerLevelImageViewImpl(vk::LayerLevelImageViewVector *imageViews,
...@@ -331,8 +312,6 @@ class TextureVk : public TextureImpl ...@@ -331,8 +312,6 @@ class TextureVk : public TextureImpl
void onStagingBufferChange() { onStateChange(angle::SubjectMessage::SubjectChanged); } void onStagingBufferChange() { onStateChange(angle::SubjectMessage::SubjectChanged); }
const TextureVkViews *getTextureViews() const;
angle::Result changeLevels(ContextVk *contextVk, GLuint baseLevel, GLuint maxLevel); angle::Result changeLevels(ContextVk *contextVk, GLuint baseLevel, GLuint maxLevel);
bool mOwnsImage; bool mOwnsImage;
...@@ -350,10 +329,14 @@ class TextureVk : public TextureImpl ...@@ -350,10 +329,14 @@ class TextureVk : public TextureImpl
vk::ImageHelper *mImage; vk::ImageHelper *mImage;
// Read views. // Read views.
TextureVkViews mDefaultViews; vk::ImageView mReadImageView;
TextureVkViews mStencilViews; vk::ImageView mFetchImageView;
vk::ImageView mStencilReadImageView;
// Draw views. // Draw views.
vk::ImageView mDrawImageView;
vk::LayerLevelImageViewVector mLayerLevelDrawImageViews; vk::LayerLevelImageViewVector mLayerLevelDrawImageViews;
// Storage image views. // Storage image views.
vk::ImageViewVector mLevelStorageImageViews; vk::ImageViewVector mLevelStorageImageViews;
......
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