Index: gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc |
diff --git a/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc b/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc |
index c1d3c9885c6a8e1da9a9ea78086ec546066fe88a..4ade1e411047b96946146fdcedf43b2b24bdbdbe 100644 |
--- a/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc |
+++ b/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc |
@@ -47,5 +47,115 @@ TEST_F(GLChromiumFramebufferMultisampleTest, CachedBindingsTest) { |
GLTestHelper::CheckGLError("no errors", __LINE__); |
} |
+TEST_F(GLChromiumFramebufferMultisampleTest, DrawAndResolve) { |
+ if (!GLTestHelper::HasExtension("GL_CHROMIUM_framebuffer_multisample")) { |
+ return; |
+ } |
+ |
+ static const char* v_shader_str = |
+ "attribute vec4 a_Position;\n" |
+ "void main()\n" |
+ "{\n" |
+ " gl_Position = a_Position;\n" |
+ "}\n"; |
+ static const char* f_shader_str = |
+ "precision mediump float;\n" |
+ "void main()\n" |
+ "{\n" |
+ " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" |
+ "}\n"; |
+ |
+ GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); |
+ glUseProgram(program); |
+ GLuint position_loc = glGetAttribLocation(program, "a_Position"); |
+ |
+ GLTestHelper::SetupUnitQuad(position_loc); |
+ |
+ const GLuint width = 100; |
+ const GLuint height = 100; |
+ |
+ // Create a sample buffer. |
+ GLsizei num_samples = 4, max_samples = 0; |
+ glGetIntegerv(GL_MAX_SAMPLES, &max_samples); |
+ num_samples = std::min(num_samples, max_samples); |
+ |
+ GLuint sample_fbo, sample_rb; |
+ glGenRenderbuffers(1, &sample_rb); |
+ glBindRenderbuffer(GL_RENDERBUFFER, sample_rb); |
+ glRenderbufferStorageMultisampleEXT( |
+ GL_RENDERBUFFER, num_samples, GL_RGBA8_OES, width, height); |
+ GLint param = 0; |
+ glGetRenderbufferParameteriv( |
+ GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, ¶m); |
+ EXPECT_GE(param, num_samples); |
+ |
+ glGenFramebuffers(1, &sample_fbo); |
+ glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo); |
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, |
+ GL_COLOR_ATTACHMENT0, |
+ GL_RENDERBUFFER, |
+ sample_rb); |
+ EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), |
+ glCheckFramebufferStatus(GL_FRAMEBUFFER)); |
+ |
+ // Create another FBO to resolve the multisample buffer into. |
+ GLuint resolve_fbo, resolve_tex; |
+ glGenTextures(1, &resolve_tex); |
+ glBindTexture(GL_TEXTURE_2D, resolve_tex); |
+ glTexImage2D(GL_TEXTURE_2D, |
+ 0, |
+ GL_RGBA, |
+ width, |
+ height, |
+ 0, |
+ GL_RGBA, |
+ GL_UNSIGNED_BYTE, |
+ NULL); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glGenFramebuffers(1, &resolve_fbo); |
+ glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo); |
+ glFramebufferTexture2D(GL_FRAMEBUFFER, |
+ GL_COLOR_ATTACHMENT0, |
+ GL_TEXTURE_2D, |
+ resolve_tex, |
+ 0); |
+ EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), |
+ glCheckFramebufferStatus(GL_FRAMEBUFFER)); |
+ |
+ // Draw one triangle (bottom left half). |
+ glViewport(0, 0, width, height); |
+ glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo); |
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
+ glClear(GL_COLOR_BUFFER_BIT); |
+ glDrawArrays(GL_TRIANGLES, 0, 3); |
+ |
+ // Resolve. |
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, sample_fbo); |
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo); |
+ glClearColor(1.0f, 0.0f, 0.0f, 0.0f); |
+ glClear(GL_COLOR_BUFFER_BIT); |
+ glBlitFramebufferEXT(0, |
+ 0, |
+ width, |
+ height, |
+ 0, |
+ 0, |
+ width, |
+ height, |
+ GL_COLOR_BUFFER_BIT, |
+ GL_NEAREST); |
+ |
+ // Verify. |
+ const uint8 green[] = {0, 255, 0, 255}; |
+ const uint8 black[] = {0, 0, 0, 0}; |
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo); |
+ EXPECT_TRUE( |
+ GLTestHelper::CheckPixels(width / 4, (3 * height) / 4, 1, 1, 0, green)); |
+ EXPECT_TRUE(GLTestHelper::CheckPixels(width - 1, 0, 1, 1, 0, black)); |
+} |
+ |
} // namespace gpu |