OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
6 | 6 |
7 #include "cc/output/compositor_frame_metadata.h" | 7 #include "cc/output/compositor_frame_metadata.h" |
8 #include "cc/quads/draw_quad.h" | 8 #include "cc/quads/draw_quad.h" |
9 #include "cc/resources/prioritized_resource_manager.h" | 9 #include "cc/resources/prioritized_resource_manager.h" |
10 #include "cc/resources/resource_provider.h" | 10 #include "cc/resources/resource_provider.h" |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 | 225 |
226 WebGraphicsMemoryAllocation suggest_have_backbuffer_yes_; | 226 WebGraphicsMemoryAllocation suggest_have_backbuffer_yes_; |
227 WebGraphicsMemoryAllocation suggest_have_backbuffer_no_; | 227 WebGraphicsMemoryAllocation suggest_have_backbuffer_no_; |
228 | 228 |
229 scoped_ptr<OutputSurface> output_surface_; | 229 scoped_ptr<OutputSurface> output_surface_; |
230 FakeRendererClient mock_client_; | 230 FakeRendererClient mock_client_; |
231 scoped_ptr<ResourceProvider> resource_provider_; | 231 scoped_ptr<ResourceProvider> resource_provider_; |
232 FakeRendererGL renderer_; | 232 FakeRendererGL renderer_; |
233 }; | 233 }; |
234 | 234 |
235 // Test GLRenderer discardBackbuffer functionality: | 235 // Test GLRenderer DiscardBackbuffer functionality: |
236 // Suggest recreating framebuffer when one already exists. | 236 // Suggest recreating framebuffer when one already exists. |
237 // Expected: it does nothing. | 237 // Expected: it does nothing. |
238 TEST_F(GLRendererTest, SuggestBackbufferYesWhenItAlreadyExistsShouldDoNothing) { | 238 TEST_F(GLRendererTest, SuggestBackbufferYesWhenItAlreadyExistsShouldDoNothing) { |
239 context()->SetMemoryAllocation(suggest_have_backbuffer_yes_); | 239 context()->SetMemoryAllocation(suggest_have_backbuffer_yes_); |
240 EXPECT_EQ(0, mock_client_.set_full_root_layer_damage_count()); | 240 EXPECT_EQ(0, mock_client_.set_full_root_layer_damage_count()); |
241 EXPECT_FALSE(renderer_.IsBackbufferDiscarded()); | 241 EXPECT_FALSE(renderer_.IsBackbufferDiscarded()); |
242 | 242 |
243 SwapBuffers(); | 243 SwapBuffers(); |
244 EXPECT_EQ(1, context()->frame_count()); | 244 EXPECT_EQ(1, context()->frame_count()); |
245 } | 245 } |
246 | 246 |
247 // Test GLRenderer discardBackbuffer functionality: | 247 // Test GLRenderer DiscardBackbuffer functionality: |
248 // Suggest discarding framebuffer when one exists and the renderer is not | 248 // Suggest discarding framebuffer when one exists and the renderer is not |
249 // visible. | 249 // visible. |
250 // Expected: it is discarded and damage tracker is reset. | 250 // Expected: it is discarded and damage tracker is reset. |
251 TEST_F(GLRendererTest, | 251 TEST_F(GLRendererTest, |
252 SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLayerWhileNotVisib
le) { | 252 SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLayerWhileNotVisib
le) { |
253 renderer_.SetVisible(false); | 253 renderer_.SetVisible(false); |
254 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); | 254 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); |
255 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); | 255 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); |
256 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); | 256 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); |
257 } | 257 } |
258 | 258 |
259 // Test GLRenderer discardBackbuffer functionality: | 259 // Test GLRenderer DiscardBackbuffer functionality: |
260 // Suggest discarding framebuffer when one exists and the renderer is visible. | 260 // Suggest discarding framebuffer when one exists and the renderer is visible. |
261 // Expected: the allocation is ignored. | 261 // Expected: the allocation is ignored. |
262 TEST_F(GLRendererTest, SuggestBackbufferNoDoNothingWhenVisible) { | 262 TEST_F(GLRendererTest, SuggestBackbufferNoDoNothingWhenVisible) { |
263 renderer_.SetVisible(true); | 263 renderer_.SetVisible(true); |
264 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); | 264 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); |
265 EXPECT_EQ(0, mock_client_.set_full_root_layer_damage_count()); | 265 EXPECT_EQ(0, mock_client_.set_full_root_layer_damage_count()); |
266 EXPECT_FALSE(renderer_.IsBackbufferDiscarded()); | 266 EXPECT_FALSE(renderer_.IsBackbufferDiscarded()); |
267 } | 267 } |
268 | 268 |
269 // Test GLRenderer discardBackbuffer functionality: | 269 // Test GLRenderer DiscardBackbuffer functionality: |
270 // Suggest discarding framebuffer when one does not exist. | 270 // Suggest discarding framebuffer when one does not exist. |
271 // Expected: it does nothing. | 271 // Expected: it does nothing. |
272 TEST_F(GLRendererTest, SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) { | 272 TEST_F(GLRendererTest, SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) { |
273 renderer_.SetVisible(false); | 273 renderer_.SetVisible(false); |
274 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); | 274 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); |
275 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); | 275 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); |
276 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); | 276 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); |
277 | 277 |
278 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); | 278 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); |
279 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); | 279 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); |
280 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); | 280 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); |
281 } | 281 } |
282 | 282 |
283 // Test GLRenderer discardBackbuffer functionality: | 283 // Test GLRenderer DiscardBackbuffer functionality: |
284 // Begin drawing a frame while a framebuffer is discarded. | 284 // Begin drawing a frame while a framebuffer is discarded. |
285 // Expected: will recreate framebuffer. | 285 // Expected: will recreate framebuffer. |
286 TEST_F(GLRendererTest, DiscardedBackbufferIsRecreatedForScopeDuration) { | 286 TEST_F(GLRendererTest, DiscardedBackbufferIsRecreatedForScopeDuration) { |
287 renderer_.SetVisible(false); | 287 renderer_.SetVisible(false); |
288 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); | 288 context()->SetMemoryAllocation(suggest_have_backbuffer_no_); |
289 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); | 289 EXPECT_TRUE(renderer_.IsBackbufferDiscarded()); |
290 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); | 290 EXPECT_EQ(1, mock_client_.set_full_root_layer_damage_count()); |
291 | 291 |
292 renderer_.SetVisible(true); | 292 renderer_.SetVisible(true); |
293 renderer_.DrawFrame(*mock_client_.render_passes_in_draw_order()); | 293 renderer_.DrawFrame(*mock_client_.render_passes_in_draw_order()); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 scoped_ptr<ResourceProvider> resource_provider( | 661 scoped_ptr<ResourceProvider> resource_provider( |
662 ResourceProvider::Create(output_surface.get())); | 662 ResourceProvider::Create(output_surface.get())); |
663 FakeRendererGL renderer( | 663 FakeRendererGL renderer( |
664 &mock_client, output_surface.get(), resource_provider.get()); | 664 &mock_client, output_surface.get(), resource_provider.get()); |
665 | 665 |
666 EXPECT_TRUE(renderer.Initialize()); | 666 EXPECT_TRUE(renderer.Initialize()); |
667 | 667 |
668 bool last_call_was_set_visiblity = false; | 668 bool last_call_was_set_visiblity = false; |
669 // Ensure that the call to setVisibilityCHROMIUM is the last call issue to the | 669 // Ensure that the call to setVisibilityCHROMIUM is the last call issue to the |
670 // GPU process, after glFlush is called, and after the RendererClient's | 670 // GPU process, after glFlush is called, and after the RendererClient's |
671 // enforceManagedMemoryPolicy is called. Plumb this tracking between both the | 671 // EnforceManagedMemoryPolicy is called. Plumb this tracking between both the |
672 // RenderClient and the Context by giving them both a pointer to a variable on | 672 // RenderClient and the Context by giving them both a pointer to a variable on |
673 // the stack. | 673 // the stack. |
674 context->set_last_call_was_set_visibility_pointer(&last_call_was_set_visiblity
); | 674 context->set_last_call_was_set_visibility_pointer(&last_call_was_set_visiblity
); |
675 mock_client.set_last_call_was_set_visibility_pointer(&last_call_was_set_visibl
ity); | 675 mock_client.set_last_call_was_set_visibility_pointer(&last_call_was_set_visibl
ity); |
676 renderer.SetVisible(true); | 676 renderer.SetVisible(true); |
677 renderer.DrawFrame(*mock_client.render_passes_in_draw_order()); | 677 renderer.DrawFrame(*mock_client.render_passes_in_draw_order()); |
678 renderer.SetVisible(false); | 678 renderer.SetVisible(false); |
679 EXPECT_TRUE(last_call_was_set_visiblity); | 679 EXPECT_TRUE(last_call_was_set_visiblity); |
680 } | 680 } |
681 | 681 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 | 759 |
760 // The remaining quads also use GL_LINEAR because nearest neighbor | 760 // The remaining quads also use GL_LINEAR because nearest neighbor |
761 // filtering is currently only used with tile quads. | 761 // filtering is currently only used with tile quads. |
762 EXPECT_CALL(*context, drawElements(_, _, _, _)).Times(6); | 762 EXPECT_CALL(*context, drawElements(_, _, _, _)).Times(6); |
763 } | 763 } |
764 | 764 |
765 cc::DirectRenderer::DrawingFrame drawing_frame; | 765 cc::DirectRenderer::DrawingFrame drawing_frame; |
766 renderer.BeginDrawingFrame(drawing_frame); | 766 renderer.BeginDrawingFrame(drawing_frame); |
767 EXPECT_EQ(context->active_texture(), GL_TEXTURE0); | 767 EXPECT_EQ(context->active_texture(), GL_TEXTURE0); |
768 | 768 |
769 for (cc::QuadList::backToFrontIterator | 769 for (cc::QuadList::BackToFrontIterator |
770 it = pass->quad_list.backToFrontBegin(); | 770 it = pass->quad_list.BackToFrontBegin(); |
771 it != pass->quad_list.backToFrontEnd(); | 771 it != pass->quad_list.BackToFrontEnd(); |
772 ++it) { | 772 ++it) { |
773 renderer.DoDrawQuad(drawing_frame, *it); | 773 renderer.DoDrawQuad(drawing_frame, *it); |
774 } | 774 } |
775 renderer.FinishDrawingQuadList(); | 775 renderer.FinishDrawingQuadList(); |
776 EXPECT_EQ(context->active_texture(), GL_TEXTURE0); | 776 EXPECT_EQ(context->active_texture(), GL_TEXTURE0); |
777 Mock::VerifyAndClearExpectations(context); | 777 Mock::VerifyAndClearExpectations(context); |
778 } | 778 } |
779 | 779 |
780 class NoClearRootRenderPassFakeClient : public FakeRendererClient { | 780 class NoClearRootRenderPassFakeClient : public FakeRendererClient { |
781 public: | 781 public: |
(...skipping 23 matching lines...) Expand all Loading... |
805 FakeRendererGL renderer( | 805 FakeRendererGL renderer( |
806 &mock_client, output_surface.get(), resource_provider.get()); | 806 &mock_client, output_surface.get(), resource_provider.get()); |
807 EXPECT_TRUE(renderer.Initialize()); | 807 EXPECT_TRUE(renderer.Initialize()); |
808 | 808 |
809 gfx::Rect viewport_rect(mock_client.DeviceViewportSize()); | 809 gfx::Rect viewport_rect(mock_client.DeviceViewportSize()); |
810 ScopedPtrVector<RenderPass>& render_passes = | 810 ScopedPtrVector<RenderPass>& render_passes = |
811 *mock_client.render_passes_in_draw_order(); | 811 *mock_client.render_passes_in_draw_order(); |
812 render_passes.clear(); | 812 render_passes.clear(); |
813 | 813 |
814 RenderPass::Id root_pass_id(1, 0); | 814 RenderPass::Id root_pass_id(1, 0); |
815 TestRenderPass* root_pass = addRenderPass( | 815 TestRenderPass* root_pass = AddRenderPass( |
816 render_passes, root_pass_id, viewport_rect, gfx::Transform()); | 816 render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
817 addQuad(root_pass, viewport_rect, SK_ColorGREEN); | 817 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
818 | 818 |
819 RenderPass::Id child_pass_id(2, 0); | 819 RenderPass::Id child_pass_id(2, 0); |
820 TestRenderPass* child_pass = addRenderPass( | 820 TestRenderPass* child_pass = AddRenderPass( |
821 render_passes, child_pass_id, viewport_rect, gfx::Transform()); | 821 render_passes, child_pass_id, viewport_rect, gfx::Transform()); |
822 addQuad(child_pass, viewport_rect, SK_ColorBLUE); | 822 AddQuad(child_pass, viewport_rect, SK_ColorBLUE); |
823 | 823 |
824 addRenderPassQuad(root_pass, child_pass); | 824 AddRenderPassQuad(root_pass, child_pass); |
825 | 825 |
826 // First render pass is not the root one, clearing should happen. | 826 // First render pass is not the root one, clearing should happen. |
827 EXPECT_CALL(*mock_context, clear(GL_COLOR_BUFFER_BIT)).Times(AtLeast(1)); | 827 EXPECT_CALL(*mock_context, clear(GL_COLOR_BUFFER_BIT)).Times(AtLeast(1)); |
828 | 828 |
829 Expectation first_render_pass = | 829 Expectation first_render_pass = |
830 EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(1); | 830 EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(1); |
831 | 831 |
832 // The second render pass is the root one, clearing should be prevented. | 832 // The second render pass is the root one, clearing should be prevented. |
833 EXPECT_CALL(*mock_context, clear(GL_COLOR_BUFFER_BIT)).Times(0) | 833 EXPECT_CALL(*mock_context, clear(GL_COLOR_BUFFER_BIT)).Times(0) |
834 .After(first_render_pass); | 834 .After(first_render_pass); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 EXPECT_TRUE(renderer.Initialize()); | 877 EXPECT_TRUE(renderer.Initialize()); |
878 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); | 878 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); |
879 | 879 |
880 gfx::Rect viewport_rect(mock_client.DeviceViewportSize()); | 880 gfx::Rect viewport_rect(mock_client.DeviceViewportSize()); |
881 ScopedPtrVector<RenderPass>& render_passes = | 881 ScopedPtrVector<RenderPass>& render_passes = |
882 *mock_client.render_passes_in_draw_order(); | 882 *mock_client.render_passes_in_draw_order(); |
883 render_passes.clear(); | 883 render_passes.clear(); |
884 | 884 |
885 gfx::Rect grand_child_rect(25, 25); | 885 gfx::Rect grand_child_rect(25, 25); |
886 RenderPass::Id grand_child_pass_id(3, 0); | 886 RenderPass::Id grand_child_pass_id(3, 0); |
887 TestRenderPass* grand_child_pass = addRenderPass( | 887 TestRenderPass* grand_child_pass = AddRenderPass( |
888 render_passes, grand_child_pass_id, grand_child_rect, gfx::Transform()); | 888 render_passes, grand_child_pass_id, grand_child_rect, gfx::Transform()); |
889 addClippedQuad(grand_child_pass, grand_child_rect, SK_ColorYELLOW); | 889 AddClippedQuad(grand_child_pass, grand_child_rect, SK_ColorYELLOW); |
890 | 890 |
891 gfx::Rect child_rect(50, 50); | 891 gfx::Rect child_rect(50, 50); |
892 RenderPass::Id child_pass_id(2, 0); | 892 RenderPass::Id child_pass_id(2, 0); |
893 TestRenderPass* child_pass = | 893 TestRenderPass* child_pass = |
894 addRenderPass(render_passes, child_pass_id, child_rect, gfx::Transform()); | 894 AddRenderPass(render_passes, child_pass_id, child_rect, gfx::Transform()); |
895 addQuad(child_pass, child_rect, SK_ColorBLUE); | 895 AddQuad(child_pass, child_rect, SK_ColorBLUE); |
896 | 896 |
897 RenderPass::Id root_pass_id(1, 0); | 897 RenderPass::Id root_pass_id(1, 0); |
898 TestRenderPass* root_pass = addRenderPass( | 898 TestRenderPass* root_pass = AddRenderPass( |
899 render_passes, root_pass_id, viewport_rect, gfx::Transform()); | 899 render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
900 addQuad(root_pass, viewport_rect, SK_ColorGREEN); | 900 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
901 | 901 |
902 addRenderPassQuad(root_pass, child_pass); | 902 AddRenderPassQuad(root_pass, child_pass); |
903 addRenderPassQuad(child_pass, grand_child_pass); | 903 AddRenderPassQuad(child_pass, grand_child_pass); |
904 | 904 |
905 renderer.DecideRenderPassAllocationsForFrame( | 905 renderer.DecideRenderPassAllocationsForFrame( |
906 *mock_client.render_passes_in_draw_order()); | 906 *mock_client.render_passes_in_draw_order()); |
907 renderer.DrawFrame(*mock_client.render_passes_in_draw_order()); | 907 renderer.DrawFrame(*mock_client.render_passes_in_draw_order()); |
908 } | 908 } |
909 | 909 |
910 class OutputSurfaceMockContext : public TestWebGraphicsContext3D { | 910 class OutputSurfaceMockContext : public TestWebGraphicsContext3D { |
911 public: | 911 public: |
912 // Specifically override methods even if they are unused (used in conjunction | 912 // Specifically override methods even if they are unused (used in conjunction |
913 // with StrictMock). We need to make sure that GLRenderer does not issue | 913 // with StrictMock). We need to make sure that GLRenderer does not issue |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 virtual void SetUp() { EXPECT_TRUE(renderer_.Initialize()); } | 957 virtual void SetUp() { EXPECT_TRUE(renderer_.Initialize()); } |
958 | 958 |
959 void SwapBuffers() { renderer_.SwapBuffers(); } | 959 void SwapBuffers() { renderer_.SwapBuffers(); } |
960 | 960 |
961 void DrawFrame() { | 961 void DrawFrame() { |
962 gfx::Rect viewport_rect(DeviceViewportSize()); | 962 gfx::Rect viewport_rect(DeviceViewportSize()); |
963 ScopedPtrVector<RenderPass>* render_passes = render_passes_in_draw_order(); | 963 ScopedPtrVector<RenderPass>* render_passes = render_passes_in_draw_order(); |
964 render_passes->clear(); | 964 render_passes->clear(); |
965 | 965 |
966 RenderPass::Id render_pass_id(1, 0); | 966 RenderPass::Id render_pass_id(1, 0); |
967 TestRenderPass* render_pass = addRenderPass( | 967 TestRenderPass* render_pass = AddRenderPass( |
968 *render_passes, render_pass_id, viewport_rect, gfx::Transform()); | 968 *render_passes, render_pass_id, viewport_rect, gfx::Transform()); |
969 addQuad(render_pass, viewport_rect, SK_ColorGREEN); | 969 AddQuad(render_pass, viewport_rect, SK_ColorGREEN); |
970 | 970 |
971 EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return()); | 971 EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return()); |
972 | 972 |
973 EXPECT_CALL(output_surface_, Reshape(_)).Times(1); | 973 EXPECT_CALL(output_surface_, Reshape(_)).Times(1); |
974 | 974 |
975 EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1); | 975 EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1); |
976 | 976 |
977 EXPECT_CALL(*context(), drawElements(_, _, _, _)).Times(1); | 977 EXPECT_CALL(*context(), drawElements(_, _, _, _)).Times(1); |
978 | 978 |
979 renderer_.DecideRenderPassAllocationsForFrame(*render_passes_in_draw_order()
); | 979 renderer_.DecideRenderPassAllocationsForFrame(*render_passes_in_draw_order()
); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 } | 1022 } |
1023 }; | 1023 }; |
1024 | 1024 |
1025 TEST_F(MockOutputSurfaceTestWithSendCompositorFrame, DrawFrame) { | 1025 TEST_F(MockOutputSurfaceTestWithSendCompositorFrame, DrawFrame) { |
1026 EXPECT_CALL(output_surface_, SendFrameToParentCompositor(_)).Times(1); | 1026 EXPECT_CALL(output_surface_, SendFrameToParentCompositor(_)).Times(1); |
1027 DrawFrame(); | 1027 DrawFrame(); |
1028 } | 1028 } |
1029 | 1029 |
1030 } // namespace | 1030 } // namespace |
1031 } // namespace cc | 1031 } // namespace cc |
OLD | NEW |