Index: cc/output/gl_renderer_unittest.cc |
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc |
index 2ac339d726745fb093c4c2e1c28c7d6c4976f5f8..c5c1e4d33d4c7dc9de1bf9e8df41ace817c678b7 100644 |
--- a/cc/output/gl_renderer_unittest.cc |
+++ b/cc/output/gl_renderer_unittest.cc |
@@ -1378,6 +1378,54 @@ TEST_F(GLRendererTest, ScissorAndViewportWithinNonreshapableSurface) { |
false); |
} |
+TEST_F(GLRendererTest, DrawFramePreservesFramebuffer) { |
+ // When using render-to-FBO to display the surface, all rendering is done |
+ // to a non-zero FBO. Make sure that the framebuffer is always restored to |
+ // the correct framebuffer during rendering, if changed. |
+ // Note: there is one path that will set it to 0, but that is after the render |
+ // has finished. |
+ FakeOutputSurfaceClient output_surface_client; |
+ scoped_ptr<FakeOutputSurface> output_surface( |
+ FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create().Pass())); |
+ CHECK(output_surface->BindToClient(&output_surface_client)); |
+ |
+ scoped_ptr<SharedBitmapManager> shared_bitmap_manager( |
+ new TestSharedBitmapManager()); |
+ scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( |
+ output_surface.get(), shared_bitmap_manager.get(), NULL, NULL, 0, false, |
+ 1)); |
+ |
+ RendererSettings settings; |
+ FakeRendererClient renderer_client; |
+ FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
+ resource_provider.get()); |
+ EXPECT_FALSE(renderer.Capabilities().using_partial_swap); |
+ |
+ gfx::Rect device_viewport_rect(0, 0, 100, 100); |
+ gfx::Rect viewport_rect(device_viewport_rect.size()); |
+ gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); |
+ |
+ RenderPassId root_pass_id(1, 0); |
+ TestRenderPass* root_pass = |
+ AddRenderPass(&render_passes_in_draw_order_, root_pass_id, viewport_rect, |
+ gfx::Transform()); |
+ AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN); |
+ |
+ unsigned fbo; |
+ gpu::gles2::GLES2Interface* gl = |
+ output_surface->context_provider()->ContextGL(); |
+ gl->GenFramebuffers(1, &fbo); |
+ output_surface->set_framebuffer(fbo); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
+ renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, device_viewport_rect, |
+ device_viewport_rect, false); |
+ |
+ int bound_fbo; |
+ gl->GetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fbo); |
+ EXPECT_EQ(static_cast<int>(fbo), bound_fbo); |
+} |
+ |
TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) { |
gfx::Rect viewport_rect(1, 1); |