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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 | 10 |
11 #include "base/location.h" | 11 #include "base/location.h" |
12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
13 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
14 #include "cc/base/math_util.h" | 14 #include "cc/base/math_util.h" |
15 #include "cc/output/compositor_frame_metadata.h" | 15 #include "cc/output/compositor_frame_metadata.h" |
16 #include "cc/output/copy_output_request.h" | 16 #include "cc/output/copy_output_request.h" |
17 #include "cc/output/copy_output_result.h" | 17 #include "cc/output/copy_output_result.h" |
18 #include "cc/output/overlay_strategy_single_on_top.h" | 18 #include "cc/output/overlay_strategy_single_on_top.h" |
19 #include "cc/output/overlay_strategy_underlay.h" | 19 #include "cc/output/overlay_strategy_underlay.h" |
20 #include "cc/output/texture_mailbox_deleter.h" | 20 #include "cc/output/texture_mailbox_deleter.h" |
21 #include "cc/quads/texture_draw_quad.h" | 21 #include "cc/quads/texture_draw_quad.h" |
22 #include "cc/resources/resource_provider.h" | 22 #include "cc/resources/resource_provider.h" |
| 23 #include "cc/test/fake_direct_renderer_client.h" |
23 #include "cc/test/fake_impl_task_runner_provider.h" | 24 #include "cc/test/fake_impl_task_runner_provider.h" |
24 #include "cc/test/fake_layer_tree_host_impl.h" | 25 #include "cc/test/fake_layer_tree_host_impl.h" |
25 #include "cc/test/fake_output_surface.h" | 26 #include "cc/test/fake_output_surface.h" |
26 #include "cc/test/fake_output_surface_client.h" | 27 #include "cc/test/fake_output_surface_client.h" |
27 #include "cc/test/fake_renderer_client.h" | |
28 #include "cc/test/fake_resource_provider.h" | 28 #include "cc/test/fake_resource_provider.h" |
29 #include "cc/test/pixel_test.h" | 29 #include "cc/test/pixel_test.h" |
30 #include "cc/test/render_pass_test_utils.h" | 30 #include "cc/test/render_pass_test_utils.h" |
31 #include "cc/test/test_gles2_interface.h" | 31 #include "cc/test/test_gles2_interface.h" |
32 #include "cc/test/test_shared_bitmap_manager.h" | 32 #include "cc/test/test_shared_bitmap_manager.h" |
33 #include "cc/test/test_web_graphics_context_3d.h" | 33 #include "cc/test/test_web_graphics_context_3d.h" |
34 #include "gpu/GLES2/gl2extchromium.h" | 34 #include "gpu/GLES2/gl2extchromium.h" |
35 #include "gpu/command_buffer/client/context_support.h" | 35 #include "gpu/command_buffer/client/context_support.h" |
36 #include "testing/gmock/include/gmock/gmock.h" | 36 #include "testing/gmock/include/gmock/gmock.h" |
37 #include "testing/gtest/include/gtest/gtest.h" | 37 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 20 matching lines...) Expand all Loading... |
58 gpu::SyncToken other; | 58 gpu::SyncToken other; |
59 memcpy(&other, arg, sizeof(other)); | 59 memcpy(&other, arg, sizeof(other)); |
60 return other == sync_token; | 60 return other == sync_token; |
61 } | 61 } |
62 | 62 |
63 class GLRendererTest : public testing::Test { | 63 class GLRendererTest : public testing::Test { |
64 protected: | 64 protected: |
65 RenderPass* root_render_pass() { | 65 RenderPass* root_render_pass() { |
66 return render_passes_in_draw_order_.back().get(); | 66 return render_passes_in_draw_order_.back().get(); |
67 } | 67 } |
68 void DrawFrame(Renderer* renderer, const gfx::Rect& viewport_rect) { | 68 void DrawFrame(GLRenderer* renderer, const gfx::Rect& viewport_rect) { |
69 renderer->DrawFrame(&render_passes_in_draw_order_, 1.f, gfx::ColorSpace(), | 69 renderer->DrawFrame(&render_passes_in_draw_order_, 1.f, gfx::ColorSpace(), |
70 viewport_rect, viewport_rect); | 70 viewport_rect, viewport_rect); |
71 } | 71 } |
72 void DrawFrame(Renderer* renderer, | 72 void DrawFrame(GLRenderer* renderer, |
73 const gfx::Rect& viewport_rect, | 73 const gfx::Rect& viewport_rect, |
74 const gfx::Rect& clip_rect) { | 74 const gfx::Rect& clip_rect) { |
75 renderer->DrawFrame(&render_passes_in_draw_order_, 1.f, gfx::ColorSpace(), | 75 renderer->DrawFrame(&render_passes_in_draw_order_, 1.f, gfx::ColorSpace(), |
76 viewport_rect, clip_rect); | 76 viewport_rect, clip_rect); |
77 } | 77 } |
78 | 78 |
79 RenderPassList render_passes_in_draw_order_; | 79 RenderPassList render_passes_in_draw_order_; |
80 }; | 80 }; |
81 | 81 |
82 #define EXPECT_PROGRAM_VALID(program_binding) \ | 82 #define EXPECT_PROGRAM_VALID(program_binding) \ |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 MaskShaderPixelTest, | 306 MaskShaderPixelTest, |
307 ::testing::Combine(::testing::ValuesIn(kPrecisionList), | 307 ::testing::Combine(::testing::ValuesIn(kPrecisionList), |
308 ::testing::ValuesIn(kSamplerList), | 308 ::testing::ValuesIn(kSamplerList), |
309 ::testing::ValuesIn(kBlendModeList), | 309 ::testing::ValuesIn(kBlendModeList), |
310 ::testing::Bool())); | 310 ::testing::Bool())); |
311 | 311 |
312 #endif | 312 #endif |
313 | 313 |
314 class FakeRendererGL : public GLRenderer { | 314 class FakeRendererGL : public GLRenderer { |
315 public: | 315 public: |
316 FakeRendererGL(RendererClient* client, | 316 FakeRendererGL(DirectRendererClient* client, |
317 const RendererSettings* settings, | 317 const RendererSettings* settings, |
318 OutputSurface* output_surface, | 318 OutputSurface* output_surface, |
319 ResourceProvider* resource_provider) | 319 ResourceProvider* resource_provider) |
320 : GLRenderer(client, | 320 : GLRenderer(client, |
321 settings, | 321 settings, |
322 output_surface, | 322 output_surface, |
323 resource_provider, | 323 resource_provider, |
324 NULL, | 324 NULL, |
325 0) {} | 325 0) {} |
326 | 326 |
327 FakeRendererGL(RendererClient* client, | 327 FakeRendererGL(DirectRendererClient* client, |
328 const RendererSettings* settings, | 328 const RendererSettings* settings, |
329 OutputSurface* output_surface, | 329 OutputSurface* output_surface, |
330 ResourceProvider* resource_provider, | 330 ResourceProvider* resource_provider, |
331 TextureMailboxDeleter* texture_mailbox_deleter) | 331 TextureMailboxDeleter* texture_mailbox_deleter) |
332 : GLRenderer(client, | 332 : GLRenderer(client, |
333 settings, | 333 settings, |
334 output_surface, | 334 output_surface, |
335 resource_provider, | 335 resource_provider, |
336 texture_mailbox_deleter, | 336 texture_mailbox_deleter, |
337 0) {} | 337 0) {} |
338 | 338 |
339 void SetOverlayProcessor(OverlayProcessor* processor) { | 339 void SetOverlayProcessor(OverlayProcessor* processor) { |
340 overlay_processor_.reset(processor); | 340 overlay_processor_.reset(processor); |
341 } | 341 } |
342 | 342 |
343 // GLRenderer methods. | 343 // GLRenderer methods. |
344 | 344 |
345 // Changing visibility to public. | 345 // Changing visibility to public. |
346 using GLRenderer::IsBackbufferDiscarded; | |
347 using GLRenderer::DoDrawQuad; | 346 using GLRenderer::DoDrawQuad; |
348 using GLRenderer::BeginDrawingFrame; | 347 using GLRenderer::BeginDrawingFrame; |
349 using GLRenderer::FinishDrawingQuadList; | 348 using GLRenderer::FinishDrawingQuadList; |
350 using GLRenderer::stencil_enabled; | 349 using GLRenderer::stencil_enabled; |
351 }; | 350 }; |
352 | 351 |
353 class GLRendererWithDefaultHarnessTest : public GLRendererTest { | 352 class GLRendererWithDefaultHarnessTest : public GLRendererTest { |
354 protected: | 353 protected: |
355 GLRendererWithDefaultHarnessTest() { | 354 GLRendererWithDefaultHarnessTest() { |
356 output_surface_ = | 355 output_surface_ = |
357 FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()); | 356 FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()); |
358 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 357 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
359 | 358 |
360 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); | 359 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); |
361 resource_provider_ = FakeResourceProvider::Create( | 360 resource_provider_ = FakeResourceProvider::Create( |
362 output_surface_.get(), shared_bitmap_manager_.get()); | 361 output_surface_.get(), shared_bitmap_manager_.get()); |
363 renderer_ = base::WrapUnique( | 362 renderer_ = base::WrapUnique( |
364 new FakeRendererGL(&renderer_client_, &settings_, output_surface_.get(), | 363 new FakeRendererGL(&renderer_client_, &settings_, output_surface_.get(), |
365 resource_provider_.get())); | 364 resource_provider_.get())); |
366 } | 365 } |
367 | 366 |
368 void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); } | 367 void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); } |
369 | 368 |
370 RendererSettings settings_; | 369 RendererSettings settings_; |
371 FakeOutputSurfaceClient output_surface_client_; | 370 FakeOutputSurfaceClient output_surface_client_; |
372 std::unique_ptr<FakeOutputSurface> output_surface_; | 371 std::unique_ptr<FakeOutputSurface> output_surface_; |
373 FakeRendererClient renderer_client_; | 372 FakeDirectRendererClient renderer_client_; |
374 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; | 373 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
375 std::unique_ptr<ResourceProvider> resource_provider_; | 374 std::unique_ptr<ResourceProvider> resource_provider_; |
376 std::unique_ptr<FakeRendererGL> renderer_; | 375 std::unique_ptr<FakeRendererGL> renderer_; |
377 }; | 376 }; |
378 | 377 |
379 // Closing the namespace here so that GLRendererShaderTest can take advantage | 378 // Closing the namespace here so that GLRendererShaderTest can take advantage |
380 // of the friend relationship with GLRenderer and all of the mock classes | 379 // of the friend relationship with GLRenderer and all of the mock classes |
381 // declared above it. | 380 // declared above it. |
382 } // namespace | 381 } // namespace |
383 | 382 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 | 484 |
486 void TestSolidColorProgramAA() { | 485 void TestSolidColorProgramAA() { |
487 EXPECT_PROGRAM_VALID(&renderer_->solid_color_program_aa_); | 486 EXPECT_PROGRAM_VALID(&renderer_->solid_color_program_aa_); |
488 EXPECT_EQ(renderer_->solid_color_program_aa_.program(), | 487 EXPECT_EQ(renderer_->solid_color_program_aa_.program(), |
489 renderer_->program_shadow_); | 488 renderer_->program_shadow_); |
490 } | 489 } |
491 | 490 |
492 RendererSettings settings_; | 491 RendererSettings settings_; |
493 FakeOutputSurfaceClient output_surface_client_; | 492 FakeOutputSurfaceClient output_surface_client_; |
494 std::unique_ptr<FakeOutputSurface> output_surface_; | 493 std::unique_ptr<FakeOutputSurface> output_surface_; |
495 FakeRendererClient renderer_client_; | 494 FakeDirectRendererClient renderer_client_; |
496 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; | 495 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
497 std::unique_ptr<ResourceProvider> resource_provider_; | 496 std::unique_ptr<ResourceProvider> resource_provider_; |
498 std::unique_ptr<FakeRendererGL> renderer_; | 497 std::unique_ptr<FakeRendererGL> renderer_; |
499 }; | 498 }; |
500 | 499 |
501 namespace { | 500 namespace { |
502 | 501 |
503 // Test GLRenderer DiscardBackbuffer functionality: | |
504 // Suggest discarding framebuffer when one exists and the renderer is not | |
505 // visible. | |
506 // Expected: it is discarded and damage tracker is reset. | |
507 TEST_F( | |
508 GLRendererWithDefaultHarnessTest, | |
509 SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLayerIfNotVisible) { | |
510 renderer_->SetVisible(false); | |
511 EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count()); | |
512 EXPECT_TRUE(renderer_->IsBackbufferDiscarded()); | |
513 } | |
514 | |
515 // Test GLRenderer DiscardBackbuffer functionality: | |
516 // Suggest discarding framebuffer when one exists and the renderer is visible. | |
517 // Expected: the allocation is ignored. | |
518 TEST_F(GLRendererWithDefaultHarnessTest, | |
519 SuggestBackbufferNoDoNothingWhenVisible) { | |
520 renderer_->SetVisible(true); | |
521 EXPECT_EQ(0, renderer_client_.set_full_root_layer_damage_count()); | |
522 EXPECT_FALSE(renderer_->IsBackbufferDiscarded()); | |
523 } | |
524 | |
525 // Test GLRenderer DiscardBackbuffer functionality: | |
526 // Suggest discarding framebuffer when one does not exist. | |
527 // Expected: it does nothing. | |
528 TEST_F(GLRendererWithDefaultHarnessTest, | |
529 SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) { | |
530 renderer_->SetVisible(false); | |
531 EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count()); | |
532 EXPECT_TRUE(renderer_->IsBackbufferDiscarded()); | |
533 | |
534 EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count()); | |
535 EXPECT_TRUE(renderer_->IsBackbufferDiscarded()); | |
536 } | |
537 | |
538 // Test GLRenderer DiscardBackbuffer functionality: | |
539 // Begin drawing a frame while a framebuffer is discarded. | |
540 // Expected: will recreate framebuffer. | |
541 TEST_F(GLRendererWithDefaultHarnessTest, | |
542 DiscardedBackbufferIsRecreatedForScopeDuration) { | |
543 gfx::Rect viewport_rect(1, 1); | |
544 renderer_->SetVisible(false); | |
545 EXPECT_TRUE(renderer_->IsBackbufferDiscarded()); | |
546 EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count()); | |
547 | |
548 AddRenderPass(&render_passes_in_draw_order_, | |
549 RenderPassId(1, 0), | |
550 viewport_rect, | |
551 gfx::Transform()); | |
552 | |
553 renderer_->SetVisible(true); | |
554 DrawFrame(renderer_.get(), viewport_rect); | |
555 EXPECT_FALSE(renderer_->IsBackbufferDiscarded()); | |
556 | |
557 SwapBuffers(); | |
558 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | |
559 } | |
560 | |
561 TEST_F(GLRendererWithDefaultHarnessTest, ExternalStencil) { | 502 TEST_F(GLRendererWithDefaultHarnessTest, ExternalStencil) { |
562 gfx::Rect viewport_rect(1, 1); | 503 gfx::Rect viewport_rect(1, 1); |
563 EXPECT_FALSE(renderer_->stencil_enabled()); | 504 EXPECT_FALSE(renderer_->stencil_enabled()); |
564 | 505 |
565 output_surface_->set_has_external_stencil_test(true); | 506 output_surface_->set_has_external_stencil_test(true); |
566 | 507 |
567 RenderPass* root_pass = | 508 RenderPass* root_pass = |
568 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 509 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
569 viewport_rect, gfx::Transform()); | 510 viewport_rect, gfx::Transform()); |
570 root_pass->has_transparent_background = false; | 511 root_pass->has_transparent_background = false; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 new ForbidSynchronousCallContext))); | 618 new ForbidSynchronousCallContext))); |
678 CHECK(output_surface->BindToClient(&output_surface_client)); | 619 CHECK(output_surface->BindToClient(&output_surface_client)); |
679 | 620 |
680 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 621 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
681 new TestSharedBitmapManager()); | 622 new TestSharedBitmapManager()); |
682 std::unique_ptr<ResourceProvider> resource_provider = | 623 std::unique_ptr<ResourceProvider> resource_provider = |
683 FakeResourceProvider::Create(output_surface.get(), | 624 FakeResourceProvider::Create(output_surface.get(), |
684 shared_bitmap_manager.get()); | 625 shared_bitmap_manager.get()); |
685 | 626 |
686 RendererSettings settings; | 627 RendererSettings settings; |
687 FakeRendererClient renderer_client; | 628 FakeDirectRendererClient renderer_client; |
688 FakeRendererGL renderer(&renderer_client, | 629 FakeRendererGL renderer(&renderer_client, |
689 &settings, | 630 &settings, |
690 output_surface.get(), | 631 output_surface.get(), |
691 resource_provider.get()); | 632 resource_provider.get()); |
692 } | 633 } |
693 | 634 |
694 class LoseContextOnFirstGetContext : public TestWebGraphicsContext3D { | 635 class LoseContextOnFirstGetContext : public TestWebGraphicsContext3D { |
695 public: | 636 public: |
696 LoseContextOnFirstGetContext() {} | 637 LoseContextOnFirstGetContext() {} |
697 | 638 |
(...skipping 15 matching lines...) Expand all Loading... |
713 new LoseContextOnFirstGetContext))); | 654 new LoseContextOnFirstGetContext))); |
714 CHECK(output_surface->BindToClient(&output_surface_client)); | 655 CHECK(output_surface->BindToClient(&output_surface_client)); |
715 | 656 |
716 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 657 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
717 new TestSharedBitmapManager()); | 658 new TestSharedBitmapManager()); |
718 std::unique_ptr<ResourceProvider> resource_provider = | 659 std::unique_ptr<ResourceProvider> resource_provider = |
719 FakeResourceProvider::Create(output_surface.get(), | 660 FakeResourceProvider::Create(output_surface.get(), |
720 shared_bitmap_manager.get()); | 661 shared_bitmap_manager.get()); |
721 | 662 |
722 RendererSettings settings; | 663 RendererSettings settings; |
723 FakeRendererClient renderer_client; | 664 FakeDirectRendererClient renderer_client; |
724 FakeRendererGL renderer(&renderer_client, | 665 FakeRendererGL renderer(&renderer_client, |
725 &settings, | 666 &settings, |
726 output_surface.get(), | 667 output_surface.get(), |
727 resource_provider.get()); | 668 resource_provider.get()); |
728 } | 669 } |
729 | 670 |
730 class ClearCountingContext : public TestWebGraphicsContext3D { | 671 class ClearCountingContext : public TestWebGraphicsContext3D { |
731 public: | 672 public: |
732 ClearCountingContext() { test_capabilities_.discard_framebuffer = true; } | 673 ClearCountingContext() { test_capabilities_.discard_framebuffer = true; } |
733 | 674 |
(...skipping 13 matching lines...) Expand all Loading... |
747 FakeOutputSurface::Create3d(std::move(context_owned))); | 688 FakeOutputSurface::Create3d(std::move(context_owned))); |
748 CHECK(output_surface->BindToClient(&output_surface_client)); | 689 CHECK(output_surface->BindToClient(&output_surface_client)); |
749 | 690 |
750 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 691 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
751 new TestSharedBitmapManager()); | 692 new TestSharedBitmapManager()); |
752 std::unique_ptr<ResourceProvider> resource_provider = | 693 std::unique_ptr<ResourceProvider> resource_provider = |
753 FakeResourceProvider::Create(output_surface.get(), | 694 FakeResourceProvider::Create(output_surface.get(), |
754 shared_bitmap_manager.get()); | 695 shared_bitmap_manager.get()); |
755 | 696 |
756 RendererSettings settings; | 697 RendererSettings settings; |
757 FakeRendererClient renderer_client; | 698 FakeDirectRendererClient renderer_client; |
758 FakeRendererGL renderer(&renderer_client, | 699 FakeRendererGL renderer(&renderer_client, |
759 &settings, | 700 &settings, |
760 output_surface.get(), | 701 output_surface.get(), |
761 resource_provider.get()); | 702 resource_provider.get()); |
762 | 703 |
763 gfx::Rect viewport_rect(1, 1); | 704 gfx::Rect viewport_rect(1, 1); |
764 RenderPass* root_pass = | 705 RenderPass* root_pass = |
765 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 706 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
766 viewport_rect, gfx::Transform()); | 707 viewport_rect, gfx::Transform()); |
767 root_pass->has_transparent_background = false; | 708 root_pass->has_transparent_background = false; |
(...skipping 21 matching lines...) Expand all Loading... |
789 FakeOutputSurface::Create3d(std::move(context_owned))); | 730 FakeOutputSurface::Create3d(std::move(context_owned))); |
790 CHECK(output_surface->BindToClient(&output_surface_client)); | 731 CHECK(output_surface->BindToClient(&output_surface_client)); |
791 | 732 |
792 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 733 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
793 new TestSharedBitmapManager()); | 734 new TestSharedBitmapManager()); |
794 std::unique_ptr<ResourceProvider> resource_provider = | 735 std::unique_ptr<ResourceProvider> resource_provider = |
795 FakeResourceProvider::Create(output_surface.get(), | 736 FakeResourceProvider::Create(output_surface.get(), |
796 shared_bitmap_manager.get()); | 737 shared_bitmap_manager.get()); |
797 | 738 |
798 RendererSettings settings; | 739 RendererSettings settings; |
799 FakeRendererClient renderer_client; | 740 FakeDirectRendererClient renderer_client; |
800 FakeRendererGL renderer(&renderer_client, | 741 FakeRendererGL renderer(&renderer_client, |
801 &settings, | 742 &settings, |
802 output_surface.get(), | 743 output_surface.get(), |
803 resource_provider.get()); | 744 resource_provider.get()); |
804 | 745 |
805 gfx::Rect viewport_rect(1, 1); | 746 gfx::Rect viewport_rect(1, 1); |
806 RenderPass* root_pass = | 747 RenderPass* root_pass = |
807 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 748 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
808 viewport_rect, gfx::Transform()); | 749 viewport_rect, gfx::Transform()); |
809 root_pass->has_transparent_background = true; | 750 root_pass->has_transparent_background = true; |
(...skipping 14 matching lines...) Expand all Loading... |
824 FakeOutputSurface::CreateOffscreen(std::move(context_owned))); | 765 FakeOutputSurface::CreateOffscreen(std::move(context_owned))); |
825 CHECK(output_surface->BindToClient(&output_surface_client)); | 766 CHECK(output_surface->BindToClient(&output_surface_client)); |
826 | 767 |
827 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 768 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
828 new TestSharedBitmapManager()); | 769 new TestSharedBitmapManager()); |
829 std::unique_ptr<ResourceProvider> resource_provider = | 770 std::unique_ptr<ResourceProvider> resource_provider = |
830 FakeResourceProvider::Create(output_surface.get(), | 771 FakeResourceProvider::Create(output_surface.get(), |
831 shared_bitmap_manager.get()); | 772 shared_bitmap_manager.get()); |
832 | 773 |
833 RendererSettings settings; | 774 RendererSettings settings; |
834 FakeRendererClient renderer_client; | 775 FakeDirectRendererClient renderer_client; |
835 FakeRendererGL renderer(&renderer_client, | 776 FakeRendererGL renderer(&renderer_client, |
836 &settings, | 777 &settings, |
837 output_surface.get(), | 778 output_surface.get(), |
838 resource_provider.get()); | 779 resource_provider.get()); |
839 | 780 |
840 gfx::Rect viewport_rect(1, 1); | 781 gfx::Rect viewport_rect(1, 1); |
841 AddRenderPass(&render_passes_in_draw_order_, | 782 AddRenderPass(&render_passes_in_draw_order_, |
842 RenderPassId(1, 0), | 783 RenderPassId(1, 0), |
843 viewport_rect, | 784 viewport_rect, |
844 gfx::Transform()); | 785 gfx::Transform()); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 FakeOutputSurface::Create3d(std::move(context_owned))); | 824 FakeOutputSurface::Create3d(std::move(context_owned))); |
884 CHECK(output_surface->BindToClient(&output_surface_client)); | 825 CHECK(output_surface->BindToClient(&output_surface_client)); |
885 | 826 |
886 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 827 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
887 new TestSharedBitmapManager()); | 828 new TestSharedBitmapManager()); |
888 std::unique_ptr<ResourceProvider> resource_provider = | 829 std::unique_ptr<ResourceProvider> resource_provider = |
889 FakeResourceProvider::Create(output_surface.get(), | 830 FakeResourceProvider::Create(output_surface.get(), |
890 shared_bitmap_manager.get()); | 831 shared_bitmap_manager.get()); |
891 | 832 |
892 RendererSettings settings; | 833 RendererSettings settings; |
893 FakeRendererClient renderer_client; | 834 FakeDirectRendererClient renderer_client; |
894 FakeRendererGL renderer(&renderer_client, | 835 FakeRendererGL renderer(&renderer_client, |
895 &settings, | 836 &settings, |
896 output_surface.get(), | 837 output_surface.get(), |
897 resource_provider.get()); | 838 resource_provider.get()); |
898 | 839 |
899 // During initialization we are allowed to set any texture parameters. | 840 // During initialization we are allowed to set any texture parameters. |
900 EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber()); | 841 EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber()); |
901 | 842 |
902 RenderPass* root_pass = | 843 RenderPass* root_pass = |
903 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 1), | 844 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 1), |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 | 908 |
968 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 909 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
969 new TestSharedBitmapManager()); | 910 new TestSharedBitmapManager()); |
970 std::unique_ptr<ResourceProvider> resource_provider = | 911 std::unique_ptr<ResourceProvider> resource_provider = |
971 FakeResourceProvider::Create(output_surface.get(), | 912 FakeResourceProvider::Create(output_surface.get(), |
972 shared_bitmap_manager.get()); | 913 shared_bitmap_manager.get()); |
973 | 914 |
974 RendererSettings settings; | 915 RendererSettings settings; |
975 settings.should_clear_root_render_pass = false; | 916 settings.should_clear_root_render_pass = false; |
976 | 917 |
977 FakeRendererClient renderer_client; | 918 FakeDirectRendererClient renderer_client; |
978 FakeRendererGL renderer(&renderer_client, | 919 FakeRendererGL renderer(&renderer_client, |
979 &settings, | 920 &settings, |
980 output_surface.get(), | 921 output_surface.get(), |
981 resource_provider.get()); | 922 resource_provider.get()); |
982 | 923 |
983 gfx::Rect viewport_rect(10, 10); | 924 gfx::Rect viewport_rect(10, 10); |
984 | 925 |
985 RenderPassId child_pass_id(2, 0); | 926 RenderPassId child_pass_id(2, 0); |
986 RenderPass* child_pass = | 927 RenderPass* child_pass = |
987 AddRenderPass(&render_passes_in_draw_order_, child_pass_id, viewport_rect, | 928 AddRenderPass(&render_passes_in_draw_order_, child_pass_id, viewport_rect, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 TestContextProvider::Create(std::move(gl_owned)))); | 993 TestContextProvider::Create(std::move(gl_owned)))); |
1053 CHECK(output_surface->BindToClient(&output_surface_client)); | 994 CHECK(output_surface->BindToClient(&output_surface_client)); |
1054 | 995 |
1055 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 996 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
1056 new TestSharedBitmapManager()); | 997 new TestSharedBitmapManager()); |
1057 std::unique_ptr<ResourceProvider> resource_provider = | 998 std::unique_ptr<ResourceProvider> resource_provider = |
1058 FakeResourceProvider::Create(output_surface.get(), | 999 FakeResourceProvider::Create(output_surface.get(), |
1059 shared_bitmap_manager.get()); | 1000 shared_bitmap_manager.get()); |
1060 | 1001 |
1061 RendererSettings settings; | 1002 RendererSettings settings; |
1062 FakeRendererClient renderer_client; | 1003 FakeDirectRendererClient renderer_client; |
1063 FakeRendererGL renderer(&renderer_client, | 1004 FakeRendererGL renderer(&renderer_client, |
1064 &settings, | 1005 &settings, |
1065 output_surface.get(), | 1006 output_surface.get(), |
1066 resource_provider.get()); | 1007 resource_provider.get()); |
1067 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); | 1008 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); |
1068 | 1009 |
1069 gfx::Rect viewport_rect(1, 1); | 1010 gfx::Rect viewport_rect(1, 1); |
1070 | 1011 |
1071 gfx::Rect grand_child_rect(25, 25); | 1012 gfx::Rect grand_child_rect(25, 25); |
1072 RenderPassId grand_child_pass_id(3, 0); | 1013 RenderPassId grand_child_pass_id(3, 0); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1143 output_surface->set_fixed_size(gfx::Size(100, 100)); | 1084 output_surface->set_fixed_size(gfx::Size(100, 100)); |
1144 | 1085 |
1145 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 1086 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
1146 new TestSharedBitmapManager()); | 1087 new TestSharedBitmapManager()); |
1147 std::unique_ptr<ResourceProvider> resource_provider = | 1088 std::unique_ptr<ResourceProvider> resource_provider = |
1148 FakeResourceProvider::Create(output_surface.get(), | 1089 FakeResourceProvider::Create(output_surface.get(), |
1149 shared_bitmap_manager.get()); | 1090 shared_bitmap_manager.get()); |
1150 | 1091 |
1151 RendererSettings settings; | 1092 RendererSettings settings; |
1152 settings.partial_swap_enabled = true; | 1093 settings.partial_swap_enabled = true; |
1153 FakeRendererClient renderer_client; | 1094 FakeDirectRendererClient renderer_client; |
1154 FakeRendererGL renderer(&renderer_client, | 1095 FakeRendererGL renderer(&renderer_client, |
1155 &settings, | 1096 &settings, |
1156 output_surface.get(), | 1097 output_surface.get(), |
1157 resource_provider.get()); | 1098 resource_provider.get()); |
1158 EXPECT_TRUE(renderer.Capabilities().using_partial_swap); | 1099 EXPECT_TRUE(renderer.Capabilities().using_partial_swap); |
1159 | 1100 |
1160 gfx::Rect viewport_rect(100, 100); | 1101 gfx::Rect viewport_rect(100, 100); |
1161 gfx::Rect clip_rect(100, 100); | 1102 gfx::Rect clip_rect(100, 100); |
1162 | 1103 |
1163 { | 1104 { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 new NonReshapableOutputSurface(std::move(gl_owned))); | 1218 new NonReshapableOutputSurface(std::move(gl_owned))); |
1278 CHECK(output_surface->BindToClient(&output_surface_client)); | 1219 CHECK(output_surface->BindToClient(&output_surface_client)); |
1279 | 1220 |
1280 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 1221 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
1281 new TestSharedBitmapManager()); | 1222 new TestSharedBitmapManager()); |
1282 std::unique_ptr<ResourceProvider> resource_provider = | 1223 std::unique_ptr<ResourceProvider> resource_provider = |
1283 FakeResourceProvider::Create(output_surface.get(), | 1224 FakeResourceProvider::Create(output_surface.get(), |
1284 shared_bitmap_manager.get()); | 1225 shared_bitmap_manager.get()); |
1285 | 1226 |
1286 RendererSettings settings; | 1227 RendererSettings settings; |
1287 FakeRendererClient renderer_client; | 1228 FakeDirectRendererClient renderer_client; |
1288 FakeRendererGL renderer(&renderer_client, | 1229 FakeRendererGL renderer(&renderer_client, |
1289 &settings, | 1230 &settings, |
1290 output_surface.get(), | 1231 output_surface.get(), |
1291 resource_provider.get()); | 1232 resource_provider.get()); |
1292 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); | 1233 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); |
1293 | 1234 |
1294 gfx::Rect device_viewport_rect(10, 10, 100, 100); | 1235 gfx::Rect device_viewport_rect(10, 10, 100, 100); |
1295 gfx::Rect viewport_rect(device_viewport_rect.size()); | 1236 gfx::Rect viewport_rect(device_viewport_rect.size()); |
1296 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); | 1237 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); |
1297 | 1238 |
(...skipping 18 matching lines...) Expand all Loading... |
1316 FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create())); | 1257 FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create())); |
1317 CHECK(output_surface->BindToClient(&output_surface_client)); | 1258 CHECK(output_surface->BindToClient(&output_surface_client)); |
1318 | 1259 |
1319 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 1260 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
1320 new TestSharedBitmapManager()); | 1261 new TestSharedBitmapManager()); |
1321 std::unique_ptr<ResourceProvider> resource_provider = | 1262 std::unique_ptr<ResourceProvider> resource_provider = |
1322 FakeResourceProvider::Create(output_surface.get(), | 1263 FakeResourceProvider::Create(output_surface.get(), |
1323 shared_bitmap_manager.get()); | 1264 shared_bitmap_manager.get()); |
1324 | 1265 |
1325 RendererSettings settings; | 1266 RendererSettings settings; |
1326 FakeRendererClient renderer_client; | 1267 FakeDirectRendererClient renderer_client; |
1327 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 1268 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
1328 resource_provider.get()); | 1269 resource_provider.get()); |
1329 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); | 1270 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); |
1330 | 1271 |
1331 gfx::Rect device_viewport_rect(0, 0, 100, 100); | 1272 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
1332 gfx::Rect viewport_rect(device_viewport_rect.size()); | 1273 gfx::Rect viewport_rect(device_viewport_rect.size()); |
1333 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); | 1274 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); |
1334 | 1275 |
1335 RenderPassId root_pass_id(1, 0); | 1276 RenderPassId root_pass_id(1, 0); |
1336 RenderPass* root_pass = | 1277 RenderPass* root_pass = |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1745 return static_cast<OutputSurfaceMockContext*>( | 1686 return static_cast<OutputSurfaceMockContext*>( |
1746 static_cast<TestContextProvider*>(output_surface_.context_provider()) | 1687 static_cast<TestContextProvider*>(output_surface_.context_provider()) |
1747 ->TestContext3d()); | 1688 ->TestContext3d()); |
1748 } | 1689 } |
1749 | 1690 |
1750 RendererSettings settings_; | 1691 RendererSettings settings_; |
1751 FakeOutputSurfaceClient output_surface_client_; | 1692 FakeOutputSurfaceClient output_surface_client_; |
1752 StrictMock<MockOutputSurface> output_surface_; | 1693 StrictMock<MockOutputSurface> output_surface_; |
1753 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; | 1694 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
1754 std::unique_ptr<ResourceProvider> resource_provider_; | 1695 std::unique_ptr<ResourceProvider> resource_provider_; |
1755 FakeRendererClient renderer_client_; | 1696 FakeDirectRendererClient renderer_client_; |
1756 std::unique_ptr<FakeRendererGL> renderer_; | 1697 std::unique_ptr<FakeRendererGL> renderer_; |
1757 }; | 1698 }; |
1758 | 1699 |
1759 TEST_F(MockOutputSurfaceTest, DrawFrameAndSwap) { | 1700 TEST_F(MockOutputSurfaceTest, DrawFrameAndSwap) { |
1760 gfx::Rect device_viewport_rect(1, 1); | 1701 gfx::Rect device_viewport_rect(1, 1); |
1761 DrawFrame(1.f, device_viewport_rect, true); | 1702 DrawFrame(1.f, device_viewport_rect, true); |
1762 | 1703 |
1763 EXPECT_CALL(output_surface_, SwapBuffers_(_)).Times(1); | 1704 EXPECT_CALL(output_surface_, SwapBuffers_(_)).Times(1); |
1764 renderer_->SwapBuffers(CompositorFrameMetadata()); | 1705 renderer_->SwapBuffers(CompositorFrameMetadata()); |
1765 } | 1706 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1849 | 1790 |
1850 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 1791 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
1851 new TestSharedBitmapManager()); | 1792 new TestSharedBitmapManager()); |
1852 std::unique_ptr<ResourceProvider> resource_provider = | 1793 std::unique_ptr<ResourceProvider> resource_provider = |
1853 FakeResourceProvider::Create(output_surface.get(), | 1794 FakeResourceProvider::Create(output_surface.get(), |
1854 shared_bitmap_manager.get()); | 1795 shared_bitmap_manager.get()); |
1855 std::unique_ptr<TextureMailboxDeleter> mailbox_deleter( | 1796 std::unique_ptr<TextureMailboxDeleter> mailbox_deleter( |
1856 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); | 1797 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); |
1857 | 1798 |
1858 RendererSettings settings; | 1799 RendererSettings settings; |
1859 FakeRendererClient renderer_client; | 1800 FakeDirectRendererClient renderer_client; |
1860 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 1801 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
1861 resource_provider.get(), mailbox_deleter.get()); | 1802 resource_provider.get(), mailbox_deleter.get()); |
1862 | 1803 |
1863 TestOverlayProcessor* processor = | 1804 TestOverlayProcessor* processor = |
1864 new TestOverlayProcessor(output_surface.get()); | 1805 new TestOverlayProcessor(output_surface.get()); |
1865 processor->Initialize(); | 1806 processor->Initialize(); |
1866 renderer.SetOverlayProcessor(processor); | 1807 renderer.SetOverlayProcessor(processor); |
1867 std::unique_ptr<TestOverlayProcessor::Validator> validator( | 1808 std::unique_ptr<TestOverlayProcessor::Validator> validator( |
1868 new TestOverlayProcessor::Validator); | 1809 new TestOverlayProcessor::Validator); |
1869 output_surface->SetOverlayCandidateValidator(validator.get()); | 1810 output_surface->SetOverlayCandidateValidator(validator.get()); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2007 | 1948 |
2008 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( | 1949 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( |
2009 new TestSharedBitmapManager()); | 1950 new TestSharedBitmapManager()); |
2010 std::unique_ptr<ResourceProvider> resource_provider = | 1951 std::unique_ptr<ResourceProvider> resource_provider = |
2011 FakeResourceProvider::Create(output_surface.get(), | 1952 FakeResourceProvider::Create(output_surface.get(), |
2012 shared_bitmap_manager.get()); | 1953 shared_bitmap_manager.get()); |
2013 std::unique_ptr<TextureMailboxDeleter> mailbox_deleter( | 1954 std::unique_ptr<TextureMailboxDeleter> mailbox_deleter( |
2014 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); | 1955 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); |
2015 | 1956 |
2016 RendererSettings settings; | 1957 RendererSettings settings; |
2017 FakeRendererClient renderer_client; | 1958 FakeDirectRendererClient renderer_client; |
2018 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 1959 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
2019 resource_provider.get(), mailbox_deleter.get()); | 1960 resource_provider.get(), mailbox_deleter.get()); |
2020 | 1961 |
2021 SingleOverlayOnTopProcessor* processor = | 1962 SingleOverlayOnTopProcessor* processor = |
2022 new SingleOverlayOnTopProcessor(output_surface.get()); | 1963 new SingleOverlayOnTopProcessor(output_surface.get()); |
2023 processor->Initialize(); | 1964 processor->Initialize(); |
2024 renderer.SetOverlayProcessor(processor); | 1965 renderer.SetOverlayProcessor(processor); |
2025 | 1966 |
2026 gfx::Rect viewport_rect(1, 1); | 1967 gfx::Rect viewport_rect(1, 1); |
2027 RenderPass* root_pass = | 1968 RenderPass* root_pass = |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2085 FakeOutputSurfaceClient output_surface_client; | 2026 FakeOutputSurfaceClient output_surface_client; |
2086 std::unique_ptr<FakeOutputSurface> output_surface( | 2027 std::unique_ptr<FakeOutputSurface> output_surface( |
2087 FakeOutputSurface::Create3d(std::move(gl_owned))); | 2028 FakeOutputSurface::Create3d(std::move(gl_owned))); |
2088 CHECK(output_surface->BindToClient(&output_surface_client)); | 2029 CHECK(output_surface->BindToClient(&output_surface_client)); |
2089 | 2030 |
2090 std::unique_ptr<ResourceProvider> resource_provider = | 2031 std::unique_ptr<ResourceProvider> resource_provider = |
2091 FakeResourceProvider::Create(output_surface.get(), nullptr); | 2032 FakeResourceProvider::Create(output_surface.get(), nullptr); |
2092 | 2033 |
2093 RendererSettings settings; | 2034 RendererSettings settings; |
2094 settings.partial_swap_enabled = partial_swap; | 2035 settings.partial_swap_enabled = partial_swap; |
2095 FakeRendererClient renderer_client; | 2036 FakeDirectRendererClient renderer_client; |
2096 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 2037 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
2097 resource_provider.get()); | 2038 resource_provider.get()); |
2098 EXPECT_EQ(partial_swap, renderer.Capabilities().using_partial_swap); | 2039 EXPECT_EQ(partial_swap, renderer.Capabilities().using_partial_swap); |
2099 | 2040 |
2100 gfx::Rect viewport_rect(100, 100); | 2041 gfx::Rect viewport_rect(100, 100); |
2101 gfx::Rect clip_rect(100, 100); | 2042 gfx::Rect clip_rect(100, 100); |
2102 | 2043 |
2103 { | 2044 { |
2104 RenderPassId root_pass_id(1, 0); | 2045 RenderPassId root_pass_id(1, 0); |
2105 RenderPass* root_pass = | 2046 RenderPass* root_pass = |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2143 TEST_F(GLRendererPartialSwapTest, PartialSwap) { | 2084 TEST_F(GLRendererPartialSwapTest, PartialSwap) { |
2144 RunTest(true); | 2085 RunTest(true); |
2145 } | 2086 } |
2146 | 2087 |
2147 TEST_F(GLRendererPartialSwapTest, NoPartialSwap) { | 2088 TEST_F(GLRendererPartialSwapTest, NoPartialSwap) { |
2148 RunTest(false); | 2089 RunTest(false); |
2149 } | 2090 } |
2150 | 2091 |
2151 } // namespace | 2092 } // namespace |
2152 } // namespace cc | 2093 } // namespace cc |
OLD | NEW |