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