Commit d8557cc8 by Stephen White Committed by Commit Bot

Fix for readPixels() to PBO fast path.

Include the "pixels" (data) pointer as offset. Bug: angleproject:5702 Change-Id: Idc9f3ee4c0dbb1cc9308393bbf877d6137598486 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2732789Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Stephen White <senorblanco@chromium.org>
parent 71c7e346
......@@ -6384,7 +6384,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
VkBufferImageCopy region = {};
region.bufferImageHeight = srcExtent.height;
region.bufferOffset = packPixelsParams.offset;
region.bufferOffset = packPixelsParams.offset + reinterpret_cast<ptrdiff_t>(pixels);
region.bufferRowLength = packPixelsParams.outputPitch / readFormat->pixelBytes;
region.imageExtent = srcExtent;
region.imageOffset = srcOffset;
......
......@@ -253,6 +253,42 @@ TEST_P(ReadPixelsPBONVTest, ReadFromFBO)
EXPECT_GL_NO_ERROR();
}
// Test calling ReadPixels with a non-zero "data" param into a PBO
TEST_P(ReadPixelsPBONVTest, ReadFromFBOWithDataOffset)
{
ANGLE_SKIP_TEST_IF(!hasPBOExts() || !IsGLExtensionEnabled("GL_EXT_map_buffer_range") ||
!IsGLExtensionEnabled("GL_OES_mapbuffer"));
glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
glViewport(0, 0, mFBOWidth, mFBOHeight);
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Clear first pixel to green
glScissor(0, 0, 1, 1);
glEnable(GL_SCISSOR_TEST);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
EXPECT_GL_NO_ERROR();
glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
// Read (height - 1) rows offset by width * 4.
glReadPixels(0, 0, mFBOWidth, mFBOHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE,
reinterpret_cast<void *>(mFBOWidth * 4));
void *mappedPtr =
glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 4 * mFBOWidth * mFBOHeight, GL_MAP_READ_BIT);
GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(GLColor::green, dataColor[mFBOWidth]);
EXPECT_EQ(GLColor::red, dataColor[mFBOWidth + 1]);
EXPECT_EQ(GLColor::red, dataColor[mFBOWidth * mFBOHeight - 1]);
glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
EXPECT_GL_NO_ERROR();
}
class ReadPixelsPBOTest : public ReadPixelsPBONVTest
{
protected:
......
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