1 #include "ANGLETest.h" 2 3 class ClearTest : public ANGLETest 4 { 5 protected: 6 ClearTest() 7 { 8 setWindowWidth(128); 9 setWindowHeight(128); 10 setConfigRedBits(8); 11 setConfigGreenBits(8); 12 setConfigBlueBits(8); 13 setConfigAlphaBits(8); 14 setConfigDepthBits(24); 15 setClientVersion(3); 16 } 17 18 virtual void SetUp() 19 { 20 ANGLETest::SetUp(); 21 22 const std::string vertexShaderSource = SHADER_SOURCE 23 ( 24 precision highp float; 25 attribute vec4 position; 26 27 void main() 28 { 29 gl_Position = position; 30 } 31 ); 32 33 const std::string fragmentShaderSource = SHADER_SOURCE 34 ( 35 precision highp float; 36 37 void main() 38 { 39 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 40 } 41 ); 42 43 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); 44 if (mProgram == 0) 45 { 46 FAIL() << "shader compilation failed."; 47 } 48 49 glGenFramebuffers(1, &mFBO); 50 51 ASSERT_GL_NO_ERROR(); 52 } 53 54 virtual void TearDown() 55 { 56 glDeleteProgram(mProgram); 57 glDeleteFramebuffers(1, &mFBO); 58 59 ANGLETest::TearDown(); 60 } 61 62 GLuint mProgram; 63 GLuint mFBO; 64 }; 65 66 TEST_F(ClearTest, ClearIssue) 67 { 68 glEnable(GL_DEPTH_TEST); 69 glDepthFunc(GL_LEQUAL); 70 71 glClearColor(0.0, 1.0, 0.0, 1.0); 72 glClearDepthf(0.0); 73 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 74 75 EXPECT_GL_NO_ERROR(); 76 77 glBindFramebuffer(GL_FRAMEBUFFER, mFBO); 78 79 GLuint rbo; 80 glGenRenderbuffers(1, &rbo); 81 glBindRenderbuffer(GL_RENDERBUFFER, rbo); 82 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB565, 16, 16); 83 84 EXPECT_GL_NO_ERROR(); 85 86 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo); 87 88 EXPECT_GL_NO_ERROR(); 89 90 glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 91 glClearDepthf(1.0f); 92 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 93 94 EXPECT_GL_NO_ERROR(); 95 96 glBindFramebuffer(GL_FRAMEBUFFER, 0); 97 glBindBuffer(GL_ARRAY_BUFFER, 0); 98 99 drawQuad(mProgram, "position", 0.5f); 100 101 EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); 102 } 103 104 // Requires ES3 105 // This tests a bug where in a masked clear when calling "ClearBuffer", we would 106 // mistakenly clear every channel (including the masked-out ones) 107 TEST_F(ClearTest, MaskedClearBufferBug) 108 { 109 unsigned char pixelData[] = { 255, 255, 255, 255 }; 110 111 glBindFramebuffer(GL_FRAMEBUFFER, mFBO); 112 113 GLuint textures[2]; 114 glGenTextures(2, &textures[0]); 115 116 glBindTexture(GL_TEXTURE_2D, textures[0]); 117 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); 118 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); 119 120 glBindTexture(GL_TEXTURE_2D, textures[1]); 121 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); 122 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[1], 0); 123 124 ASSERT_GL_NO_ERROR(); 125 EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255); 126 127 float clearValue[] = { 0, 0.5f, 0.5f, 1.0f }; 128 GLenum drawBuffers[] = { GL_NONE, GL_COLOR_ATTACHMENT1 }; 129 glDrawBuffers(2, drawBuffers); 130 glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE); 131 glClearBufferfv(GL_COLOR, 1, clearValue); 132 133 ASSERT_GL_NO_ERROR(); 134 EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255); 135 136 // TODO: glReadBuffer support 137 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0); 138 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0); 139 EXPECT_PIXEL_EQ(0, 0, 0, 127, 255, 255); 140 141 glDeleteTextures(2, textures); 142 } 143 144 TEST_F(ClearTest, BadFBOSerialBug) 145 { 146 // First make a simple framebuffer, and clear it to green 147 glBindFramebuffer(GL_FRAMEBUFFER, mFBO); 148 149 GLuint textures[2]; 150 glGenTextures(2, &textures[0]); 151 152 glBindTexture(GL_TEXTURE_2D, textures[0]); 153 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); 154 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); 155 156 GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 }; 157 glDrawBuffers(1, drawBuffers); 158 159 float clearValues1[] = { 0.0f, 1.0f, 0.0f, 1.0f }; 160 glClearBufferfv(GL_COLOR, 0, clearValues1); 161 162 ASSERT_GL_NO_ERROR(); 163 EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); 164 165 // Next make a second framebuffer, and draw it to red 166 // (Triggers bad applied render target serial) 167 GLuint fbo2; 168 glGenFramebuffers(1, &fbo2); 169 ASSERT_GL_NO_ERROR(); 170 171 glBindFramebuffer(GL_FRAMEBUFFER, fbo2); 172 173 glBindTexture(GL_TEXTURE_2D, textures[1]); 174 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); 175 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0); 176 177 glDrawBuffers(1, drawBuffers); 178 179 drawQuad(mProgram, "position", 0.5f); 180 181 ASSERT_GL_NO_ERROR(); 182 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); 183 184 // Check that the first framebuffer is still green. 185 glBindFramebuffer(GL_FRAMEBUFFER, mFBO); 186 EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); 187 188 glDeleteTextures(2, textures); 189 glDeleteFramebuffers(1, &fbo2); 190 } 191