Commit 88bc4d3d by Jamie Madill Committed by Commit Bot

Vulkan: Get rid of "fetch" level/layer image views.

Instead always use 2D array views when rendering to cube maps. We need to keep the "fetch" image view for the main image for emulating seamless cube map textures on GL 2.0. We also use it for some texture copying init. These uses could potentially be replaced with sample instructions if we wanted to remove this last "fetch" view. Bug: angleproject:3975 Change-Id: I90f9be9fc6542d8ec27f6722132c1b27acf72176 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1842226Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent cb653d43
...@@ -821,7 +821,7 @@ angle::Result FramebufferVk::blit(const gl::Context *context, ...@@ -821,7 +821,7 @@ angle::Result FramebufferVk::blit(const gl::Context *context,
else else
{ {
ANGLE_TRY(utilsVk.colorBlitResolve(contextVk, this, &readRenderTarget->getImage(), ANGLE_TRY(utilsVk.colorBlitResolve(contextVk, this, &readRenderTarget->getImage(),
readRenderTarget->getFetchImageView(), params)); readRenderTarget->getReadImageView(), params));
} }
} }
......
...@@ -18,11 +18,7 @@ ...@@ -18,11 +18,7 @@
namespace rx namespace rx
{ {
RenderTargetVk::RenderTargetVk() RenderTargetVk::RenderTargetVk()
: mImage(nullptr), : mImage(nullptr), mImageView(nullptr), mLevelIndex(0), mLayerIndex(0)
mImageView(nullptr),
mCubeImageFetchView(nullptr),
mLevelIndex(0),
mLayerIndex(0)
{} {}
RenderTargetVk::~RenderTargetVk() {} RenderTargetVk::~RenderTargetVk() {}
...@@ -30,31 +26,27 @@ RenderTargetVk::~RenderTargetVk() {} ...@@ -30,31 +26,27 @@ RenderTargetVk::~RenderTargetVk() {}
RenderTargetVk::RenderTargetVk(RenderTargetVk &&other) RenderTargetVk::RenderTargetVk(RenderTargetVk &&other)
: mImage(other.mImage), : mImage(other.mImage),
mImageView(other.mImageView), mImageView(other.mImageView),
mCubeImageFetchView(other.mCubeImageFetchView),
mLevelIndex(other.mLevelIndex), mLevelIndex(other.mLevelIndex),
mLayerIndex(other.mLayerIndex) mLayerIndex(other.mLayerIndex)
{} {}
void RenderTargetVk::init(vk::ImageHelper *image, void RenderTargetVk::init(vk::ImageHelper *image,
const vk::ImageView *imageView, const vk::ImageView *imageView,
const vk::ImageView *cubeImageFetchView,
uint32_t levelIndex, uint32_t levelIndex,
uint32_t layerIndex) uint32_t layerIndex)
{ {
mImage = image; mImage = image;
mImageView = imageView; mImageView = imageView;
mCubeImageFetchView = cubeImageFetchView; mLevelIndex = levelIndex;
mLevelIndex = levelIndex; mLayerIndex = layerIndex;
mLayerIndex = layerIndex;
} }
void RenderTargetVk::reset() void RenderTargetVk::reset()
{ {
mImage = nullptr; mImage = nullptr;
mImageView = nullptr; mImageView = nullptr;
mCubeImageFetchView = nullptr; mLevelIndex = 0;
mLevelIndex = 0; mLayerIndex = 0;
mLayerIndex = 0;
} }
angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk, angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk,
...@@ -116,12 +108,6 @@ const vk::ImageView *RenderTargetVk::getReadImageView() const ...@@ -116,12 +108,6 @@ const vk::ImageView *RenderTargetVk::getReadImageView() const
return getDrawImageView(); return getDrawImageView();
} }
const vk::ImageView *RenderTargetVk::getFetchImageView() const
{
return mCubeImageFetchView && mCubeImageFetchView->valid() ? mCubeImageFetchView
: getReadImageView();
}
const vk::Format &RenderTargetVk::getImageFormat() const const vk::Format &RenderTargetVk::getImageFormat() const
{ {
ASSERT(mImage && mImage->valid()); ASSERT(mImage && mImage->valid());
...@@ -137,9 +123,8 @@ gl::Extents RenderTargetVk::getExtents() const ...@@ -137,9 +123,8 @@ gl::Extents RenderTargetVk::getExtents() const
void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, const vk::ImageView *imageView) void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, const vk::ImageView *imageView)
{ {
ASSERT(image && image->valid() && imageView && imageView->valid()); ASSERT(image && image->valid() && imageView && imageView->valid());
mImage = image; mImage = image;
mImageView = imageView; mImageView = imageView;
mCubeImageFetchView = nullptr;
} }
vk::ImageHelper *RenderTargetVk::getImageForRead(ContextVk *contextVk, vk::ImageHelper *RenderTargetVk::getImageForRead(ContextVk *contextVk,
......
...@@ -45,7 +45,6 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -45,7 +45,6 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
void init(vk::ImageHelper *image, void init(vk::ImageHelper *image,
const vk::ImageView *imageView, const vk::ImageView *imageView,
const vk::ImageView *cubeImageFetchView,
uint32_t levelIndex, uint32_t levelIndex,
uint32_t layerIndex); uint32_t layerIndex);
void reset(); void reset();
...@@ -71,10 +70,6 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -71,10 +70,6 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
const vk::ImageView *getDrawImageView() const; const vk::ImageView *getDrawImageView() const;
const vk::ImageView *getReadImageView() const; const vk::ImageView *getReadImageView() const;
// GLSL's texelFetch() needs a 2D array view to read from cube maps. This function returns the
// same view as `getReadImageView()`, except for cubemaps, in which case it returns a 2D array
// view of it.
const vk::ImageView *getFetchImageView() const;
const vk::Format &getImageFormat() const; const vk::Format &getImageFormat() const;
gl::Extents getExtents() const; gl::Extents getExtents() const;
...@@ -90,10 +85,8 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -90,10 +85,8 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
private: private:
vk::ImageHelper *mImage; vk::ImageHelper *mImage;
// Note that the draw and read image views are the same, given the requirements of a render // Note that the draw and read image views are the same, given the requirements of a render
// target. // target. Note that for cube maps we use 2D array views.
const vk::ImageView *mImageView; const vk::ImageView *mImageView;
// For cubemaps, a 2D-array view is also created to be used with shaders that use texelFetch().
const vk::ImageView *mCubeImageFetchView;
uint32_t mLevelIndex; uint32_t mLevelIndex;
uint32_t mLayerIndex; uint32_t mLayerIndex;
}; };
......
...@@ -88,7 +88,7 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -88,7 +88,7 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
// Clear the renderbuffer if it has emulated channels. // Clear the renderbuffer if it has emulated channels.
mImage->stageClearIfEmulatedFormat(gl::ImageIndex::Make2D(0), vkFormat); mImage->stageClearIfEmulatedFormat(gl::ImageIndex::Make2D(0), vkFormat);
mRenderTarget.init(mImage, &mImageView, nullptr, 0, 0); mRenderTarget.init(mImage, &mImageView, 0, 0);
} }
return angle::Result::Continue; return angle::Result::Continue;
...@@ -168,22 +168,19 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex ...@@ -168,22 +168,19 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex
rendererQueueFamilyIndex, commandBuffer); rendererQueueFamilyIndex, commandBuffer);
} }
ANGLE_TRY(mImage->initLayerImageView(contextVk, imageVk->getImageTextureType(), aspect, gl::TextureType viewType = imageVk->getImageTextureType();
gl::SwizzleState(), &mImageView, imageVk->getImageLevel(),
1, imageVk->getImageLayer(), 1));
if (imageVk->getImageTextureType() == gl::TextureType::CubeMap) if (imageVk->getImageTextureType() == gl::TextureType::CubeMap)
{ {
gl::TextureType arrayType = vk::Get2DTextureType(imageVk->getImage()->getLayerCount(), viewType = vk::Get2DTextureType(imageVk->getImage()->getLayerCount(),
imageVk->getImage()->getSamples()); imageVk->getImage()->getSamples());
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspect, gl::SwizzleState(),
&mCubeImageFetchView, imageVk->getImageLevel(), 1,
imageVk->getImageLayer(), 1));
} }
mRenderTarget.init(mImage, &mImageView, ANGLE_TRY(mImage->initLayerImageView(contextVk, viewType, aspect, gl::SwizzleState(),
mCubeImageFetchView.valid() ? &mCubeImageFetchView : nullptr, &mImageView, imageVk->getImageLevel(), 1,
imageVk->getImageLevel(), imageVk->getImageLayer()); imageVk->getImageLayer(), 1));
mRenderTarget.init(mImage, &mImageView, imageVk->getImageLevel(), imageVk->getImageLayer());
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -236,7 +233,6 @@ void RenderbufferVk::releaseImage(ContextVk *contextVk) ...@@ -236,7 +233,6 @@ void RenderbufferVk::releaseImage(ContextVk *contextVk)
} }
contextVk->addGarbage(&mImageView); contextVk->addGarbage(&mImageView);
contextVk->addGarbage(&mCubeImageFetchView);
} }
} // namespace rx } // namespace rx
...@@ -61,7 +61,6 @@ class RenderbufferVk : public RenderbufferImpl ...@@ -61,7 +61,6 @@ class RenderbufferVk : public RenderbufferImpl
bool mOwnsImage; bool mOwnsImage;
vk::ImageHelper *mImage; vk::ImageHelper *mImage;
vk::ImageView mImageView; vk::ImageView mImageView;
vk::ImageView mCubeImageFetchView;
RenderTargetVk mRenderTarget; RenderTargetVk mRenderTarget;
}; };
......
...@@ -177,9 +177,9 @@ OffscreenSurfaceVk::OffscreenSurfaceVk(const egl::SurfaceState &surfaceState, ...@@ -177,9 +177,9 @@ OffscreenSurfaceVk::OffscreenSurfaceVk(const egl::SurfaceState &surfaceState,
EGLint height) EGLint height)
: SurfaceVk(surfaceState), mWidth(width), mHeight(height) : SurfaceVk(surfaceState), mWidth(width), mHeight(height)
{ {
mColorRenderTarget.init(&mColorAttachment.image, &mColorAttachment.imageView, nullptr, 0, 0); mColorRenderTarget.init(&mColorAttachment.image, &mColorAttachment.imageView, 0, 0);
mDepthStencilRenderTarget.init(&mDepthStencilAttachment.image, mDepthStencilRenderTarget.init(&mDepthStencilAttachment.image,
&mDepthStencilAttachment.imageView, nullptr, 0, 0); &mDepthStencilAttachment.imageView, 0, 0);
} }
OffscreenSurfaceVk::~OffscreenSurfaceVk() {} OffscreenSurfaceVk::~OffscreenSurfaceVk() {}
...@@ -408,8 +408,8 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState, ...@@ -408,8 +408,8 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
{ {
// Initialize the color render target with the multisampled targets. If not multisampled, the // Initialize the color render target with the multisampled targets. If not multisampled, the
// render target will be updated to refer to a swapchain image on every acquire. // render target will be updated to refer to a swapchain image on every acquire.
mColorRenderTarget.init(&mColorImageMS, &mColorImageViewMS, nullptr, 0, 0); mColorRenderTarget.init(&mColorImageMS, &mColorImageViewMS, 0, 0);
mDepthStencilRenderTarget.init(&mDepthStencilImage, &mDepthStencilImageView, nullptr, 0, 0); mDepthStencilRenderTarget.init(&mDepthStencilImage, &mDepthStencilImageView, 0, 0);
} }
WindowSurfaceVk::~WindowSurfaceVk() WindowSurfaceVk::~WindowSurfaceVk()
......
...@@ -470,7 +470,7 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context, ...@@ -470,7 +470,7 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
return copySubImageImplWithDraw(contextVk, offsetImageIndex, modifiedDestOffset, destFormat, return copySubImageImplWithDraw(contextVk, offsetImageIndex, modifiedDestOffset, destFormat,
0, clippedSourceArea, isViewportFlipY, false, false, false, 0, clippedSourceArea, isViewportFlipY, false, false, false,
&colorReadRT->getImage(), colorReadRT->getFetchImageView()); &colorReadRT->getImage(), colorReadRT->getReadImageView());
} }
// Do a CPU readback that does the conversion, and then stage the change to the pixel buffer. // Do a CPU readback that does the conversion, and then stage the change to the pixel buffer.
...@@ -953,8 +953,8 @@ void TextureVk::setImageHelper(ContextVk *contextVk, ...@@ -953,8 +953,8 @@ 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, &mDefaultViews.mFetchImageView, mRenderTarget.init(mImage, &mDefaultViews.mDrawImageView, getNativeImageLevel(0),
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();
...@@ -1376,29 +1376,13 @@ angle::Result TextureVk::initLayerRenderTargets(ContextVk *contextVk, GLuint lay ...@@ -1376,29 +1376,13 @@ angle::Result TextureVk::initLayerRenderTargets(ContextVk *contextVk, GLuint lay
if (!mLayerRenderTargets.empty()) if (!mLayerRenderTargets.empty())
return angle::Result::Continue; return angle::Result::Continue;
const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
mLayerFetchImageView.resize(layerCount);
mLayerRenderTargets.resize(layerCount); mLayerRenderTargets.resize(layerCount);
for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex)
{ {
const vk::ImageView *drawView; const vk::ImageView *drawView;
ANGLE_TRY(getLayerLevelDrawImageView(contextVk, layerIndex, 0, &drawView)); ANGLE_TRY(getLayerLevelDrawImageView(contextVk, layerIndex, 0, &drawView));
mLayerRenderTargets[layerIndex].init(mImage, drawView, getNativeImageLevel(0),
// 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(layerCount, mImage->getSamples());
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, mImage->getAspectFlags(),
mappedSwizzle, &mLayerFetchImageView[layerIndex],
getNativeImageLevel(0), 1,
getNativeImageLayer(layerIndex), 1));
mLayerRenderTargets[layerIndex].init(mImage, drawView, &mLayerFetchImageView[layerIndex],
getNativeImageLevel(0),
getNativeImageLayer(layerIndex)); getNativeImageLayer(layerIndex));
} }
return angle::Result::Continue; return angle::Result::Continue;
...@@ -1558,16 +1542,13 @@ const vk::ImageView &TextureVk::getReadImageView() const ...@@ -1558,16 +1542,13 @@ const vk::ImageView &TextureVk::getReadImageView() const
const vk::ImageView &TextureVk::getFetchImageView() const const vk::ImageView &TextureVk::getFetchImageView() const
{ {
ASSERT(mImage->valid());
if (!mDefaultViews.mFetchImageView.valid()) const TextureVkViews *activeViews = getTextureViews();
if (activeViews->mFetchImageView.valid())
{ {
return getReadImageView(); return activeViews->mFetchImageView;
} }
return activeViews->mReadImageView;
ASSERT(mImage->valid());
const TextureVkViews *activeView = getTextureViews();
return activeView->mFetchImageView;
} }
vk::ImageView *TextureVk::getLayerLevelImageViewImpl(vk::LayerLevelImageViewVector *imageViews, vk::ImageView *TextureVk::getLayerLevelImageViewImpl(vk::LayerLevelImageViewVector *imageViews,
...@@ -1746,6 +1727,7 @@ angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk, ...@@ -1746,6 +1727,7 @@ angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk,
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), aspectFlags, mappedSwizzle, ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), aspectFlags, mappedSwizzle,
&view->mReadImageView, baseLevel, levelCount, baseLayer, &view->mReadImageView, baseLevel, levelCount, baseLayer,
layerCount)); layerCount));
if (mState.getType() == gl::TextureType::CubeMap || if (mState.getType() == gl::TextureType::CubeMap ||
mState.getType() == gl::TextureType::_2DArray || mState.getType() == gl::TextureType::_2DArray ||
mState.getType() == gl::TextureType::_2DMultisampleArray) mState.getType() == gl::TextureType::_2DMultisampleArray)
...@@ -1756,6 +1738,7 @@ angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk, ...@@ -1756,6 +1738,7 @@ angle::Result TextureVk::initImageViewImpl(ContextVk *contextVk,
&view->mFetchImageView, baseLevel, levelCount, &view->mFetchImageView, baseLevel, levelCount,
baseLayer, layerCount)); baseLayer, 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,
...@@ -1824,11 +1807,6 @@ void TextureVk::releaseImageViews(ContextVk *contextVk) ...@@ -1824,11 +1807,6 @@ void TextureVk::releaseImageViews(ContextVk *contextVk)
} }
} }
mLayerLevelDrawImageViews.clear(); mLayerLevelDrawImageViews.clear();
for (vk::ImageView &imageView : mLayerFetchImageView)
{
contextVk->addGarbage(&imageView);
}
mLayerFetchImageView.clear();
for (vk::ImageView &imageView : mLevelStorageImageViews) for (vk::ImageView &imageView : mLevelStorageImageViews)
{ {
contextVk->addGarbage(&imageView); contextVk->addGarbage(&imageView);
......
...@@ -354,8 +354,6 @@ class TextureVk : public TextureImpl ...@@ -354,8 +354,6 @@ class TextureVk : public TextureImpl
TextureVkViews mStencilViews; TextureVkViews mStencilViews;
// Draw views. // Draw views.
vk::LayerLevelImageViewVector mLayerLevelDrawImageViews; vk::LayerLevelImageViewVector mLayerLevelDrawImageViews;
// Fetch views.
vk::ImageViewVector mLayerFetchImageView;
// 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