| 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 |