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