| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/surfaces/surface_factory.h" | 5 #include "cc/surfaces/surface_factory.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "cc/output/compositor_frame.h" | 15 #include "cc/output/compositor_frame.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/resources/resource_provider.h" | 18 #include "cc/resources/resource_provider.h" |
| 19 #include "cc/surfaces/frame_sink_manager_client.h" |
| 19 #include "cc/surfaces/surface.h" | 20 #include "cc/surfaces/surface.h" |
| 21 #include "cc/surfaces/surface_aggregator_client.h" |
| 20 #include "cc/surfaces/surface_factory_client.h" | 22 #include "cc/surfaces/surface_factory_client.h" |
| 21 #include "cc/surfaces/surface_info.h" | 23 #include "cc/surfaces/surface_info.h" |
| 22 #include "cc/surfaces/surface_manager.h" | 24 #include "cc/surfaces/surface_manager.h" |
| 25 #include "cc/surfaces/surface_resource_holder_client.h" |
| 23 #include "cc/test/scheduler_test_common.h" | 26 #include "cc/test/scheduler_test_common.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 25 #include "ui/gfx/geometry/size.h" | 28 #include "ui/gfx/geometry/size.h" |
| 26 | 29 |
| 27 namespace cc { | 30 namespace cc { |
| 28 namespace { | 31 namespace { |
| 29 | 32 |
| 30 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 33 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
| 31 static constexpr FrameSinkId kAnotherArbitraryFrameSinkId(2, 2); | 34 static constexpr FrameSinkId kAnotherArbitraryFrameSinkId(2, 2); |
| 32 static const base::UnguessableToken kArbitraryToken = | 35 static const base::UnguessableToken kArbitraryToken = |
| 33 base::UnguessableToken::Create(); | 36 base::UnguessableToken::Create(); |
| 34 static auto kArbitrarySourceId1 = | 37 static auto kArbitrarySourceId1 = |
| 35 base::UnguessableToken::Deserialize(0xdead, 0xbeef); | 38 base::UnguessableToken::Deserialize(0xdead, 0xbeef); |
| 36 static auto kArbitrarySourceId2 = | 39 static auto kArbitrarySourceId2 = |
| 37 base::UnguessableToken::Deserialize(0xdead, 0xbee0); | 40 base::UnguessableToken::Deserialize(0xdead, 0xbee0); |
| 38 | 41 |
| 39 class TestSurfaceFactoryClient : public SurfaceFactoryClient { | 42 class TestClient : public SurfaceFactoryClient, |
| 43 public SurfaceResourceHolderClient, |
| 44 public SurfaceAggregatorClient, |
| 45 public FrameSinkManagerClient { |
| 40 public: | 46 public: |
| 41 TestSurfaceFactoryClient() : begin_frame_source_(nullptr) {} | 47 TestClient() {} |
| 42 ~TestSurfaceFactoryClient() override {} | 48 ~TestClient() override {} |
| 49 |
| 50 void ReferencedSurfacesChanged( |
| 51 const LocalSurfaceId& local_surface_id, |
| 52 const std::vector<SurfaceId>* active_referenced_surfaces) override {} |
| 43 | 53 |
| 44 void ReturnResources(const ReturnedResourceArray& resources) override { | 54 void ReturnResources(const ReturnedResourceArray& resources) override { |
| 45 returned_resources_.insert( | 55 returned_resources_.insert(returned_resources_.end(), resources.begin(), |
| 46 returned_resources_.end(), resources.begin(), resources.end()); | 56 resources.end()); |
| 47 } | 57 } |
| 48 | 58 |
| 49 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { | 59 void WillDrawSurface(const LocalSurfaceId& local_surface_id, |
| 50 begin_frame_source_ = begin_frame_source; | 60 const gfx::Rect& damage_rect) override {} |
| 51 } | 61 |
| 62 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} |
| 52 | 63 |
| 53 const ReturnedResourceArray& returned_resources() const { | 64 const ReturnedResourceArray& returned_resources() const { |
| 54 return returned_resources_; | 65 return returned_resources_; |
| 55 } | 66 } |
| 56 | 67 |
| 57 void clear_returned_resources() { returned_resources_.clear(); } | 68 void clear_returned_resources() { returned_resources_.clear(); } |
| 58 | 69 |
| 59 BeginFrameSource* begin_frame_source() const { return begin_frame_source_; } | |
| 60 | |
| 61 private: | 70 private: |
| 62 ReturnedResourceArray returned_resources_; | 71 ReturnedResourceArray returned_resources_; |
| 63 BeginFrameSource* begin_frame_source_; | |
| 64 | 72 |
| 65 DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient); | 73 DISALLOW_COPY_AND_ASSIGN(TestClient); |
| 66 }; | 74 }; |
| 67 | 75 |
| 68 gpu::SyncToken GenTestSyncToken(int id) { | 76 gpu::SyncToken GenTestSyncToken(int id) { |
| 69 gpu::SyncToken token; | 77 gpu::SyncToken token; |
| 70 token.Set(gpu::CommandBufferNamespace::GPU_IO, 0, | 78 token.Set(gpu::CommandBufferNamespace::GPU_IO, 0, |
| 71 gpu::CommandBufferId::FromUnsafeValue(id), 1); | 79 gpu::CommandBufferId::FromUnsafeValue(id), 1); |
| 72 return token; | 80 return token; |
| 73 } | 81 } |
| 74 | 82 |
| 75 class SurfaceFactoryTest : public testing::Test, public SurfaceObserver { | 83 class SurfaceFactoryTest : public testing::Test, public SurfaceObserver { |
| 76 public: | 84 public: |
| 77 SurfaceFactoryTest() | 85 SurfaceFactoryTest() |
| 78 : factory_( | 86 : factory_(new SurfaceFactory(kArbitraryFrameSinkId, |
| 79 new SurfaceFactory(kArbitraryFrameSinkId, &manager_, &client_)), | 87 &manager_, |
| 88 &client_, |
| 89 &client_, |
| 90 &client_)), |
| 80 local_surface_id_(3, kArbitraryToken), | 91 local_surface_id_(3, kArbitraryToken), |
| 81 frame_sync_token_(GenTestSyncToken(4)), | 92 frame_sync_token_(GenTestSyncToken(4)), |
| 82 consumer_sync_token_(GenTestSyncToken(5)) { | 93 consumer_sync_token_(GenTestSyncToken(5)) { |
| 83 manager_.AddObserver(this); | 94 manager_.AddObserver(this); |
| 84 } | 95 } |
| 85 | 96 |
| 86 const SurfaceId& last_created_surface_id() const { | 97 const SurfaceId& last_created_surface_id() const { |
| 87 return last_created_surface_id_; | 98 return last_created_surface_id_; |
| 88 } | 99 } |
| 89 | 100 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 } | 160 } |
| 150 | 161 |
| 151 void RefCurrentFrameResources() { | 162 void RefCurrentFrameResources() { |
| 152 Surface* surface = manager_.GetSurfaceForId( | 163 Surface* surface = manager_.GetSurfaceForId( |
| 153 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); | 164 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); |
| 154 factory_->RefResources(surface->GetActiveFrame().resource_list); | 165 factory_->RefResources(surface->GetActiveFrame().resource_list); |
| 155 } | 166 } |
| 156 | 167 |
| 157 protected: | 168 protected: |
| 158 SurfaceManager manager_; | 169 SurfaceManager manager_; |
| 159 TestSurfaceFactoryClient client_; | 170 TestClient client_; |
| 160 std::unique_ptr<SurfaceFactory> factory_; | 171 std::unique_ptr<SurfaceFactory> factory_; |
| 161 LocalSurfaceId local_surface_id_; | 172 LocalSurfaceId local_surface_id_; |
| 162 SurfaceId last_created_surface_id_; | 173 SurfaceId last_created_surface_id_; |
| 163 SurfaceInfo last_surface_info_; | 174 SurfaceInfo last_surface_info_; |
| 164 | 175 |
| 165 // This is the sync token submitted with the frame. It should never be | 176 // This is the sync token submitted with the frame. It should never be |
| 166 // returned to the client. | 177 // returned to the client. |
| 167 const gpu::SyncToken frame_sync_token_; | 178 const gpu::SyncToken frame_sync_token_; |
| 168 | 179 |
| 169 // This is the sync token returned by the consumer. It should always be | 180 // This is the sync token returned by the consumer. It should always be |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 EXPECT_TRUE(client_.returned_resources().empty()); | 590 EXPECT_TRUE(client_.returned_resources().empty()); |
| 580 EXPECT_EQ(0u, execute_count); | 591 EXPECT_EQ(0u, execute_count); |
| 581 | 592 |
| 582 manager_.SatisfySequence(SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); | 593 manager_.SatisfySequence(SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); |
| 583 EXPECT_FALSE(manager_.GetSurfaceForId(surface_id)); | 594 EXPECT_FALSE(manager_.GetSurfaceForId(surface_id)); |
| 584 EXPECT_FALSE(client_.returned_resources().empty()); | 595 EXPECT_FALSE(client_.returned_resources().empty()); |
| 585 } | 596 } |
| 586 | 597 |
| 587 TEST_F(SurfaceFactoryTest, DestroySequence) { | 598 TEST_F(SurfaceFactoryTest, DestroySequence) { |
| 588 LocalSurfaceId local_surface_id2(5, kArbitraryToken); | 599 LocalSurfaceId local_surface_id2(5, kArbitraryToken); |
| 589 std::unique_ptr<SurfaceFactory> factory2( | 600 std::unique_ptr<SurfaceFactory> factory2(new SurfaceFactory( |
| 590 new SurfaceFactory(kArbitraryFrameSinkId, &manager_, &client_)); | 601 kArbitraryFrameSinkId, &manager_, &client_, &client_, &client_)); |
| 591 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); | 602 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); |
| 592 factory2->SubmitCompositorFrame(local_surface_id2, CompositorFrame(), | 603 factory2->SubmitCompositorFrame(local_surface_id2, CompositorFrame(), |
| 593 SurfaceFactory::DrawCallback()); | 604 SurfaceFactory::DrawCallback()); |
| 594 | 605 |
| 595 manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); | 606 manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); |
| 596 | 607 |
| 597 // Check that waiting before the sequence is satisfied works. | 608 // Check that waiting before the sequence is satisfied works. |
| 598 manager_.GetSurfaceForId(id2)->AddDestructionDependency( | 609 manager_.GetSurfaceForId(id2)->AddDestructionDependency( |
| 599 SurfaceSequence(kArbitraryFrameSinkId, 4)); | 610 SurfaceSequence(kArbitraryFrameSinkId, 4)); |
| 600 factory2->EvictSurface(); | 611 factory2->EvictSurface(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 manager_.InvalidateFrameSinkId(frame_sink_id); | 647 manager_.InvalidateFrameSinkId(frame_sink_id); |
| 637 | 648 |
| 638 // Verify that the invalidated namespace caused the unsatisfied sequence | 649 // Verify that the invalidated namespace caused the unsatisfied sequence |
| 639 // to be ignored. | 650 // to be ignored. |
| 640 EXPECT_FALSE(manager_.GetSurfaceForId(id)); | 651 EXPECT_FALSE(manager_.GetSurfaceForId(id)); |
| 641 } | 652 } |
| 642 | 653 |
| 643 TEST_F(SurfaceFactoryTest, DestroyCycle) { | 654 TEST_F(SurfaceFactoryTest, DestroyCycle) { |
| 644 LocalSurfaceId local_surface_id2(5, kArbitraryToken); | 655 LocalSurfaceId local_surface_id2(5, kArbitraryToken); |
| 645 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); | 656 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); |
| 646 std::unique_ptr<SurfaceFactory> factory2( | 657 std::unique_ptr<SurfaceFactory> factory2(new SurfaceFactory( |
| 647 new SurfaceFactory(kArbitraryFrameSinkId, &manager_, &client_)); | 658 kArbitraryFrameSinkId, &manager_, &client_, &client_, &client_)); |
| 648 manager_.RegisterFrameSinkId(kAnotherArbitraryFrameSinkId); | 659 manager_.RegisterFrameSinkId(kAnotherArbitraryFrameSinkId); |
| 649 // Give id2 a frame that references local_surface_id_. | 660 // Give id2 a frame that references local_surface_id_. |
| 650 { | 661 { |
| 651 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); | 662 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); |
| 652 CompositorFrame frame; | 663 CompositorFrame frame; |
| 653 frame.render_pass_list.push_back(std::move(render_pass)); | 664 frame.render_pass_list.push_back(std::move(render_pass)); |
| 654 frame.metadata.referenced_surfaces.push_back( | 665 frame.metadata.referenced_surfaces.push_back( |
| 655 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); | 666 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); |
| 656 factory2->SubmitCompositorFrame(local_surface_id2, std::move(frame), | 667 factory2->SubmitCompositorFrame(local_surface_id2, std::move(frame), |
| 657 SurfaceFactory::DrawCallback()); | 668 SurfaceFactory::DrawCallback()); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 factory_->SubmitCompositorFrame(local_surface_id_, std::move(frame), | 770 factory_->SubmitCompositorFrame(local_surface_id_, std::move(frame), |
| 760 SurfaceFactory::DrawCallback()); | 771 SurfaceFactory::DrawCallback()); |
| 761 SurfaceId expected_surface_id(factory_->frame_sink_id(), local_surface_id_); | 772 SurfaceId expected_surface_id(factory_->frame_sink_id(), local_surface_id_); |
| 762 EXPECT_EQ(expected_surface_id, last_surface_info_.id()); | 773 EXPECT_EQ(expected_surface_id, last_surface_info_.id()); |
| 763 EXPECT_EQ(2.5f, last_surface_info_.device_scale_factor()); | 774 EXPECT_EQ(2.5f, last_surface_info_.device_scale_factor()); |
| 764 EXPECT_EQ(gfx::Size(7, 8), last_surface_info_.size_in_pixels()); | 775 EXPECT_EQ(gfx::Size(7, 8), last_surface_info_.size_in_pixels()); |
| 765 } | 776 } |
| 766 | 777 |
| 767 } // namespace | 778 } // namespace |
| 768 } // namespace cc | 779 } // namespace cc |
| OLD | NEW |