Home | History | Annotate | Download | only in angle_tests
      1 #include "ANGLETest.h"
      2 
      3 class LineLoopTest : public ANGLETest
      4 {
      5 protected:
      6     LineLoopTest()
      7     {
      8         setWindowWidth(256);
      9         setWindowHeight(256);
     10         setConfigRedBits(8);
     11         setConfigGreenBits(8);
     12         setConfigBlueBits(8);
     13         setConfigAlphaBits(8);
     14     }
     15 
     16     virtual void SetUp()
     17     {
     18         ANGLETest::SetUp();
     19 
     20         const std::string vsSource = SHADER_SOURCE
     21         (
     22             attribute highp vec4 position;
     23             attribute highp vec4 in_color;
     24 
     25             varying highp vec4 color;
     26 
     27             void main(void)
     28             {
     29                 gl_Position = position;
     30                 color = in_color;
     31             }
     32         );
     33 
     34         const std::string fsSource = SHADER_SOURCE
     35         (
     36             varying highp vec4 color;
     37             void main(void)
     38             {
     39                 gl_FragColor = color;
     40             }
     41         );
     42 
     43         mProgram = CompileProgram(vsSource, fsSource);
     44         if (mProgram == 0)
     45         {
     46             FAIL() << "shader compilation failed.";
     47         }
     48 
     49         mPositionLocation = glGetAttribLocation(mProgram, "position");
     50         mColorLocation = glGetAttribLocation(mProgram, "in_color");
     51 
     52         glBlendFunc(GL_ONE, GL_ONE);
     53         glEnable(GL_BLEND);
     54 
     55         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
     56         glClear(GL_COLOR_BUFFER_BIT);
     57 
     58         ASSERT_GL_NO_ERROR();
     59     }
     60 
     61     virtual void TearDown()
     62     {
     63         glDeleteProgram(mProgram);
     64 
     65         ANGLETest::TearDown();
     66     }
     67 
     68     void runTest(GLenum indexType, GLubyte indexBuffer, const GLvoid *indexPtr)
     69     {
     70         static const GLfloat loopPositions[] =
     71         {
     72              0.0f,  0.0f,
     73              0.0f,  0.0f,
     74              0.0f,  0.0f,
     75              0.0f,  0.0f,
     76              0.0f,  0.0f,
     77              0.0f,  0.0f,
     78             -0.5f, -0.5f,
     79             -0.5f,  0.5f,
     80              0.5f,  0.5f,
     81              0.5f, -0.5f
     82         };
     83 
     84         static const GLfloat stripPositions[] =
     85         {
     86             -0.5f, -0.5f,
     87             -0.5f,  0.5f,
     88              0.5f,  0.5f,
     89              0.5f, -0.5f
     90         };
     91         static const GLubyte stripIndices[] =
     92         {
     93             2, 0, 3, 1, 2
     94         };
     95 
     96         glUseProgram(mProgram);
     97         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
     98         glEnableVertexAttribArray(mPositionLocation);
     99         glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, loopPositions);
    100         glUniform4f(mColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);
    101         glDrawElements(GL_LINE_LOOP, 4, indexType, indexPtr);
    102 
    103         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    104         glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, stripPositions);
    105         glUniform4f(mColorLocation, 0, 1, 0, 1);
    106         glDrawElements(GL_LINE_STRIP, 5, GL_UNSIGNED_BYTE, stripIndices);
    107 
    108         std::vector<GLubyte> pixels(getWindowWidth() * getWindowHeight() * 4);
    109         glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
    110 
    111         for (int y = 0; y < getWindowHeight(); y++)
    112         {
    113             for (int x = 0; x < getWindowWidth(); x++)
    114             {
    115                 const GLubyte* pixel = pixels.data() + ((y * getWindowWidth() + x) * 4);
    116 
    117                 EXPECT_EQ(pixel[0], 0);
    118                 EXPECT_EQ(pixel[1], pixel[2]);
    119                 EXPECT_EQ(pixel[3], 255);
    120             }
    121         }
    122     }
    123 
    124     GLuint mProgram;
    125     GLint mPositionLocation;
    126     GLint mColorLocation;
    127 };
    128 
    129 TEST_F(LineLoopTest, LineLoopUByteIndices)
    130 {
    131     static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 };
    132     runTest(GL_UNSIGNED_BYTE, 0, indices + 1);
    133 }
    134 
    135 TEST_F(LineLoopTest, LineLoopUShortIndices)
    136 {
    137     static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 };
    138     runTest(GL_UNSIGNED_SHORT, 0, indices + 1);
    139 }
    140 
    141 TEST_F(LineLoopTest, LineLoopUIntIndices)
    142 {
    143     if (!extensionEnabled("GL_OES_element_index_uint"))
    144     {
    145         return;
    146     }
    147 
    148     static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 };
    149     runTest(GL_UNSIGNED_INT, 0, indices + 1);
    150 }
    151 
    152 TEST_F(LineLoopTest, LineLoopUByteIndexBuffer)
    153 {
    154     static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 };
    155 
    156     GLuint buf;
    157     glGenBuffers(1, &buf);
    158     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
    159     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    160 
    161     runTest(GL_UNSIGNED_BYTE, buf, reinterpret_cast<const void *>(sizeof(GLubyte)));
    162 
    163     glDeleteBuffers(1, &buf);
    164 }
    165 
    166 TEST_F(LineLoopTest, LineLoopUShortIndexBuffer)
    167 {
    168     static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 };
    169 
    170     GLuint buf;
    171     glGenBuffers(1, &buf);
    172     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
    173     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    174 
    175     runTest(GL_UNSIGNED_SHORT, buf, reinterpret_cast<const void *>(sizeof(GLushort)));
    176 
    177     glDeleteBuffers(1, &buf);
    178 }
    179 
    180 TEST_F(LineLoopTest, LineLoopUIntIndexBuffer)
    181 {
    182     if (!extensionEnabled("GL_OES_element_index_uint"))
    183     {
    184         return;
    185     }
    186 
    187     static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 };
    188 
    189     GLuint buf;
    190     glGenBuffers(1, &buf);
    191     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
    192     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    193 
    194     runTest(GL_UNSIGNED_INT, buf, reinterpret_cast<const void *>(sizeof(GLuint)));
    195 
    196     glDeleteBuffers(1, &buf);
    197 }
    198