diff options
Diffstat (limited to 'src/tests/gl_tests/TextureTest.cpp')
-rw-r--r-- | src/tests/gl_tests/TextureTest.cpp | 97 |
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) { |