Edit

kc3-lang/angle/tests/angle_tests/VertexAttributeTest.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2014-08-26 13:16:39
    Hash : 5599c8f6
    Message : Use shared compile helpers in the ANGLE tests. BUG=angle:730 Change-Id: Ib3bd646c73355449105e6cf79bdcf0a14b391fd2 Reviewed-on: https://chromium-review.googlesource.com/213550 Tested-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>

  • tests/angle_tests/VertexAttributeTest.cpp
  • #include "ANGLETest.h"
    
    class VertexAttributeTest : public ANGLETest
    {
    protected:
        VertexAttributeTest()
        {
            setWindowWidth(128);
            setWindowHeight(128);
            setConfigRedBits(8);
            setConfigGreenBits(8);
            setConfigBlueBits(8);
            setConfigAlphaBits(8);
            setConfigDepthBits(24);
    
            mProgram = 0;
            mTestAttrib = -1;
            mExpectedAttrib = -1;
        }
    
        struct TestData
        {
            GLenum type;
            GLboolean normalized;
    
            const void *inputData;
            const GLfloat *expectedData;
        };
    
        void runTest(const TestData& test)
        {
            GLint viewportSize[4];
            glGetIntegerv(GL_VIEWPORT, viewportSize);
    
            GLint midPixelX = (viewportSize[0] + viewportSize[2]) / 2;
            GLint midPixelY = (viewportSize[1] + viewportSize[3]) / 2;
    
            for (size_t i = 0; i < 4; i++)
            {
                glBindBuffer(GL_ARRAY_BUFFER, 0);
                glVertexAttribPointer(mTestAttrib, i + 1, test.type, test.normalized, 0, test.inputData);
                glVertexAttribPointer(mExpectedAttrib, i + 1, GL_FLOAT, GL_FALSE, 0, test.expectedData);
    
                glEnableVertexAttribArray(mTestAttrib);
                glEnableVertexAttribArray(mExpectedAttrib);
    
                drawQuad(mProgram, "position", 0.5f);
    
                glDisableVertexAttribArray(mTestAttrib);
                glDisableVertexAttribArray(mExpectedAttrib);
    
                // We need to offset our checks from triangle edges to ensure we don't fall on a single tri
                // Avoid making assumptions of drawQuad with four checks to check the four possible tri regions
                EXPECT_PIXEL_EQ((midPixelX + viewportSize[0]) / 2, midPixelY, 255, 255, 255, 255);
                EXPECT_PIXEL_EQ((midPixelX + viewportSize[2]) / 2, midPixelY, 255, 255, 255, 255);
                EXPECT_PIXEL_EQ(midPixelX, (midPixelY + viewportSize[1]) / 2, 255, 255, 255, 255);
                EXPECT_PIXEL_EQ(midPixelX, (midPixelY + viewportSize[3]) / 2, 255, 255, 255, 255);
            }
        }
    
        virtual void SetUp()
        {
            ANGLETest::SetUp();
    
            const std::string testVertexShaderSource = SHADER_SOURCE
            (
                attribute highp vec4 position;
                attribute highp vec4 test;
                attribute highp vec4 expected;
    
                varying highp vec4 color;
    
                void main(void)
                {
                    gl_Position = position;
                    color = vec4(lessThan(abs(test - expected), vec4(1.0 / 64.0)));
                }
            );
    
            const std::string testFragmentShaderSource = SHADER_SOURCE
            (
                varying highp vec4 color;
                void main(void)
                {
                    gl_FragColor = color;
                }
            );
    
            mProgram = CompileProgram(testVertexShaderSource, testFragmentShaderSource);
            if (mProgram == 0)
            {
                FAIL() << "shader compilation failed.";
            }
    
            mTestAttrib = glGetAttribLocation(mProgram, "test");
            mExpectedAttrib = glGetAttribLocation(mProgram, "expected");
    
            glUseProgram(mProgram);
    
            glClearColor(0, 0, 0, 0);
            glClearDepthf(0.0);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
            glDisable(GL_DEPTH_TEST);
        }
    
        virtual void TearDown()
        {
            glDeleteProgram(mProgram);
    
            ANGLETest::TearDown();
        }
    
        static const size_t mVertexCount = 24;
    
        GLuint mProgram;
        GLint mTestAttrib;
        GLint mExpectedAttrib;
    };
    
    TEST_F(VertexAttributeTest, UnsignedByteUnnormalized)
    {
        GLubyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, 5, 6, 7, 125, 126, 127, 128, 129, 250, 251, 252, 253, 254, 255 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = inputData[i];
        }
    
        TestData data = { GL_UNSIGNED_BYTE, GL_FALSE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, UnsignedByteNormalized)
    {
        GLubyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, 5, 6, 7, 125, 126, 127, 128, 129, 250, 251, 252, 253, 254, 255 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = inputData[i] / 255.0f;
        }
    
        TestData data = { GL_UNSIGNED_BYTE, GL_TRUE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, ByteUnnormalized)
    {
        GLbyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, -1, -2, -3, -4, 125, 126, 127, -128, -127, -126 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = inputData[i];
        }
    
        TestData data = { GL_BYTE, GL_FALSE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, ByteNormalized)
    {
        GLbyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, -1, -2, -3, -4, 125, 126, 127, -128, -127, -126 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = ((2.0f * inputData[i]) + 1.0f) / 255.0f;
        }
    
        TestData data = { GL_BYTE, GL_TRUE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, UnsignedShortUnnormalized)
    {
        GLushort inputData[mVertexCount] = { 0, 1, 2, 3, 254, 255, 256, 32766, 32767, 32768, 65533, 65534, 65535 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = inputData[i];
        }
    
        TestData data = { GL_UNSIGNED_SHORT, GL_FALSE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, UnsignedShortNormalized)
    {
        GLushort inputData[mVertexCount] = { 0, 1, 2, 3, 254, 255, 256, 32766, 32767, 32768, 65533, 65534, 65535 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = inputData[i] / 65535.0f;
        }
    
        TestData data = { GL_UNSIGNED_SHORT, GL_TRUE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, ShortUnnormalized)
    {
        GLshort inputData[mVertexCount] = {  0, 1, 2, 3, -1, -2, -3, -4, 32766, 32767, -32768, -32767, -32766 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = inputData[i];
        }
    
        TestData data = { GL_SHORT, GL_FALSE, inputData, expectedData };
        runTest(data);
    }
    
    TEST_F(VertexAttributeTest, ShortNormalized)
    {
        GLshort inputData[mVertexCount] = {  0, 1, 2, 3, -1, -2, -3, -4, 32766, 32767, -32768, -32767, -32766 };
        GLfloat expectedData[mVertexCount];
        for (size_t i = 0; i < mVertexCount; i++)
        {
            expectedData[i] = ((2.0f * inputData[i]) + 1.0f) / 65535.0f;
        }
    
        TestData data = { GL_SHORT, GL_TRUE, inputData, expectedData };
        runTest(data);
    }