D3D11: Fix 3D ReadPixels with PBOs.
Pass the FBO attachment to the Buffer packing method so we can
retrieve the layer of the attachment when doing an asynchronous
readback. Also take advantage of the TextureHelper11 class to
remove some redundant code.
BUG=angleproject:1290
Change-Id: I26bb21a03e0ff7a42aab4eee75f3c3d12915f398
Reviewed-on: https://chromium-review.googlesource.com/324021
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/tests/gl_tests/ReadPixelsTest.cpp b/src/tests/gl_tests/ReadPixelsTest.cpp
index c2853c9..8d5c077 100644
--- a/src/tests/gl_tests/ReadPixelsTest.cpp
+++ b/src/tests/gl_tests/ReadPixelsTest.cpp
@@ -439,17 +439,42 @@
ANGLETest::TearDown();
}
- void testRead(GLenum textureTarget, GLint levels, GLint attachmentLevel, GLint attachmentLayer)
+ void initTexture(GLenum textureTarget,
+ GLint levels,
+ GLint attachmentLevel,
+ GLint attachmentLayer)
{
glBindTexture(textureTarget, mTexture);
glTexStorage3D(textureTarget, levels, GL_RGBA8, 4, 4, 4);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, attachmentLevel,
attachmentLayer);
-
initializeTextureData(textureTarget, levels);
+ }
+
+ void testRead(GLenum textureTarget, GLint levels, GLint attachmentLevel, GLint attachmentLayer)
+ {
+ initTexture(textureTarget, levels, attachmentLevel, attachmentLayer);
verifyColor(attachmentLevel, attachmentLayer);
}
+ void initPBO()
+ {
+ glGenBuffers(1, &mBuffer);
+ glBindBuffer(GL_PIXEL_PACK_BUFFER, mBuffer);
+ glBufferData(GL_PIXEL_PACK_BUFFER, sizeof(angle::GLColor), nullptr, GL_STREAM_COPY);
+ ASSERT_GL_NO_ERROR();
+ }
+
+ void testPBORead(GLenum textureTarget,
+ GLint levels,
+ GLint attachmentLevel,
+ GLint attachmentLayer)
+ {
+ initPBO();
+ initTexture(textureTarget, levels, attachmentLevel, attachmentLayer);
+ verifyPBO(attachmentLevel, attachmentLayer);
+ }
+
// Give each {level,layer} pair a (probably) unique color via random.
GLuint getColorValue(GLint level, GLint layer)
{
@@ -463,6 +488,21 @@
EXPECT_PIXEL_COLOR_EQ(0, 0, colorValue);
}
+ void verifyPBO(GLint level, GLint layer)
+ {
+ glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+ angle::GLColor expectedColor(getColorValue(level, layer));
+ void *mapPointer =
+ glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, sizeof(angle::GLColor), GL_MAP_READ_BIT);
+ ASSERT_NE(nullptr, mapPointer);
+ angle::GLColor actualColor;
+ memcpy(&actualColor, mapPointer, sizeof(angle::GLColor));
+ glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
+ ASSERT_GL_NO_ERROR();
+ EXPECT_EQ(expectedColor, actualColor);
+ }
+
void initializeTextureData(GLenum textureTarget, GLint levels)
{
for (GLint level = 0; level < levels; ++level)
@@ -489,6 +529,7 @@
angle::RNG mRNG;
GLuint mFBO;
GLuint mTexture;
+ GLuint mBuffer;
};
// Test 3D attachment readback.
@@ -539,7 +580,53 @@
testRead(GL_TEXTURE_2D_ARRAY, 2, 1, 1);
}
-// TODO(jmadill): Tests for PBOs with 3D and layer attachments.
+// Test 3D attachment PBO readback.
+TEST_P(ReadPixelsTextureTest, BasicAttachment3DPBO)
+{
+ testPBORead(GL_TEXTURE_3D, 1, 0, 0);
+}
+
+// Test 3D attachment readback, non-zero mip.
+TEST_P(ReadPixelsTextureTest, MipAttachment3DPBO)
+{
+ testPBORead(GL_TEXTURE_3D, 2, 1, 0);
+}
+
+// Test 3D attachment readback, non-zero layer.
+TEST_P(ReadPixelsTextureTest, LayerAttachment3DPBO)
+{
+ testPBORead(GL_TEXTURE_3D, 1, 0, 1);
+}
+
+// Test 3D attachment readback, non-zero mip and layer.
+TEST_P(ReadPixelsTextureTest, MipLayerAttachment3DPBO)
+{
+ testPBORead(GL_TEXTURE_3D, 2, 1, 1);
+}
+
+// Test 2D array attachment readback.
+TEST_P(ReadPixelsTextureTest, BasicAttachment2DArrayPBO)
+{
+ testPBORead(GL_TEXTURE_2D_ARRAY, 1, 0, 0);
+}
+
+// Test 3D attachment readback, non-zero mip.
+TEST_P(ReadPixelsTextureTest, MipAttachment2DArrayPBO)
+{
+ testPBORead(GL_TEXTURE_2D_ARRAY, 2, 1, 0);
+}
+
+// Test 3D attachment readback, non-zero layer.
+TEST_P(ReadPixelsTextureTest, LayerAttachment2DArrayPBO)
+{
+ testPBORead(GL_TEXTURE_2D_ARRAY, 1, 0, 1);
+}
+
+// Test 3D attachment readback, non-zero mip and layer.
+TEST_P(ReadPixelsTextureTest, MipLayerAttachment2DArrayPBO)
+{
+ testPBORead(GL_TEXTURE_2D_ARRAY, 2, 1, 1);
+}
} // anonymous namespace