11f12fa0b05d0d829870908bf23457545c184365cGeoff Lang#include "ANGLETest.h" 21f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 31f12fa0b05d0d829870908bf23457545c184365cGeoff Langclass LineLoopTest : public ANGLETest 41f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 51f12fa0b05d0d829870908bf23457545c184365cGeoff Langprotected: 61f12fa0b05d0d829870908bf23457545c184365cGeoff Lang LineLoopTest() 71f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 81f12fa0b05d0d829870908bf23457545c184365cGeoff Lang setWindowWidth(256); 91f12fa0b05d0d829870908bf23457545c184365cGeoff Lang setWindowHeight(256); 101f12fa0b05d0d829870908bf23457545c184365cGeoff Lang setConfigRedBits(8); 111f12fa0b05d0d829870908bf23457545c184365cGeoff Lang setConfigGreenBits(8); 121f12fa0b05d0d829870908bf23457545c184365cGeoff Lang setConfigBlueBits(8); 131f12fa0b05d0d829870908bf23457545c184365cGeoff Lang setConfigAlphaBits(8); 141f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 151f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 161f12fa0b05d0d829870908bf23457545c184365cGeoff Lang virtual void SetUp() 171f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 181f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ANGLETest::SetUp(); 191f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 201f12fa0b05d0d829870908bf23457545c184365cGeoff Lang const std::string vsSource = SHADER_SOURCE 211f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ( 221f12fa0b05d0d829870908bf23457545c184365cGeoff Lang attribute highp vec4 position; 231f12fa0b05d0d829870908bf23457545c184365cGeoff Lang attribute highp vec4 in_color; 241f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 251f12fa0b05d0d829870908bf23457545c184365cGeoff Lang varying highp vec4 color; 261f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 271f12fa0b05d0d829870908bf23457545c184365cGeoff Lang void main(void) 281f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 291f12fa0b05d0d829870908bf23457545c184365cGeoff Lang gl_Position = position; 301f12fa0b05d0d829870908bf23457545c184365cGeoff Lang color = in_color; 311f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 321f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ); 331f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 341f12fa0b05d0d829870908bf23457545c184365cGeoff Lang const std::string fsSource = SHADER_SOURCE 351f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ( 361f12fa0b05d0d829870908bf23457545c184365cGeoff Lang varying highp vec4 color; 371f12fa0b05d0d829870908bf23457545c184365cGeoff Lang void main(void) 381f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 391f12fa0b05d0d829870908bf23457545c184365cGeoff Lang gl_FragColor = color; 401f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 411f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ); 421f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 435599c8f6ffa7239c40069288461e015f9e545ff4Jamie Madill mProgram = CompileProgram(vsSource, fsSource); 441f12fa0b05d0d829870908bf23457545c184365cGeoff Lang if (mProgram == 0) 451f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 461f12fa0b05d0d829870908bf23457545c184365cGeoff Lang FAIL() << "shader compilation failed."; 471f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 481f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 491f12fa0b05d0d829870908bf23457545c184365cGeoff Lang mPositionLocation = glGetAttribLocation(mProgram, "position"); 501f12fa0b05d0d829870908bf23457545c184365cGeoff Lang mColorLocation = glGetAttribLocation(mProgram, "in_color"); 511f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 521f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBlendFunc(GL_ONE, GL_ONE); 531f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glEnable(GL_BLEND); 541f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 551f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 561f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glClear(GL_COLOR_BUFFER_BIT); 571f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 581f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ASSERT_GL_NO_ERROR(); 591f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 601f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 611f12fa0b05d0d829870908bf23457545c184365cGeoff Lang virtual void TearDown() 621f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 631f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glDeleteProgram(mProgram); 641f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 651f12fa0b05d0d829870908bf23457545c184365cGeoff Lang ANGLETest::TearDown(); 661f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 671f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 681f12fa0b05d0d829870908bf23457545c184365cGeoff Lang void runTest(GLenum indexType, GLubyte indexBuffer, const GLvoid *indexPtr) 691f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 701f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLfloat loopPositions[] = 711f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 721f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.0f, 0.0f, 731f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.0f, 0.0f, 741f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.0f, 0.0f, 751f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.0f, 0.0f, 761f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.0f, 0.0f, 771f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.0f, 0.0f, 781f12fa0b05d0d829870908bf23457545c184365cGeoff Lang -0.5f, -0.5f, 791f12fa0b05d0d829870908bf23457545c184365cGeoff Lang -0.5f, 0.5f, 801f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.5f, 0.5f, 811f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.5f, -0.5f 821f12fa0b05d0d829870908bf23457545c184365cGeoff Lang }; 831f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 841f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLfloat stripPositions[] = 851f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 861f12fa0b05d0d829870908bf23457545c184365cGeoff Lang -0.5f, -0.5f, 871f12fa0b05d0d829870908bf23457545c184365cGeoff Lang -0.5f, 0.5f, 881f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.5f, 0.5f, 891f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 0.5f, -0.5f 901f12fa0b05d0d829870908bf23457545c184365cGeoff Lang }; 911f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLubyte stripIndices[] = 921f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 931f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 2, 0, 3, 1, 2 941f12fa0b05d0d829870908bf23457545c184365cGeoff Lang }; 951f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 961f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glUseProgram(mProgram); 971f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 981f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glEnableVertexAttribArray(mPositionLocation); 991f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, loopPositions); 1001f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glUniform4f(mColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); 1011f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glDrawElements(GL_LINE_LOOP, 4, indexType, indexPtr); 1021f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1031f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 1041f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, stripPositions); 1051f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glUniform4f(mColorLocation, 0, 1, 0, 1); 1061f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glDrawElements(GL_LINE_STRIP, 5, GL_UNSIGNED_BYTE, stripIndices); 1071f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1081f12fa0b05d0d829870908bf23457545c184365cGeoff Lang std::vector<GLubyte> pixels(getWindowWidth() * getWindowHeight() * 4); 1091f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); 1101f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1111f12fa0b05d0d829870908bf23457545c184365cGeoff Lang for (int y = 0; y < getWindowHeight(); y++) 1121f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 1131f12fa0b05d0d829870908bf23457545c184365cGeoff Lang for (int x = 0; x < getWindowWidth(); x++) 1141f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 1151f12fa0b05d0d829870908bf23457545c184365cGeoff Lang const GLubyte* pixel = pixels.data() + ((y * getWindowWidth() + x) * 4); 1161f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1171f12fa0b05d0d829870908bf23457545c184365cGeoff Lang EXPECT_EQ(pixel[0], 0); 1181f12fa0b05d0d829870908bf23457545c184365cGeoff Lang EXPECT_EQ(pixel[1], pixel[2]); 1191f12fa0b05d0d829870908bf23457545c184365cGeoff Lang EXPECT_EQ(pixel[3], 255); 1201f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 1211f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 1221f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 1231f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1241f12fa0b05d0d829870908bf23457545c184365cGeoff Lang GLuint mProgram; 1251f12fa0b05d0d829870908bf23457545c184365cGeoff Lang GLint mPositionLocation; 1261f12fa0b05d0d829870908bf23457545c184365cGeoff Lang GLint mColorLocation; 1271f12fa0b05d0d829870908bf23457545c184365cGeoff Lang}; 1281f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 129b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(LineLoopTest, LineLoopUByteIndices) 1301f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 1311f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 }; 1321f12fa0b05d0d829870908bf23457545c184365cGeoff Lang runTest(GL_UNSIGNED_BYTE, 0, indices + 1); 1331f12fa0b05d0d829870908bf23457545c184365cGeoff Lang} 1341f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 135b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(LineLoopTest, LineLoopUShortIndices) 1361f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 1371f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 }; 1381f12fa0b05d0d829870908bf23457545c184365cGeoff Lang runTest(GL_UNSIGNED_SHORT, 0, indices + 1); 1391f12fa0b05d0d829870908bf23457545c184365cGeoff Lang} 1401f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 141b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(LineLoopTest, LineLoopUIntIndices) 1421f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 1431f12fa0b05d0d829870908bf23457545c184365cGeoff Lang if (!extensionEnabled("GL_OES_element_index_uint")) 1441f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 1451f12fa0b05d0d829870908bf23457545c184365cGeoff Lang return; 1461f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 1471f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1481f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 }; 1491f12fa0b05d0d829870908bf23457545c184365cGeoff Lang runTest(GL_UNSIGNED_INT, 0, indices + 1); 1501f12fa0b05d0d829870908bf23457545c184365cGeoff Lang} 1511f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 152b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(LineLoopTest, LineLoopUByteIndexBuffer) 1531f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 1541f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 }; 1551f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1561f12fa0b05d0d829870908bf23457545c184365cGeoff Lang GLuint buf; 1571f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glGenBuffers(1, &buf); 1581f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf); 1591f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 1601f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1611f12fa0b05d0d829870908bf23457545c184365cGeoff Lang runTest(GL_UNSIGNED_BYTE, buf, reinterpret_cast<const void *>(sizeof(GLubyte))); 1621f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1631f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glDeleteBuffers(1, &buf); 1641f12fa0b05d0d829870908bf23457545c184365cGeoff Lang} 1651f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 166b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(LineLoopTest, LineLoopUShortIndexBuffer) 1671f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 1681f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 }; 1691f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1701f12fa0b05d0d829870908bf23457545c184365cGeoff Lang GLuint buf; 1711f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glGenBuffers(1, &buf); 1721f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf); 1731f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 1741f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1751f12fa0b05d0d829870908bf23457545c184365cGeoff Lang runTest(GL_UNSIGNED_SHORT, buf, reinterpret_cast<const void *>(sizeof(GLushort))); 1761f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1771f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glDeleteBuffers(1, &buf); 1781f12fa0b05d0d829870908bf23457545c184365cGeoff Lang} 1791f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 180b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(LineLoopTest, LineLoopUIntIndexBuffer) 1811f12fa0b05d0d829870908bf23457545c184365cGeoff Lang{ 1821f12fa0b05d0d829870908bf23457545c184365cGeoff Lang if (!extensionEnabled("GL_OES_element_index_uint")) 1831f12fa0b05d0d829870908bf23457545c184365cGeoff Lang { 1841f12fa0b05d0d829870908bf23457545c184365cGeoff Lang return; 1851f12fa0b05d0d829870908bf23457545c184365cGeoff Lang } 1861f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1871f12fa0b05d0d829870908bf23457545c184365cGeoff Lang static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 }; 1881f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1891f12fa0b05d0d829870908bf23457545c184365cGeoff Lang GLuint buf; 1901f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glGenBuffers(1, &buf); 1911f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf); 1921f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 1931f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1941f12fa0b05d0d829870908bf23457545c184365cGeoff Lang runTest(GL_UNSIGNED_INT, buf, reinterpret_cast<const void *>(sizeof(GLuint))); 1951f12fa0b05d0d829870908bf23457545c184365cGeoff Lang 1961f12fa0b05d0d829870908bf23457545c184365cGeoff Lang glDeleteBuffers(1, &buf); 1971f12fa0b05d0d829870908bf23457545c184365cGeoff Lang} 198