13f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill#include "ANGLETest.h"
23f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
33f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madillclass DrawBuffersTest : public ANGLETest
43f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
53f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill  protected:
63f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    DrawBuffersTest(int clientVersion)
73f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
83f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setWindowWidth(128);
93f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setWindowHeight(128);
103f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setConfigRedBits(8);
113f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setConfigGreenBits(8);
123f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setConfigBlueBits(8);
133f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setConfigAlphaBits(8);
143f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setConfigDepthBits(24);
153f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setClientVersion(clientVersion);
163f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
173f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
183f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    virtual void SetUp()
193f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
203f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        ANGLETest::SetUp();
213f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
223f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glGenFramebuffers(1, &mFBO);
233f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
243f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
253f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glGenTextures(4, mTextures);
263f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
273f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (size_t texIndex = 0; texIndex < ArraySize(mTextures); texIndex++)
283f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
293f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]);
303f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
313f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
323f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
333f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLfloat data[] =
343f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
353f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            -1.0f, 1.0f,
363f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            -1.0f, -2.0f,
373f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            2.0f, 1.0f
383f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        };
393f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
403f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glGenBuffers(1, &mBuffer);
413f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
423f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 6, data, GL_STATIC_DRAW);
433f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
443f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLint maxDrawBuffers;
453f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
463f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        ASSERT_EQ(maxDrawBuffers, 8);
473f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
483f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        ASSERT_GL_NO_ERROR();
493f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
503f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
513f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    virtual void TearDown()
523f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
533f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDeleteFramebuffers(1, &mFBO);
543f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDeleteTextures(4, mTextures);
553f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDeleteBuffers(1, &mBuffer);
563f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
573f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        ANGLETest::TearDown();
583f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
593f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
603f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void setupMRTProgramESSL3(bool bufferEnabled[8], GLuint *programOut)
613f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
623f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        const std::string vertexShaderSource =
633f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "#version 300 es\n"
643f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "in vec4 position;\n"
653f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "void main() {\n"
663f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "    gl_Position = position;\n"
673f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "}\n";
683f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
693f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        std::stringstream strstr;
703f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
713f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        strstr << "#version 300 es\n"
723f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                  "precision highp float;\n";
733f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
743f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (unsigned int index = 0; index < 8; index++)
753f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
763f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            if (bufferEnabled[index])
773f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            {
783f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                strstr << "layout(location = " << index << ") "
793f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                          "out vec4 value" << index << ";\n";
803f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            }
813f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
823f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
833f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        strstr << "void main()\n"
843f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                  "{\n";
853f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
863f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (unsigned int index = 0; index < 8; index++)
873f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
883f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            if (bufferEnabled[index])
893f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            {
903f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                unsigned int r = (index + 1) & 1;
913f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                unsigned int g = (index + 1) & 2;
923f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                unsigned int b = (index + 1) & 4;
933f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
943f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                strstr << "    value" << index << " = vec4("
953f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                       << r << ".0, " << g << ".0, "
963f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                       << b << ".0, 1.0);\n";
973f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            }
983f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
993f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1003f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        strstr << "}\n";
1013f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1023f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        *programOut = CompileProgram(vertexShaderSource, strstr.str());
1033f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        if (*programOut == 0)
1043f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
1053f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            FAIL() << "shader compilation failed.";
1063f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
1073f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1083f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glUseProgram(*programOut);
1093f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1103f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLint location = glGetAttribLocation(*programOut, "position");
1113f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        ASSERT_NE(location, -1);
1123f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
1133f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 8, NULL);
1143f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glEnableVertexAttribArray(location);
1153f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
1163f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1173f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void setupMRTProgramESSL1(bool bufferEnabled[8], GLuint *programOut)
1183f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
1193f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        const std::string vertexShaderSource =
1203f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "attribute vec4 position;\n"
1213f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "void main() {\n"
1223f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "    gl_Position = position;\n"
1233f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            "}\n";
1243f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1253f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        std::stringstream strstr;
1263f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1273f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        strstr << "#extension GL_EXT_draw_buffers : enable\n"
1283f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                  "precision highp float;\n"
1293f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                  "void main()\n"
1303f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                  "{\n";
1313f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1323f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (unsigned int index = 0; index < 8; index++)
1333f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
1343f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            if (bufferEnabled[index])
1353f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            {
1363f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                unsigned int r = (index + 1) & 1;
1373f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                unsigned int g = (index + 1) & 2;
1383f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                unsigned int b = (index + 1) & 4;
1393f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1403f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                strstr << "    gl_FragData[" << index << "] = vec4("
1413f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                    << r << ".0, " << g << ".0, "
1423f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill                    << b << ".0, 1.0);\n";
1433f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            }
1443f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
1453f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1463f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        strstr << "}\n";
1473f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1483f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        *programOut = CompileProgram(vertexShaderSource, strstr.str());
1493f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        if (*programOut == 0)
1503f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
1513f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            FAIL() << "shader compilation failed.";
1523f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
1533f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1543f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glUseProgram(*programOut);
1553f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1563f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLint location = glGetAttribLocation(*programOut, "position");
1573f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        ASSERT_NE(location, -1);
1583f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
1593f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 8, NULL);
1603f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glEnableVertexAttribArray(location);
1613f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
1623f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1633f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void setupMRTProgram(bool bufferEnabled[8], GLuint *programOut)
1643f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
1653f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        if (getClientVersion() == 3)
1663f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
1673f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            setupMRTProgramESSL3(bufferEnabled, programOut);
1683f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
1693f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        else
1703f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
1713f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            ASSERT_EQ(getClientVersion(), 2);
1723f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            setupMRTProgramESSL1(bufferEnabled, programOut);
1733f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
1743f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
1753f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1763f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void verifyAttachment(unsigned int index, GLuint textureName)
1773f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
1783f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (unsigned int colorAttachment = 0; colorAttachment < 8; colorAttachment++)
1793f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
1803f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttachment, GL_TEXTURE_2D, 0, 0);
1813f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
1823f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1833f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindTexture(GL_TEXTURE_2D, textureName);
1843f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureName, 0);
1853f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1863f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        unsigned int r = (((index + 1) & 1) > 0) ? 255 : 0;
1873f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        unsigned int g = (((index + 1) & 2) > 0) ? 255 : 0;
1883f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        unsigned int b = (((index + 1) & 4) > 0) ? 255 : 0;
1893f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1903f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, r, g, b, 255);
1913f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
1923f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1933f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void gapsTest()
1943f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
1953f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1963f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, mTextures[0], 0);
1973f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
1983f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        bool flags[8] = { false, true };
1993f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2003f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLuint program;
2013f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setupMRTProgram(flags, &program);
2023f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2033f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        const GLenum bufs[] =
2043f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
2053f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            GL_NONE,
2063f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            GL_COLOR_ATTACHMENT1
2073f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        };
2083f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glUseProgram(program);
2093f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDrawBuffersEXT(2, bufs);
2103f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDrawArrays(GL_TRIANGLES, 0, 3);
2113f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2123f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        verifyAttachment(1, mTextures[0]);
2133f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2143f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDeleteProgram(program);
2153f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
2163f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2173f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void firstAndLastTest()
2183f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
2193f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindTexture(GL_TEXTURE_2D, mTextures[0]);
2203f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
2213f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2223f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glBindTexture(GL_TEXTURE_2D, mTextures[1]);
2233f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, mTextures[1], 0);
2243f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2253f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        bool flags[8] = { true, false, false, true };
2263f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2273f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLuint program;
2283f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setupMRTProgram(flags, &program);
2293f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2303f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        const GLenum bufs[] =
2313f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
2323f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            GL_COLOR_ATTACHMENT0,
2333f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            GL_NONE,
2343f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            GL_NONE,
2353f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            GL_COLOR_ATTACHMENT3
2363f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        };
2373f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2383f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glUseProgram(program);
2393f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDrawBuffersEXT(4, bufs);
2403f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDrawArrays(GL_TRIANGLES, 0, 3);
2413f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2423f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        verifyAttachment(0, mTextures[0]);
2433f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        verifyAttachment(3, mTextures[1]);
2443f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2453f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        EXPECT_GL_NO_ERROR();
2463f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2473f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDeleteProgram(program);
2483f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
2493f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2503f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    void firstHalfNULLTest()
2513f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {
2523f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        bool flags[8] = { false };
2533f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLenum bufs[8] = { GL_NONE };
2543f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2553f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (unsigned int texIndex = 0; texIndex < 4; texIndex++)
2563f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
2573f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]);
2583f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT4 + texIndex, GL_TEXTURE_2D, mTextures[texIndex], 0);
2593f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            flags[texIndex + 4] = true;
2603f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            bufs[texIndex + 4] = GL_COLOR_ATTACHMENT4 + texIndex;
2613f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
2623f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2633f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        GLuint program;
2643f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        setupMRTProgram(flags, &program);
2653f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2663f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glUseProgram(program);
2673f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDrawBuffersEXT(8, bufs);
2683f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDrawArrays(GL_TRIANGLES, 0, 3);
2693f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2703f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        for (unsigned int texIndex = 0; texIndex < 4; texIndex++)
2713f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        {
2723f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill            verifyAttachment(texIndex + 4, mTextures[texIndex]);
2733f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        }
2743f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2753f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        EXPECT_GL_NO_ERROR();
2763f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2773f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        glDeleteProgram(program);
2783f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    }
2793f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2803f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    GLuint mFBO;
2813f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    GLuint mTextures[4];
2823f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    GLuint mBuffer;
2833f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill};
2843f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2853f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madillclass DrawBuffersTestESSL3 : public DrawBuffersTest
2863f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
2873f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill  protected:
2883f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    DrawBuffersTestESSL3()
2893f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        : DrawBuffersTest(3)
2903f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {}
2913f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill};
2923f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
2933f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madillclass DrawBuffersTestESSL1 : public DrawBuffersTest
2943f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
2953f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill  protected:
2963f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    DrawBuffersTestESSL1()
2973f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        : DrawBuffersTest(2)
2983f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    {}
2993f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill};
3003f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
3013f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie MadillTEST_F(DrawBuffersTestESSL3, Gaps)
3023f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
3033f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    gapsTest();
3043f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill}
3053f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
3063f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie MadillTEST_F(DrawBuffersTestESSL1, Gaps)
3073f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
3083f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    gapsTest();
3093f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill}
3103f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
3113f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie MadillTEST_F(DrawBuffersTestESSL3, FirstAndLast)
3123f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
3133f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    firstAndLastTest();
3143f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill}
3153f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
3163f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie MadillTEST_F(DrawBuffersTestESSL1, FirstAndLast)
3173f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
3183f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    firstAndLastTest();
3193f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill}
3203f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
3213f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie MadillTEST_F(DrawBuffersTestESSL3, FirstHalfNULL)
3223f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
3233f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    firstHalfNULLTest();
3243f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill}
3253f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
3263f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie MadillTEST_F(DrawBuffersTestESSL1, FirstHalfNULL)
3273f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill{
3283f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill    firstHalfNULLTest();
3293f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill}
330