aboutsummaryrefslogtreecommitdiff
path: root/src/tests/gl_tests/TextureTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/gl_tests/TextureTest.cpp')
-rw-r--r--src/tests/gl_tests/TextureTest.cpp97
1 files changed, 95 insertions, 2 deletions
diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp
index 6016f7c05c..b95b78d178 100644
--- a/src/tests/gl_tests/TextureTest.cpp
+++ b/src/tests/gl_tests/TextureTest.cpp
@@ -13312,8 +13312,9 @@ TEST_P(CopyImageTestES31, CubeMapCopyImageSubData)
ASSERT_GL_NO_ERROR();
}
-// Verify that copies between texture layers works
-TEST_P(CopyImageTestES31, ArraySelfCopyImageSubData)
+// Verify that copies between texture layers works, including when there is a read after write in a
+// level/layer.
+TEST_P(CopyImageTestES31, ArraySelfCopyImageSubDataWithReadAfterWrite)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
@@ -13360,6 +13361,7 @@ TEST_P(CopyImageTestES31, ArraySelfCopyImageSubData)
1, kWidth >> 1, kHeight >> 1, 2);
// Partially copy level 1, layer 1 to level 0, layer 3
+ // Level 1/layer 1 will be read from after being written to
glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 1, kWidth / 8, kHeight / 8, 1, tex,
GL_TEXTURE_2D_ARRAY, 0, kWidth / 4, kHeight / 4, 3, kWidth / 4,
kHeight / 4, 1);
@@ -13406,6 +13408,97 @@ TEST_P(CopyImageTestES31, ArraySelfCopyImageSubData)
ASSERT_GL_NO_ERROR();
}
+// Verify that copies between texture layers works, including when there is a write after read in a
+// level/layer.
+TEST_P(CopyImageTestES31, ArraySelfCopyImageSubDataWithWriteAfterRead)
+{
+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
+
+ // Set up a texture with multiple layers, then verify we can copy between them
+ constexpr uint32_t kWidth = 13;
+ constexpr uint32_t kHeight = 57;
+ constexpr uint32_t kLayers = 5;
+ constexpr uint32_t kLevels = 2;
+ std::vector<GLColor> pixelsRed(kWidth * kHeight, GLColor::red);
+ std::vector<GLColor> pixelsGreen(kWidth * kHeight, GLColor::green);
+ std::vector<GLColor> pixelsBlue(kWidth * kHeight, GLColor::blue);
+
+ const GLColor *colors[3] = {
+ pixelsRed.data(),
+ pixelsGreen.data(),
+ pixelsBlue.data(),
+ };
+
+ GLTexture tex;
+ glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
+ glTexStorage3D(GL_TEXTURE_2D_ARRAY, kLevels, GL_RGBA8, kWidth, kHeight, kLayers);
+ for (uint32_t level = 0; level < kLevels; ++level)
+ {
+ for (uint32_t layer = 0; layer < kLayers; ++layer)
+ {
+ glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, layer, kWidth >> level,
+ kHeight >> level, 1, GL_RGBA, GL_UNSIGNED_BYTE,
+ colors[(level + layer) % 3]);
+ }
+ }
+ ASSERT_GL_NO_ERROR();
+
+ // The texture has the following colors:
+ // Layer 0 Layer 1 Layer 2 Layer 3 Layer 4
+ // Level 0 Red Green Blue Red Green
+ // Level 1 Green Blue Red Green Blue
+
+ // Copy level 0, layer 0 to level 0, layer 2
+ glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
+ 2, kWidth, kHeight, 1);
+ ASSERT_GL_NO_ERROR();
+
+ // Copy level 0, layer 1 to level 0, layer 3
+ glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
+ 3, kWidth, kHeight, 1);
+ ASSERT_GL_NO_ERROR();
+
+ // Copy level 0, layer 0 to level 0, layer 1
+ // Level 0/layer 1 will be written to from after being read from
+ glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
+ 1, kWidth, kHeight, 1);
+ ASSERT_GL_NO_ERROR();
+
+ // Verify colors
+ GLFramebuffer FBO;
+ glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 2);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 3);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 4);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 0);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 1);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 2);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::red);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 3);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
+
+ glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 4);
+ EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
+ ASSERT_GL_NO_ERROR();
+}
+
// Verify that copies between 3D texture slices work
TEST_P(CopyImageTestES31, Texture3DSelfCopyImageSubData)
{