Commit 29b49417 by Shahbaz Youssefi Committed by Commit Bot

Make copy texture test more extensive

By doing the copy multiple times, we exercise both paths where the destination is already initialized and when it's not. This adds tests for all combinations of formats and flags. Bug: angleproject:2958 Change-Id: I56afb44496acd1b4d5a8527f4dbee29afbac9c81 Reviewed-on: https://chromium-review.googlesource.com/c/1398643 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 988d9a06
...@@ -1101,6 +1101,8 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk, ...@@ -1101,6 +1101,8 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
{ {
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
ANGLE_TRY(renderTarget->ensureImageInitialized(contextVk));
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer)); ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
......
...@@ -10,19 +10,26 @@ ...@@ -10,19 +10,26 @@
#include "libANGLE/renderer/vulkan/RenderTargetVk.h" #include "libANGLE/renderer/vulkan/RenderTargetVk.h"
#include "libANGLE/renderer/vulkan/CommandGraph.h" #include "libANGLE/renderer/vulkan/CommandGraph.h"
#include "libANGLE/renderer/vulkan/TextureVk.h"
#include "libANGLE/renderer/vulkan/vk_format_utils.h" #include "libANGLE/renderer/vulkan/vk_format_utils.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h" #include "libANGLE/renderer/vulkan/vk_helpers.h"
namespace rx namespace rx
{ {
RenderTargetVk::RenderTargetVk(vk::ImageHelper *image, vk::ImageView *imageView, size_t layerIndex) RenderTargetVk::RenderTargetVk(vk::ImageHelper *image,
: mImage(image), mImageView(imageView), mLayerIndex(layerIndex) vk::ImageView *imageView,
size_t layerIndex,
TextureVk *owner)
: mImage(image), mImageView(imageView), mLayerIndex(layerIndex), mOwner(owner)
{} {}
RenderTargetVk::~RenderTargetVk() {} RenderTargetVk::~RenderTargetVk() {}
RenderTargetVk::RenderTargetVk(RenderTargetVk &&other) RenderTargetVk::RenderTargetVk(RenderTargetVk &&other)
: mImage(other.mImage), mImageView(other.mImageView), mLayerIndex(other.mLayerIndex) : mImage(other.mImage),
mImageView(other.mImageView),
mLayerIndex(other.mLayerIndex),
mOwner(other.mOwner)
{} {}
void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk, void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
...@@ -107,6 +114,7 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView ...@@ -107,6 +114,7 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView
ASSERT(image && image->valid() && imageView && imageView->valid()); ASSERT(image && image->valid() && imageView && imageView->valid());
mImage = image; mImage = image;
mImageView = imageView; mImageView = imageView;
mOwner = nullptr;
} }
vk::ImageHelper *RenderTargetVk::getImageForRead(vk::RecordableGraphResource *readingResource, vk::ImageHelper *RenderTargetVk::getImageForRead(vk::RecordableGraphResource *readingResource,
...@@ -133,4 +141,13 @@ vk::ImageHelper *RenderTargetVk::getImageForWrite( ...@@ -133,4 +141,13 @@ vk::ImageHelper *RenderTargetVk::getImageForWrite(
return mImage; return mImage;
} }
angle::Result RenderTargetVk::ensureImageInitialized(ContextVk *contextVk)
{
if (mOwner)
{
return mOwner->ensureImageInitialized(contextVk);
}
return angle::Result::Continue;
}
} // namespace rx } // namespace rx
...@@ -28,13 +28,19 @@ class RecordableGraphResource; ...@@ -28,13 +28,19 @@ class RecordableGraphResource;
class RenderPassDesc; class RenderPassDesc;
} // namespace vk } // namespace vk
class ContextVk;
class TextureVk;
// This is a very light-weight class that does not own to the resources it points to. // This is a very light-weight class that does not own to the resources it points to.
// It's meant only to copy across some information from a FramebufferAttachment to the // It's meant only to copy across some information from a FramebufferAttachment to the
// business rendering logic. It stores Images and ImageViews by pointer for performance. // business rendering logic. It stores Images and ImageViews by pointer for performance.
class RenderTargetVk final : public FramebufferAttachmentRenderTarget class RenderTargetVk final : public FramebufferAttachmentRenderTarget
{ {
public: public:
RenderTargetVk(vk::ImageHelper *image, vk::ImageView *imageView, size_t layerIndex); RenderTargetVk(vk::ImageHelper *image,
vk::ImageView *imageView,
size_t layerIndex,
TextureVk *ownwer);
~RenderTargetVk(); ~RenderTargetVk();
// Used in std::vector initialization. // Used in std::vector initialization.
...@@ -68,12 +74,18 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -68,12 +74,18 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
// RenderTargetVk pointer. // RenderTargetVk pointer.
void updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView); void updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView);
angle::Result ensureImageInitialized(ContextVk *contextVk);
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.
vk::ImageView *mImageView; vk::ImageView *mImageView;
size_t mLayerIndex; size_t mLayerIndex;
// If owned by the texture, this will be non-nullptr, and is used to ensure texture changes
// are flushed.
TextureVk *mOwner;
}; };
} // namespace rx } // namespace rx
......
...@@ -24,7 +24,7 @@ constexpr VkClearColorValue kBlackClearColorValue = {{0}}; ...@@ -24,7 +24,7 @@ constexpr VkClearColorValue kBlackClearColorValue = {{0}};
} // anonymous namespace } // anonymous namespace
RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state) RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
: RenderbufferImpl(state), mRenderTarget(&mImage, &mImageView, 0) : RenderbufferImpl(state), mRenderTarget(&mImage, &mImageView, 0, nullptr)
{} {}
RenderbufferVk::~RenderbufferVk() {} RenderbufferVk::~RenderbufferVk() {}
......
...@@ -74,7 +74,9 @@ constexpr VkImageUsageFlags kSurfaceVKDepthStencilImageUsageFlags = ...@@ -74,7 +74,9 @@ constexpr VkImageUsageFlags kSurfaceVKDepthStencilImageUsageFlags =
} // namespace } // namespace
OffscreenSurfaceVk::AttachmentImage::AttachmentImage() : renderTarget(&image, &imageView, 0) {} OffscreenSurfaceVk::AttachmentImage::AttachmentImage()
: renderTarget(&image, &imageView, 0, nullptr)
{}
OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default; OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default;
...@@ -270,8 +272,8 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState, ...@@ -270,8 +272,8 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
mInstance(VK_NULL_HANDLE), mInstance(VK_NULL_HANDLE),
mSwapchain(VK_NULL_HANDLE), mSwapchain(VK_NULL_HANDLE),
mSwapchainPresentMode(VK_PRESENT_MODE_FIFO_KHR), mSwapchainPresentMode(VK_PRESENT_MODE_FIFO_KHR),
mColorRenderTarget(nullptr, nullptr, 0), mColorRenderTarget(nullptr, nullptr, 0, nullptr),
mDepthStencilRenderTarget(&mDepthStencilImage, &mDepthStencilImageView, 0), mDepthStencilRenderTarget(&mDepthStencilImage, &mDepthStencilImageView, 0, nullptr),
mCurrentSwapchainImageIndex(0), mCurrentSwapchainImageIndex(0),
mCurrentSwapSerialIndex(0) mCurrentSwapSerialIndex(0)
{} {}
......
...@@ -383,7 +383,7 @@ PixelBuffer::SubresourceUpdate::SubresourceUpdate(const SubresourceUpdate &other ...@@ -383,7 +383,7 @@ PixelBuffer::SubresourceUpdate::SubresourceUpdate(const SubresourceUpdate &other
// TextureVk implementation. // TextureVk implementation.
TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer) TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer)
: TextureImpl(state), : TextureImpl(state),
mRenderTarget(&mImage, &mDrawBaseLevelImageView, 0), mRenderTarget(&mImage, &mDrawBaseLevelImageView, 0, this),
mPixelBuffer(renderer) mPixelBuffer(renderer)
{} {}
...@@ -996,7 +996,7 @@ angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk) ...@@ -996,7 +996,7 @@ angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk)
{ {
vk::ImageView *imageView; vk::ImageView *imageView;
ANGLE_TRY(getLayerLevelDrawImageView(contextVk, cubeMapFaceIndex, 0, &imageView)); ANGLE_TRY(getLayerLevelDrawImageView(contextVk, cubeMapFaceIndex, 0, &imageView));
mCubeMapRenderTargets.emplace_back(&mImage, imageView, cubeMapFaceIndex); mCubeMapRenderTargets.emplace_back(&mImage, imageView, cubeMapFaceIndex, this);
} }
return angle::Result::Continue; return angle::Result::Continue;
} }
......
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