Commit 2e80cf9d by Cody Northrop Committed by Commit Bot

Vulkan: Refactor render target initialization for texture arrays

Bug: angleproject:3188 Bug: angleproject:3189 Test: dEQP-GLES3.functional.texture.*.3d.* Test: dEQP-GLES3.functional.texture.*.2darray.* Test: Texture3DTestES3 Test: CopyTexImageTestES3 Test: DrawBuffersTestES3 Change-Id: Ia48766170c02fadb56cddcd415144a00123b02c5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1745722Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Cody Northrop <cnorthrop@google.com>
parent ceac3320
...@@ -72,6 +72,33 @@ uint32_t GetImageLayerCountForView(const vk::ImageHelper &image) ...@@ -72,6 +72,33 @@ uint32_t GetImageLayerCountForView(const vk::ImageHelper &image)
return image.getExtents().depth > 1 ? image.getExtents().depth : image.getLayerCount(); return image.getExtents().depth > 1 ? image.getExtents().depth : image.getLayerCount();
} }
void GetRenderTargetLayerCountAndIndex(vk::ImageHelper *image,
const gl::ImageIndex &index,
GLuint *layerCount,
GLuint *layerIndex)
{
switch (index.getType())
{
case gl::TextureType::CubeMap:
*layerIndex = index.cubeMapFaceIndex();
*layerCount = gl::kCubeFaceCount;
return;
case gl::TextureType::_3D:
*layerIndex = index.hasLayer() ? index.getLayerIndex() : 0;
*layerCount = image->getExtents().depth;
return;
case gl::TextureType::_2DArray:
*layerIndex = index.hasLayer() ? index.getLayerIndex() : 0;
*layerCount = image->getLayerCount();
return;
default:
UNREACHABLE();
}
}
bool HasBothDepthAndStencilAspects(VkImageAspectFlags aspectFlags) bool HasBothDepthAndStencilAspects(VkImageAspectFlags aspectFlags)
{ {
constexpr VkImageAspectFlags kDepthStencilAspects = constexpr VkImageAspectFlags kDepthStencilAspects =
...@@ -933,8 +960,7 @@ void TextureVk::setImageHelper(ContextVk *contextVk, ...@@ -933,8 +960,7 @@ void TextureVk::setImageHelper(ContextVk *contextVk,
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
mCubeMapRenderTargets.clear(); mLayerRenderTargets.clear();
m3DRenderTargets.clear();
mSerial = contextVk->generateTextureSerial(); mSerial = contextVk->generateTextureSerial();
} }
...@@ -1277,19 +1303,21 @@ angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context, ...@@ -1277,19 +1303,21 @@ angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context,
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
ANGLE_TRY(ensureImageInitialized(contextVk)); ANGLE_TRY(ensureImageInitialized(contextVk));
GLuint layerIndex = 0, layerCount = 0;
switch (imageIndex.getType()) switch (imageIndex.getType())
{ {
case gl::TextureType::_2D: case gl::TextureType::_2D:
*rtOut = &mRenderTarget; *rtOut = &mRenderTarget;
break; break;
case gl::TextureType::CubeMap:
case gl::TextureType::_2DArray: case gl::TextureType::_2DArray:
case gl::TextureType::_3D: case gl::TextureType::_3D:
ANGLE_TRY(init3DRenderTargets(contextVk)); // Special handling required for different types, grab the count and index
*rtOut = &m3DRenderTargets[imageIndex.getLayerIndex()]; GetRenderTargetLayerCountAndIndex(mImage, imageIndex, &layerCount, &layerIndex);
break;
case gl::TextureType::CubeMap: ANGLE_TRY(initLayerRenderTargets(contextVk, layerCount));
ANGLE_TRY(initCubeMapRenderTargets(contextVk)); *rtOut = &mLayerRenderTargets[layerIndex];
*rtOut = &mCubeMapRenderTargets[imageIndex.cubeMapFaceIndex()];
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -1335,17 +1363,16 @@ angle::Result TextureVk::ensureImageInitializedImpl(ContextVk *contextVk, ...@@ -1335,17 +1363,16 @@ angle::Result TextureVk::ensureImageInitializedImpl(ContextVk *contextVk,
commandBuffer); commandBuffer);
} }
angle::Result TextureVk::init3DRenderTargets(ContextVk *contextVk) angle::Result TextureVk::initLayerRenderTargets(ContextVk *contextVk, GLuint layerCount)
{ {
// Lazy init. Check if already initialized. // Lazy init. Check if already initialized.
if (!m3DRenderTargets.empty()) if (!mLayerRenderTargets.empty())
return angle::Result::Continue; return angle::Result::Continue;
uint32_t layerCount = GetImageLayerCountForView(*mImage);
const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc(); const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
mLayerFetchImageView.resize(layerCount); mLayerFetchImageView.resize(layerCount);
m3DRenderTargets.resize(layerCount); mLayerRenderTargets.resize(layerCount);
for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex)
{ {
...@@ -1363,41 +1390,9 @@ angle::Result TextureVk::init3DRenderTargets(ContextVk *contextVk) ...@@ -1363,41 +1390,9 @@ angle::Result TextureVk::init3DRenderTargets(ContextVk *contextVk)
getNativeImageLevel(0), 1, getNativeImageLevel(0), 1,
getNativeImageLayer(layerIndex), 1)); getNativeImageLayer(layerIndex), 1));
m3DRenderTargets[layerIndex].init(mImage, drawView, &mLayerFetchImageView[layerIndex], mLayerRenderTargets[layerIndex].init(mImage, drawView, &mLayerFetchImageView[layerIndex],
getNativeImageLevel(0), getNativeImageLayer(layerIndex)); getNativeImageLevel(0),
} getNativeImageLayer(layerIndex));
return angle::Result::Continue;
}
angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk)
{
// Lazy init. Check if already initialized.
if (!mCubeMapRenderTargets.empty())
return angle::Result::Continue;
const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
mLayerFetchImageView.resize(gl::kCubeFaceCount);
mCubeMapRenderTargets.resize(gl::kCubeFaceCount);
for (uint32_t cubeMapFaceIndex = 0; cubeMapFaceIndex < gl::kCubeFaceCount; ++cubeMapFaceIndex)
{
const vk::ImageView *drawView;
ANGLE_TRY(getLayerLevelDrawImageView(contextVk, cubeMapFaceIndex, 0, &drawView));
// Users of the render target expect the views to directly view the desired layer, so we
// need create a fetch view for each layer as well.
gl::SwizzleState mappedSwizzle;
MapSwizzleState(contextVk, mImage->getFormat(), baseLevelDesc.format.info->sized,
mState.getSwizzleState(), &mappedSwizzle);
gl::TextureType arrayType = vk::Get2DTextureType(gl::kCubeFaceCount, mImage->getSamples());
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, mImage->getAspectFlags(),
mappedSwizzle, &mLayerFetchImageView[cubeMapFaceIndex],
getNativeImageLevel(0), 1,
getNativeImageLayer(cubeMapFaceIndex), 1));
mCubeMapRenderTargets[cubeMapFaceIndex].init(
mImage, drawView, &mLayerFetchImageView[cubeMapFaceIndex], getNativeImageLevel(0),
getNativeImageLayer(cubeMapFaceIndex));
} }
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1820,8 +1815,7 @@ void TextureVk::releaseImage(ContextVk *contextVk) ...@@ -1820,8 +1815,7 @@ void TextureVk::releaseImage(ContextVk *contextVk)
releaseImageViews(contextVk); releaseImageViews(contextVk);
mCubeMapRenderTargets.clear(); mLayerRenderTargets.clear();
m3DRenderTargets.clear();
onStagingBufferChange(); onStagingBufferChange();
} }
......
...@@ -313,7 +313,6 @@ class TextureVk : public TextureImpl ...@@ -313,7 +313,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 init3DRenderTargets(ContextVk *contextVk);
angle::Result initImageViewImpl(ContextVk *contextVk, angle::Result initImageViewImpl(ContextVk *contextVk,
const vk::Format &format, const vk::Format &format,
uint32_t levelCount, uint32_t levelCount,
...@@ -321,11 +320,11 @@ class TextureVk : public TextureImpl ...@@ -321,11 +320,11 @@ class TextureVk : public TextureImpl
TextureVkViews *views, TextureVkViews *views,
VkImageAspectFlags aspectFlags, VkImageAspectFlags aspectFlags,
gl::SwizzleState mappedSwizzle); gl::SwizzleState mappedSwizzle);
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,
size_t layer, size_t layer,
size_t level); size_t level);
angle::Result initCubeMapRenderTargets(ContextVk *contextVk);
angle::Result ensureImageInitializedImpl(ContextVk *contextVk, angle::Result ensureImageInitializedImpl(ContextVk *contextVk,
const gl::Extents &baseLevelExtents, const gl::Extents &baseLevelExtents,
...@@ -365,8 +364,7 @@ class TextureVk : public TextureImpl ...@@ -365,8 +364,7 @@ class TextureVk : public TextureImpl
vk::Sampler mSampler; vk::Sampler mSampler;
RenderTargetVk mRenderTarget; RenderTargetVk mRenderTarget;
std::vector<RenderTargetVk> m3DRenderTargets; std::vector<RenderTargetVk> mLayerRenderTargets;
std::vector<RenderTargetVk> mCubeMapRenderTargets;
// The serial is used for cache indexing. // The serial is used for cache indexing.
Serial mSerial; Serial mSerial;
......
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