1f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang#include "ANGLETest.h"
2f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang
3f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Langclass ReadPixelsTest : public ANGLETest
4f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang{
5f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Langprotected:
6f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    ReadPixelsTest()
7f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    {
88a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        setClientVersion(3);
9f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        setWindowWidth(32);
10f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        setWindowHeight(32);
11f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        setConfigRedBits(8);
12f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        setConfigGreenBits(8);
13f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        setConfigBlueBits(8);
14f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        setConfigAlphaBits(8);
15f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    }
168a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
178a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    virtual void SetUp()
188a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    {
198a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        ANGLETest::SetUp();
208a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
218a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glGenBuffers(1, &mPBO);
228a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
238a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
248a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
258a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
268a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        const char *vertexShaderSrc = SHADER_SOURCE
278a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        (
288a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            attribute vec4 aTest;
298a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            attribute vec2 aPosition;
308a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            varying vec4 vTest;
318a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
328a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            void main()
338a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            {
348a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill                vTest = aTest;
358a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill                gl_Position = vec4(aPosition, 0.0, 1.0);
368a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill                gl_PointSize = 1.0;
378a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            }
388a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        );
398a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
408a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        const char *fragmentShaderSrc = SHADER_SOURCE
418a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        (
428a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            precision mediump float;
438a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            varying vec4 vTest;
448a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
458a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            void main()
468a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            {
478a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill                gl_FragColor = vTest;
488a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill            }
498a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        );
508a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
518a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        mProgram = compileProgram(vertexShaderSrc, fragmentShaderSrc);
528a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
538a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glGenTextures(1, &mTexture);
548a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindTexture(GL_TEXTURE_2D, mTexture);
558a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
568a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
578a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glGenFramebuffers(1, &mFBO);
588a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
598a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
608a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindFramebuffer(GL_FRAMEBUFFER, 0);
618a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
628a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glGenBuffers(1, &mPositionVBO);
638a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
648a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
658a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glBindBuffer(GL_ARRAY_BUFFER, 0);
668a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
678a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        ASSERT_GL_NO_ERROR();
688a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    }
698a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
708a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    virtual void TearDown()
718a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    {
728a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        ANGLETest::TearDown();
738a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
748a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glDeleteBuffers(1, &mPBO);
758a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glDeleteProgram(mProgram);
768a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glDeleteTextures(1, &mTexture);
778a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill        glDeleteFramebuffers(1, &mFBO);
788a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    }
798a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
808a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    GLuint mPBO;
818a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    GLuint mProgram;
828a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    GLuint mTexture;
838a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    GLuint mFBO;
848a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    GLuint mPositionVBO;
85f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang};
86f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang
87f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff LangTEST_F(ReadPixelsTest, out_of_bounds)
88f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang{
89f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
90f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    glClear(GL_COLOR_BUFFER_BIT);
91f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    EXPECT_GL_NO_ERROR();
92f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang
93f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    GLsizei pixelsWidth = 32;
94f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    GLsizei pixelsHeight = 32;
951eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill    GLint offset = 16;
961eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill    std::vector<GLubyte> pixels((pixelsWidth + offset) * (pixelsHeight + offset) * 4);
97f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang
981eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill    glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
99f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    EXPECT_GL_NO_ERROR();
100f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang
101f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    for (int y = pixelsHeight / 2; y < pixelsHeight; y++)
102f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    {
103f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        for (int x = pixelsWidth / 2; x < pixelsWidth; x++)
104f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        {
1051eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            const GLubyte* pixel = pixels.data() + ((y * (pixelsWidth + offset) + x) * 4);
1061eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            unsigned int r = static_cast<unsigned int>(pixel[0]);
1071eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            unsigned int g = static_cast<unsigned int>(pixel[1]);
1081eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            unsigned int b = static_cast<unsigned int>(pixel[2]);
1091eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            unsigned int a = static_cast<unsigned int>(pixel[3]);
110f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang
111f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang            // Expect that all pixels which fell within the framebuffer are red
1121eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            EXPECT_EQ(255, r);
1131eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            EXPECT_EQ(0,   g);
1141eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            EXPECT_EQ(0,   b);
1151eb5bd76f18a1f4a78330c9dd30ecc99b91c6dc3Jamie Madill            EXPECT_EQ(255, a);
116f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang        }
117f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang    }
118f11dbdb3b95ec96626edbabbb359b409c7d50e17Geoff Lang}
1198a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
1208a7bed8c585979c41797aee6aa4022e000f9e936Jamie MadillTEST_F(ReadPixelsTest, pbo_with_other_target)
1218a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill{
1228a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1238a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glClear(GL_COLOR_BUFFER_BIT);
1248a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_GL_NO_ERROR();
1258a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
1268a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
1278a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1288a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
1298a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
1308a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glBindBuffer(GL_ARRAY_BUFFER, mPBO);
1318a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
1328a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
1338a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
1348a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_GL_NO_ERROR();
1358a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
1368a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_EQ(255, dataPtr[0]);
1378a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_EQ(0,   dataPtr[1]);
1388a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_EQ(0,   dataPtr[2]);
1398a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_EQ(255, dataPtr[3]);
1408a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill
1418a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    glUnmapBuffer(GL_ARRAY_BUFFER);
1428a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill    EXPECT_GL_NO_ERROR();
1438a7bed8c585979c41797aee6aa4022e000f9e936Jamie Madill}
1442b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1452b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie MadillTEST_F(ReadPixelsTest, pbo_with_existing_data)
1462b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill{
1472b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    // Clear backbuffer to red
1482b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1492b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glClear(GL_COLOR_BUFFER_BIT);
1502b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_GL_NO_ERROR();
1512b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1522b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    // Read 16x16 region from red backbuffer to PBO
1532b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
1542b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1552b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1562b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    // Clear backbuffer to green
1572b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1582b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glClear(GL_COLOR_BUFFER_BIT);
1592b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_GL_NO_ERROR();
1602b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1612b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    // Read 16x16 region from green backbuffer to PBO at offset 16
1622b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
1632b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    GLvoid * mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
1642b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
1652b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_GL_NO_ERROR();
1662b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1672b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    // Test pixel 0 is red (existing data)
1682b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(255, dataPtr[0]);
1692b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(0, dataPtr[1]);
1702b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(0, dataPtr[2]);
1712b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(255, dataPtr[3]);
1722b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1732b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    // Test pixel 16 is green (new data)
1742b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
1752b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
1762b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
1772b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
1782b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill
1792b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
1802b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill    EXPECT_GL_NO_ERROR();
1812b5c9cbc41dee2bce452a4df177849a0b68719b0Jamie Madill}
18214764a0928837e321a242e841c3d626da27a1209Jamie Madill
18314764a0928837e321a242e841c3d626da27a1209Jamie MadillTEST_F(ReadPixelsTest, pbo_and_sub_data)
18414764a0928837e321a242e841c3d626da27a1209Jamie Madill{
18514764a0928837e321a242e841c3d626da27a1209Jamie Madill    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
18614764a0928837e321a242e841c3d626da27a1209Jamie Madill    glClear(GL_COLOR_BUFFER_BIT);
18714764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_GL_NO_ERROR();
18814764a0928837e321a242e841c3d626da27a1209Jamie Madill
18914764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
19014764a0928837e321a242e841c3d626da27a1209Jamie Madill    glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
19114764a0928837e321a242e841c3d626da27a1209Jamie Madill
19214764a0928837e321a242e841c3d626da27a1209Jamie Madill    unsigned char data[4] = { 1, 2, 3, 4 };
19314764a0928837e321a242e841c3d626da27a1209Jamie Madill
19414764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
19514764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBindBuffer(GL_ARRAY_BUFFER, mPBO);
19614764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
19714764a0928837e321a242e841c3d626da27a1209Jamie Madill
19814764a0928837e321a242e841c3d626da27a1209Jamie Madill    GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
19914764a0928837e321a242e841c3d626da27a1209Jamie Madill    unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
20014764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_GL_NO_ERROR();
20114764a0928837e321a242e841c3d626da27a1209Jamie Madill
20214764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(1, dataPtr[0]);
20314764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(2, dataPtr[1]);
20414764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(3, dataPtr[2]);
20514764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(4, dataPtr[3]);
20614764a0928837e321a242e841c3d626da27a1209Jamie Madill
20714764a0928837e321a242e841c3d626da27a1209Jamie Madill    glUnmapBuffer(GL_ARRAY_BUFFER);
20814764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_GL_NO_ERROR();
20914764a0928837e321a242e841c3d626da27a1209Jamie Madill}
21014764a0928837e321a242e841c3d626da27a1209Jamie Madill
21114764a0928837e321a242e841c3d626da27a1209Jamie MadillTEST_F(ReadPixelsTest, pbo_and_sub_data_offset)
21214764a0928837e321a242e841c3d626da27a1209Jamie Madill{
21314764a0928837e321a242e841c3d626da27a1209Jamie Madill    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
21414764a0928837e321a242e841c3d626da27a1209Jamie Madill    glClear(GL_COLOR_BUFFER_BIT);
21514764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_GL_NO_ERROR();
21614764a0928837e321a242e841c3d626da27a1209Jamie Madill
21714764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
21814764a0928837e321a242e841c3d626da27a1209Jamie Madill    glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
21914764a0928837e321a242e841c3d626da27a1209Jamie Madill
22014764a0928837e321a242e841c3d626da27a1209Jamie Madill    unsigned char data[4] = { 1, 2, 3, 4 };
22114764a0928837e321a242e841c3d626da27a1209Jamie Madill
22214764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
22314764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBindBuffer(GL_ARRAY_BUFFER, mPBO);
22414764a0928837e321a242e841c3d626da27a1209Jamie Madill    glBufferSubData(GL_ARRAY_BUFFER, 16, 4, data);
22514764a0928837e321a242e841c3d626da27a1209Jamie Madill
22614764a0928837e321a242e841c3d626da27a1209Jamie Madill    GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
22714764a0928837e321a242e841c3d626da27a1209Jamie Madill    unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
22814764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_GL_NO_ERROR();
22914764a0928837e321a242e841c3d626da27a1209Jamie Madill
23014764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(255, dataPtr[0]);
23114764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(0, dataPtr[1]);
23214764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(0, dataPtr[2]);
23314764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(255, dataPtr[3]);
23414764a0928837e321a242e841c3d626da27a1209Jamie Madill
23514764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(1, dataPtr[16]);
23614764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(2, dataPtr[17]);
23714764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(3, dataPtr[18]);
23814764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_EQ(4, dataPtr[19]);
23914764a0928837e321a242e841c3d626da27a1209Jamie Madill
24014764a0928837e321a242e841c3d626da27a1209Jamie Madill    glUnmapBuffer(GL_ARRAY_BUFFER);
24114764a0928837e321a242e841c3d626da27a1209Jamie Madill    EXPECT_GL_NO_ERROR();
24214764a0928837e321a242e841c3d626da27a1209Jamie Madill}
2435fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2445fedd0174bdf4955f3908ab3489fadfc16c317eaJamie MadillTEST_F(ReadPixelsTest, draw_with_pbo)
2455fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill{
2465fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    unsigned char data[4] = { 1, 2, 3, 4 };
2475fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2485fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBindTexture(GL_TEXTURE_2D, mTexture);
2495fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
2505fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2515fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2525fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    // glReadBuffer(GL_COLOR_ATTACHMENT0); // FIXME: currently UNIMPLEMENTED
2535fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBindFramebuffer(GL_READ_FRAMEBUFFER, mFBO);
2545fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2555fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2565fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
2575fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2585fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
2595fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2605fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2615fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    float positionData[] = { 0.5f, 0.5f };
2625fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2635fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glUseProgram(mProgram);
2645fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glViewport(0, 0, 1, 1);
2655fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
2665fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBufferSubData(GL_ARRAY_BUFFER, 0, 1 * 2 * 4, positionData);
2675fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2685fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2695fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
2705fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_NE(-1, positionLocation);
2715fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2725fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    GLint testLocation = glGetAttribLocation(mProgram, "aTest");
2735fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_NE(-1, testLocation);
2745fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2755fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
2765fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glEnableVertexAttribArray(positionLocation);
2775fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2785fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2795fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glBindBuffer(GL_ARRAY_BUFFER, mPBO);
2805fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
2815fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glEnableVertexAttribArray(testLocation);
2825fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2835fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2845fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glDrawArrays(GL_POINTS, 0, 1);
2855fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2865fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2875fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    memset(data, 0, 4);
2885fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
2895fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_GL_NO_ERROR();
2905fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill
2915fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_EQ(1, data[0]);
2925fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_EQ(2, data[1]);
2935fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_EQ(3, data[2]);
2945fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill    EXPECT_EQ(4, data[3]);
2955fedd0174bdf4955f3908ab3489fadfc16c317eaJamie Madill}
296