Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 29b4941

Browse files
ShabbyXCommit Bot
authored and
Commit Bot
committed
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 <[email protected]> Reviewed-by: Geoff Lang <[email protected]>
1 parent 988d9a0 commit 29b4941

File tree

7 files changed

+2406
-200
lines changed

7 files changed

+2406
-200
lines changed

src/libANGLE/renderer/vulkan/FramebufferVk.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,8 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
11011101
{
11021102
RendererVk *renderer = contextVk->getRenderer();
11031103

1104+
ANGLE_TRY(renderTarget->ensureImageInitialized(contextVk));
1105+
11041106
vk::CommandBuffer *commandBuffer = nullptr;
11051107
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
11061108

src/libANGLE/renderer/vulkan/RenderTargetVk.cpp

+20-3
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,26 @@
1010
#include "libANGLE/renderer/vulkan/RenderTargetVk.h"
1111

1212
#include "libANGLE/renderer/vulkan/CommandGraph.h"
13+
#include "libANGLE/renderer/vulkan/TextureVk.h"
1314
#include "libANGLE/renderer/vulkan/vk_format_utils.h"
1415
#include "libANGLE/renderer/vulkan/vk_helpers.h"
1516

1617
namespace rx
1718
{
18-
RenderTargetVk::RenderTargetVk(vk::ImageHelper *image, vk::ImageView *imageView, size_t layerIndex)
19-
: mImage(image), mImageView(imageView), mLayerIndex(layerIndex)
19+
RenderTargetVk::RenderTargetVk(vk::ImageHelper *image,
20+
vk::ImageView *imageView,
21+
size_t layerIndex,
22+
TextureVk *owner)
23+
: mImage(image), mImageView(imageView), mLayerIndex(layerIndex), mOwner(owner)
2024
{}
2125

2226
RenderTargetVk::~RenderTargetVk() {}
2327

2428
RenderTargetVk::RenderTargetVk(RenderTargetVk &&other)
25-
: mImage(other.mImage), mImageView(other.mImageView), mLayerIndex(other.mLayerIndex)
29+
: mImage(other.mImage),
30+
mImageView(other.mImageView),
31+
mLayerIndex(other.mLayerIndex),
32+
mOwner(other.mOwner)
2633
{}
2734

2835
void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
@@ -107,6 +114,7 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView
107114
ASSERT(image && image->valid() && imageView && imageView->valid());
108115
mImage = image;
109116
mImageView = imageView;
117+
mOwner = nullptr;
110118
}
111119

112120
vk::ImageHelper *RenderTargetVk::getImageForRead(vk::RecordableGraphResource *readingResource,
@@ -133,4 +141,13 @@ vk::ImageHelper *RenderTargetVk::getImageForWrite(
133141
return mImage;
134142
}
135143

144+
angle::Result RenderTargetVk::ensureImageInitialized(ContextVk *contextVk)
145+
{
146+
if (mOwner)
147+
{
148+
return mOwner->ensureImageInitialized(contextVk);
149+
}
150+
return angle::Result::Continue;
151+
}
152+
136153
} // namespace rx

src/libANGLE/renderer/vulkan/RenderTargetVk.h

+13-1
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,19 @@ class RecordableGraphResource;
2828
class RenderPassDesc;
2929
} // namespace vk
3030

31+
class ContextVk;
32+
class TextureVk;
33+
3134
// This is a very light-weight class that does not own to the resources it points to.
3235
// It's meant only to copy across some information from a FramebufferAttachment to the
3336
// business rendering logic. It stores Images and ImageViews by pointer for performance.
3437
class RenderTargetVk final : public FramebufferAttachmentRenderTarget
3538
{
3639
public:
37-
RenderTargetVk(vk::ImageHelper *image, vk::ImageView *imageView, size_t layerIndex);
40+
RenderTargetVk(vk::ImageHelper *image,
41+
vk::ImageView *imageView,
42+
size_t layerIndex,
43+
TextureVk *ownwer);
3844
~RenderTargetVk();
3945

4046
// Used in std::vector initialization.
@@ -68,12 +74,18 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
6874
// RenderTargetVk pointer.
6975
void updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView);
7076

77+
angle::Result ensureImageInitialized(ContextVk *contextVk);
78+
7179
private:
7280
vk::ImageHelper *mImage;
7381
// Note that the draw and read image views are the same, given the requirements of a render
7482
// target.
7583
vk::ImageView *mImageView;
7684
size_t mLayerIndex;
85+
86+
// If owned by the texture, this will be non-nullptr, and is used to ensure texture changes
87+
// are flushed.
88+
TextureVk *mOwner;
7789
};
7890

7991
} // namespace rx

src/libANGLE/renderer/vulkan/RenderbufferVk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ constexpr VkClearColorValue kBlackClearColorValue = {{0}};
2424
} // anonymous namespace
2525

2626
RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
27-
: RenderbufferImpl(state), mRenderTarget(&mImage, &mImageView, 0)
27+
: RenderbufferImpl(state), mRenderTarget(&mImage, &mImageView, 0, nullptr)
2828
{}
2929

3030
RenderbufferVk::~RenderbufferVk() {}

src/libANGLE/renderer/vulkan/SurfaceVk.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ constexpr VkImageUsageFlags kSurfaceVKDepthStencilImageUsageFlags =
7474

7575
} // namespace
7676

77-
OffscreenSurfaceVk::AttachmentImage::AttachmentImage() : renderTarget(&image, &imageView, 0) {}
77+
OffscreenSurfaceVk::AttachmentImage::AttachmentImage()
78+
: renderTarget(&image, &imageView, 0, nullptr)
79+
{}
7880

7981
OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default;
8082

@@ -270,8 +272,8 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
270272
mInstance(VK_NULL_HANDLE),
271273
mSwapchain(VK_NULL_HANDLE),
272274
mSwapchainPresentMode(VK_PRESENT_MODE_FIFO_KHR),
273-
mColorRenderTarget(nullptr, nullptr, 0),
274-
mDepthStencilRenderTarget(&mDepthStencilImage, &mDepthStencilImageView, 0),
275+
mColorRenderTarget(nullptr, nullptr, 0, nullptr),
276+
mDepthStencilRenderTarget(&mDepthStencilImage, &mDepthStencilImageView, 0, nullptr),
275277
mCurrentSwapchainImageIndex(0),
276278
mCurrentSwapSerialIndex(0)
277279
{}

src/libANGLE/renderer/vulkan/TextureVk.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ PixelBuffer::SubresourceUpdate::SubresourceUpdate(const SubresourceUpdate &other
383383
// TextureVk implementation.
384384
TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer)
385385
: TextureImpl(state),
386-
mRenderTarget(&mImage, &mDrawBaseLevelImageView, 0),
386+
mRenderTarget(&mImage, &mDrawBaseLevelImageView, 0, this),
387387
mPixelBuffer(renderer)
388388
{}
389389

@@ -996,7 +996,7 @@ angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk)
996996
{
997997
vk::ImageView *imageView;
998998
ANGLE_TRY(getLayerLevelDrawImageView(contextVk, cubeMapFaceIndex, 0, &imageView));
999-
mCubeMapRenderTargets.emplace_back(&mImage, imageView, cubeMapFaceIndex);
999+
mCubeMapRenderTargets.emplace_back(&mImage, imageView, cubeMapFaceIndex, this);
10001000
}
10011001
return angle::Result::Continue;
10021002
}

0 commit comments

Comments
 (0)