| 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/framesink_manager_client.h" |
| 19 #include "cc/surfaces/surface.h" | 20 #include "cc/surfaces/surface.h" |
| 20 #include "cc/surfaces/surface_factory_client.h" | 21 #include "cc/surfaces/surface_factory_client.h" |
| 21 #include "cc/surfaces/surface_info.h" | 22 #include "cc/surfaces/surface_info.h" |
| 22 #include "cc/surfaces/surface_manager.h" | 23 #include "cc/surfaces/surface_manager.h" |
| 24 #include "cc/surfaces/surface_resource_holder_client.h" |
| 25 #include "cc/test/fake_surface_resource_holder_client.h" |
| 23 #include "cc/test/scheduler_test_common.h" | 26 #include "cc/test/scheduler_test_common.h" |
| 27 #include "cc/test/stub_surface_factory_client.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 25 #include "ui/gfx/geometry/size.h" | 29 #include "ui/gfx/geometry/size.h" |
| 26 | 30 |
| 27 namespace cc { | 31 namespace cc { |
| 28 namespace { | 32 namespace { |
| 29 | 33 |
| 30 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 34 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
| 31 static constexpr FrameSinkId kAnotherArbitraryFrameSinkId(2, 2); | 35 static constexpr FrameSinkId kAnotherArbitraryFrameSinkId(2, 2); |
| 32 static const base::UnguessableToken kArbitraryToken = | 36 static const base::UnguessableToken kArbitraryToken = |
| 33 base::UnguessableToken::Create(); | 37 base::UnguessableToken::Create(); |
| 34 static auto kArbitrarySourceId1 = | 38 static auto kArbitrarySourceId1 = |
| 35 base::UnguessableToken::Deserialize(0xdead, 0xbeef); | 39 base::UnguessableToken::Deserialize(0xdead, 0xbeef); |
| 36 static auto kArbitrarySourceId2 = | 40 static auto kArbitrarySourceId2 = |
| 37 base::UnguessableToken::Deserialize(0xdead, 0xbee0); | 41 base::UnguessableToken::Deserialize(0xdead, 0xbee0); |
| 38 | 42 |
| 39 class TestSurfaceFactoryClient : public SurfaceFactoryClient { | |
| 40 public: | |
| 41 TestSurfaceFactoryClient() : begin_frame_source_(nullptr) {} | |
| 42 ~TestSurfaceFactoryClient() override {} | |
| 43 | |
| 44 void ReturnResources(const ReturnedResourceArray& resources) override { | |
| 45 returned_resources_.insert( | |
| 46 returned_resources_.end(), resources.begin(), resources.end()); | |
| 47 } | |
| 48 | |
| 49 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { | |
| 50 begin_frame_source_ = begin_frame_source; | |
| 51 } | |
| 52 | |
| 53 const ReturnedResourceArray& returned_resources() const { | |
| 54 return returned_resources_; | |
| 55 } | |
| 56 | |
| 57 void clear_returned_resources() { returned_resources_.clear(); } | |
| 58 | |
| 59 BeginFrameSource* begin_frame_source() const { return begin_frame_source_; } | |
| 60 | |
| 61 private: | |
| 62 ReturnedResourceArray returned_resources_; | |
| 63 BeginFrameSource* begin_frame_source_; | |
| 64 | |
| 65 DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient); | |
| 66 }; | |
| 67 | |
| 68 gpu::SyncToken GenTestSyncToken(int id) { | 43 gpu::SyncToken GenTestSyncToken(int id) { |
| 69 gpu::SyncToken token; | 44 gpu::SyncToken token; |
| 70 token.Set(gpu::CommandBufferNamespace::GPU_IO, 0, | 45 token.Set(gpu::CommandBufferNamespace::GPU_IO, 0, |
| 71 gpu::CommandBufferId::FromUnsafeValue(id), 1); | 46 gpu::CommandBufferId::FromUnsafeValue(id), 1); |
| 72 return token; | 47 return token; |
| 73 } | 48 } |
| 74 | 49 |
| 75 class SurfaceFactoryTest : public testing::Test, public SurfaceObserver { | 50 class SurfaceFactoryTest : public testing::Test, public SurfaceObserver { |
| 76 public: | 51 public: |
| 77 SurfaceFactoryTest() | 52 SurfaceFactoryTest() |
| 78 : factory_( | 53 : factory_(new SurfaceFactory(kArbitraryFrameSinkId, |
| 79 new SurfaceFactory(kArbitraryFrameSinkId, &manager_, &client_)), | 54 &manager_, |
| 55 &stub_surface_factory_client_, |
| 56 &fake_surface_resource_holder_client_)), |
| 80 local_surface_id_(3, kArbitraryToken), | 57 local_surface_id_(3, kArbitraryToken), |
| 81 frame_sync_token_(GenTestSyncToken(4)), | 58 frame_sync_token_(GenTestSyncToken(4)), |
| 82 consumer_sync_token_(GenTestSyncToken(5)) { | 59 consumer_sync_token_(GenTestSyncToken(5)) { |
| 83 manager_.AddObserver(this); | 60 manager_.AddObserver(this); |
| 84 } | 61 } |
| 85 | 62 |
| 86 const SurfaceId& last_created_surface_id() const { | 63 const SurfaceId& last_created_surface_id() const { |
| 87 return last_created_surface_id_; | 64 return last_created_surface_id_; |
| 88 } | 65 } |
| 89 | 66 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 unref_array.push_back(resource); | 108 unref_array.push_back(resource); |
| 132 } | 109 } |
| 133 factory_->UnrefResources(unref_array); | 110 factory_->UnrefResources(unref_array); |
| 134 } | 111 } |
| 135 | 112 |
| 136 void CheckReturnedResourcesMatchExpected(ResourceId* expected_returned_ids, | 113 void CheckReturnedResourcesMatchExpected(ResourceId* expected_returned_ids, |
| 137 int* expected_returned_counts, | 114 int* expected_returned_counts, |
| 138 size_t expected_resources, | 115 size_t expected_resources, |
| 139 gpu::SyncToken expected_sync_token) { | 116 gpu::SyncToken expected_sync_token) { |
| 140 const ReturnedResourceArray& actual_resources = | 117 const ReturnedResourceArray& actual_resources = |
| 141 client_.returned_resources(); | 118 fake_surface_resource_holder_client_.returned_resources(); |
| 142 ASSERT_EQ(expected_resources, actual_resources.size()); | 119 ASSERT_EQ(expected_resources, actual_resources.size()); |
| 143 for (size_t i = 0; i < expected_resources; ++i) { | 120 for (size_t i = 0; i < expected_resources; ++i) { |
| 144 ReturnedResource resource = actual_resources[i]; | 121 ReturnedResource resource = actual_resources[i]; |
| 145 EXPECT_EQ(expected_sync_token, resource.sync_token); | 122 EXPECT_EQ(expected_sync_token, resource.sync_token); |
| 146 EXPECT_EQ(expected_returned_ids[i], resource.id); | 123 EXPECT_EQ(expected_returned_ids[i], resource.id); |
| 147 EXPECT_EQ(expected_returned_counts[i], resource.count); | 124 EXPECT_EQ(expected_returned_counts[i], resource.count); |
| 148 } | 125 } |
| 149 client_.clear_returned_resources(); | 126 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 150 } | 127 } |
| 151 | 128 |
| 152 void RefCurrentFrameResources() { | 129 void RefCurrentFrameResources() { |
| 153 Surface* surface = manager_.GetSurfaceForId( | 130 Surface* surface = manager_.GetSurfaceForId( |
| 154 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); | 131 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); |
| 155 factory_->RefResources(surface->GetActiveFrame().resource_list); | 132 factory_->RefResources(surface->GetActiveFrame().resource_list); |
| 156 } | 133 } |
| 157 | 134 |
| 158 protected: | 135 protected: |
| 159 SurfaceManager manager_; | 136 SurfaceManager manager_; |
| 160 TestSurfaceFactoryClient client_; | 137 StubSurfaceFactoryClient stub_surface_factory_client_; |
| 138 FakeSurfaceResourceHolderClient fake_surface_resource_holder_client_; |
| 161 std::unique_ptr<SurfaceFactory> factory_; | 139 std::unique_ptr<SurfaceFactory> factory_; |
| 162 LocalSurfaceId local_surface_id_; | 140 LocalSurfaceId local_surface_id_; |
| 163 SurfaceId last_created_surface_id_; | 141 SurfaceId last_created_surface_id_; |
| 164 SurfaceInfo last_surface_info_; | 142 SurfaceInfo last_surface_info_; |
| 165 | 143 |
| 166 // This is the sync token submitted with the frame. It should never be | 144 // This is the sync token submitted with the frame. It should never be |
| 167 // returned to the client. | 145 // returned to the client. |
| 168 const gpu::SyncToken frame_sync_token_; | 146 const gpu::SyncToken frame_sync_token_; |
| 169 | 147 |
| 170 // This is the sync token returned by the consumer. It should always be | 148 // This is the sync token returned by the consumer. It should always be |
| 171 // returned to the client. | 149 // returned to the client. |
| 172 const gpu::SyncToken consumer_sync_token_; | 150 const gpu::SyncToken consumer_sync_token_; |
| 173 }; | 151 }; |
| 174 | 152 |
| 175 // Tests submitting a frame with resources followed by one with no resources | 153 // Tests submitting a frame with resources followed by one with no resources |
| 176 // with no resource provider action in between. | 154 // with no resource provider action in between. |
| 177 TEST_F(SurfaceFactoryTest, ResourceLifetimeSimple) { | 155 TEST_F(SurfaceFactoryTest, ResourceLifetimeSimple) { |
| 178 ResourceId first_frame_ids[] = {1, 2, 3}; | 156 ResourceId first_frame_ids[] = {1, 2, 3}; |
| 179 SubmitCompositorFrameWithResources(first_frame_ids, | 157 SubmitCompositorFrameWithResources(first_frame_ids, |
| 180 arraysize(first_frame_ids)); | 158 arraysize(first_frame_ids)); |
| 181 | 159 |
| 182 // All of the resources submitted in the first frame are still in use at this | 160 // All of the resources submitted in the first frame are still in use at this |
| 183 // time by virtue of being in the pending frame, so none can be returned to | 161 // time by virtue of being in the pending frame, so none can be returned to |
| 184 // the client yet. | 162 // the client yet. |
| 185 EXPECT_EQ(0u, client_.returned_resources().size()); | 163 EXPECT_EQ(0u, |
| 186 client_.clear_returned_resources(); | 164 fake_surface_resource_holder_client_.returned_resources().size()); |
| 165 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 187 | 166 |
| 188 // The second frame references no resources of first frame and thus should | 167 // The second frame references no resources of first frame and thus should |
| 189 // make all resources of first frame available to be returned. | 168 // make all resources of first frame available to be returned. |
| 190 SubmitCompositorFrameWithResources(NULL, 0); | 169 SubmitCompositorFrameWithResources(NULL, 0); |
| 191 | 170 |
| 192 ResourceId expected_returned_ids[] = {1, 2, 3}; | 171 ResourceId expected_returned_ids[] = {1, 2, 3}; |
| 193 int expected_returned_counts[] = {1, 1, 1}; | 172 int expected_returned_counts[] = {1, 1, 1}; |
| 194 // Resources were never consumed so no sync token should be set. | 173 // Resources were never consumed so no sync token should be set. |
| 195 CheckReturnedResourcesMatchExpected( | 174 CheckReturnedResourcesMatchExpected( |
| 196 expected_returned_ids, expected_returned_counts, | 175 expected_returned_ids, expected_returned_counts, |
| 197 arraysize(expected_returned_counts), gpu::SyncToken()); | 176 arraysize(expected_returned_counts), gpu::SyncToken()); |
| 198 | 177 |
| 199 ResourceId third_frame_ids[] = {4, 5, 6}; | 178 ResourceId third_frame_ids[] = {4, 5, 6}; |
| 200 SubmitCompositorFrameWithResources(third_frame_ids, | 179 SubmitCompositorFrameWithResources(third_frame_ids, |
| 201 arraysize(third_frame_ids)); | 180 arraysize(third_frame_ids)); |
| 202 | 181 |
| 203 // All of the resources submitted in the third frame are still in use at this | 182 // All of the resources submitted in the third frame are still in use at this |
| 204 // time by virtue of being in the pending frame, so none can be returned to | 183 // time by virtue of being in the pending frame, so none can be returned to |
| 205 // the client yet. | 184 // the client yet. |
| 206 EXPECT_EQ(0u, client_.returned_resources().size()); | 185 EXPECT_EQ(0u, |
| 207 client_.clear_returned_resources(); | 186 fake_surface_resource_holder_client_.returned_resources().size()); |
| 187 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 208 | 188 |
| 209 // The forth frame references no resources of third frame and thus should | 189 // The forth frame references no resources of third frame and thus should |
| 210 // make all resources of third frame available to be returned. | 190 // make all resources of third frame available to be returned. |
| 211 ResourceId forth_frame_ids[] = {7, 8, 9}; | 191 ResourceId forth_frame_ids[] = {7, 8, 9}; |
| 212 SubmitCompositorFrameWithResources(forth_frame_ids, | 192 SubmitCompositorFrameWithResources(forth_frame_ids, |
| 213 arraysize(forth_frame_ids)); | 193 arraysize(forth_frame_ids)); |
| 214 | 194 |
| 215 ResourceId forth_expected_returned_ids[] = {4, 5, 6}; | 195 ResourceId forth_expected_returned_ids[] = {4, 5, 6}; |
| 216 int forth_expected_returned_counts[] = {1, 1, 1}; | 196 int forth_expected_returned_counts[] = {1, 1, 1}; |
| 217 // Resources were never consumed so no sync token should be set. | 197 // Resources were never consumed so no sync token should be set. |
| 218 CheckReturnedResourcesMatchExpected( | 198 CheckReturnedResourcesMatchExpected( |
| 219 forth_expected_returned_ids, forth_expected_returned_counts, | 199 forth_expected_returned_ids, forth_expected_returned_counts, |
| 220 arraysize(forth_expected_returned_counts), gpu::SyncToken()); | 200 arraysize(forth_expected_returned_counts), gpu::SyncToken()); |
| 221 } | 201 } |
| 222 | 202 |
| 223 // Tests submitting a frame with resources followed by one with no resources | 203 // Tests submitting a frame with resources followed by one with no resources |
| 224 // with the resource provider holding everything alive. | 204 // with the resource provider holding everything alive. |
| 225 TEST_F(SurfaceFactoryTest, ResourceLifetimeSimpleWithProviderHoldingAlive) { | 205 TEST_F(SurfaceFactoryTest, ResourceLifetimeSimpleWithProviderHoldingAlive) { |
| 226 ResourceId first_frame_ids[] = {1, 2, 3}; | 206 ResourceId first_frame_ids[] = {1, 2, 3}; |
| 227 SubmitCompositorFrameWithResources(first_frame_ids, | 207 SubmitCompositorFrameWithResources(first_frame_ids, |
| 228 arraysize(first_frame_ids)); | 208 arraysize(first_frame_ids)); |
| 229 | 209 |
| 230 // All of the resources submitted in the first frame are still in use at this | 210 // All of the resources submitted in the first frame are still in use at this |
| 231 // time by virtue of being in the pending frame, so none can be returned to | 211 // time by virtue of being in the pending frame, so none can be returned to |
| 232 // the client yet. | 212 // the client yet. |
| 233 EXPECT_EQ(0u, client_.returned_resources().size()); | 213 EXPECT_EQ(0u, |
| 234 client_.clear_returned_resources(); | 214 fake_surface_resource_holder_client_.returned_resources().size()); |
| 215 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 235 | 216 |
| 236 // Hold on to everything. | 217 // Hold on to everything. |
| 237 RefCurrentFrameResources(); | 218 RefCurrentFrameResources(); |
| 238 | 219 |
| 239 // The second frame references no resources and thus should make all resources | 220 // The second frame references no resources and thus should make all resources |
| 240 // available to be returned as soon as the resource provider releases them. | 221 // available to be returned as soon as the resource provider releases them. |
| 241 SubmitCompositorFrameWithResources(NULL, 0); | 222 SubmitCompositorFrameWithResources(NULL, 0); |
| 242 | 223 |
| 243 EXPECT_EQ(0u, client_.returned_resources().size()); | 224 EXPECT_EQ(0u, |
| 244 client_.clear_returned_resources(); | 225 fake_surface_resource_holder_client_.returned_resources().size()); |
| 226 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 245 | 227 |
| 246 int release_counts[] = {1, 1, 1}; | 228 int release_counts[] = {1, 1, 1}; |
| 247 UnrefResources(first_frame_ids, release_counts, arraysize(first_frame_ids)); | 229 UnrefResources(first_frame_ids, release_counts, arraysize(first_frame_ids)); |
| 248 | 230 |
| 249 ResourceId expected_returned_ids[] = {1, 2, 3}; | 231 ResourceId expected_returned_ids[] = {1, 2, 3}; |
| 250 int expected_returned_counts[] = {1, 1, 1}; | 232 int expected_returned_counts[] = {1, 1, 1}; |
| 251 CheckReturnedResourcesMatchExpected( | 233 CheckReturnedResourcesMatchExpected( |
| 252 expected_returned_ids, expected_returned_counts, | 234 expected_returned_ids, expected_returned_counts, |
| 253 arraysize(expected_returned_counts), consumer_sync_token_); | 235 arraysize(expected_returned_counts), consumer_sync_token_); |
| 254 } | 236 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 266 // This references id 7 again. | 248 // This references id 7 again. |
| 267 SubmitCompositorFrameWithResources(first_frame_ids, | 249 SubmitCompositorFrameWithResources(first_frame_ids, |
| 268 arraysize(first_frame_ids)); | 250 arraysize(first_frame_ids)); |
| 269 | 251 |
| 270 // This removes it again. | 252 // This removes it again. |
| 271 SubmitCompositorFrameWithResources(NULL, 0); | 253 SubmitCompositorFrameWithResources(NULL, 0); |
| 272 | 254 |
| 273 // Now it should be returned. | 255 // Now it should be returned. |
| 274 // We don't care how many entries are in the returned array for 7, so long as | 256 // We don't care how many entries are in the returned array for 7, so long as |
| 275 // the total returned count matches the submitted count. | 257 // the total returned count matches the submitted count. |
| 276 const ReturnedResourceArray& returned = client_.returned_resources(); | 258 const ReturnedResourceArray& returned = |
| 259 fake_surface_resource_holder_client_.returned_resources(); |
| 277 size_t return_count = 0; | 260 size_t return_count = 0; |
| 278 for (size_t i = 0; i < returned.size(); ++i) { | 261 for (size_t i = 0; i < returned.size(); ++i) { |
| 279 EXPECT_EQ(7u, returned[i].id); | 262 EXPECT_EQ(7u, returned[i].id); |
| 280 return_count += returned[i].count; | 263 return_count += returned[i].count; |
| 281 } | 264 } |
| 282 EXPECT_EQ(2u, return_count); | 265 EXPECT_EQ(2u, return_count); |
| 283 } | 266 } |
| 284 | 267 |
| 285 // Tests having resources referenced multiple times, as if referenced by | 268 // Tests having resources referenced multiple times, as if referenced by |
| 286 // multiple providers. | 269 // multiple providers. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 299 | 282 |
| 300 // Ref resources from the second frame 3 times. | 283 // Ref resources from the second frame 3 times. |
| 301 RefCurrentFrameResources(); | 284 RefCurrentFrameResources(); |
| 302 RefCurrentFrameResources(); | 285 RefCurrentFrameResources(); |
| 303 RefCurrentFrameResources(); | 286 RefCurrentFrameResources(); |
| 304 | 287 |
| 305 // Submit a frame with no resources to remove all current frame refs from | 288 // Submit a frame with no resources to remove all current frame refs from |
| 306 // submitted resources. | 289 // submitted resources. |
| 307 SubmitCompositorFrameWithResources(NULL, 0); | 290 SubmitCompositorFrameWithResources(NULL, 0); |
| 308 | 291 |
| 309 EXPECT_EQ(0u, client_.returned_resources().size()); | 292 EXPECT_EQ(0u, |
| 310 client_.clear_returned_resources(); | 293 fake_surface_resource_holder_client_.returned_resources().size()); |
| 294 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 311 | 295 |
| 312 // Expected current refs: | 296 // Expected current refs: |
| 313 // 3 -> 2 | 297 // 3 -> 2 |
| 314 // 4 -> 2 + 3 = 5 | 298 // 4 -> 2 + 3 = 5 |
| 315 // 5 -> 3 | 299 // 5 -> 3 |
| 316 { | 300 { |
| 317 SCOPED_TRACE("unref all 3"); | 301 SCOPED_TRACE("unref all 3"); |
| 318 ResourceId ids_to_unref[] = {3, 4, 5}; | 302 ResourceId ids_to_unref[] = {3, 4, 5}; |
| 319 int counts[] = {1, 1, 1}; | 303 int counts[] = {1, 1, 1}; |
| 320 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); | 304 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); |
| 321 | 305 |
| 322 EXPECT_EQ(0u, client_.returned_resources().size()); | 306 EXPECT_EQ(0u, |
| 323 client_.clear_returned_resources(); | 307 fake_surface_resource_holder_client_.returned_resources().size()); |
| 308 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 324 | 309 |
| 325 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); | 310 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); |
| 326 | 311 |
| 327 ResourceId expected_returned_ids[] = {3}; | 312 ResourceId expected_returned_ids[] = {3}; |
| 328 int expected_returned_counts[] = {1}; | 313 int expected_returned_counts[] = {1}; |
| 329 CheckReturnedResourcesMatchExpected( | 314 CheckReturnedResourcesMatchExpected( |
| 330 expected_returned_ids, expected_returned_counts, | 315 expected_returned_ids, expected_returned_counts, |
| 331 arraysize(expected_returned_counts), consumer_sync_token_); | 316 arraysize(expected_returned_counts), consumer_sync_token_); |
| 332 } | 317 } |
| 333 | 318 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 364 } | 349 } |
| 365 | 350 |
| 366 TEST_F(SurfaceFactoryTest, ResourceLifetime) { | 351 TEST_F(SurfaceFactoryTest, ResourceLifetime) { |
| 367 ResourceId first_frame_ids[] = {1, 2, 3}; | 352 ResourceId first_frame_ids[] = {1, 2, 3}; |
| 368 SubmitCompositorFrameWithResources(first_frame_ids, | 353 SubmitCompositorFrameWithResources(first_frame_ids, |
| 369 arraysize(first_frame_ids)); | 354 arraysize(first_frame_ids)); |
| 370 | 355 |
| 371 // All of the resources submitted in the first frame are still in use at this | 356 // All of the resources submitted in the first frame are still in use at this |
| 372 // time by virtue of being in the pending frame, so none can be returned to | 357 // time by virtue of being in the pending frame, so none can be returned to |
| 373 // the client yet. | 358 // the client yet. |
| 374 EXPECT_EQ(0u, client_.returned_resources().size()); | 359 EXPECT_EQ(0u, |
| 375 client_.clear_returned_resources(); | 360 fake_surface_resource_holder_client_.returned_resources().size()); |
| 361 fake_surface_resource_holder_client_.clear_returned_resources(); |
| 376 | 362 |
| 377 // The second frame references some of the same resources, but some different | 363 // The second frame references some of the same resources, but some different |
| 378 // ones. We expect to receive back resource 1 with a count of 1 since it was | 364 // ones. We expect to receive back resource 1 with a count of 1 since it was |
| 379 // only referenced by the first frame. | 365 // only referenced by the first frame. |
| 380 ResourceId second_frame_ids[] = {2, 3, 4}; | 366 ResourceId second_frame_ids[] = {2, 3, 4}; |
| 381 SubmitCompositorFrameWithResources(second_frame_ids, | 367 SubmitCompositorFrameWithResources(second_frame_ids, |
| 382 arraysize(second_frame_ids)); | 368 arraysize(second_frame_ids)); |
| 383 | 369 |
| 384 { | 370 { |
| 385 SCOPED_TRACE("second frame"); | 371 SCOPED_TRACE("second frame"); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 407 arraysize(expected_returned_counts), gpu::SyncToken()); | 393 arraysize(expected_returned_counts), gpu::SyncToken()); |
| 408 } | 394 } |
| 409 | 395 |
| 410 // Simulate a ResourceProvider taking a ref on all of the resources. | 396 // Simulate a ResourceProvider taking a ref on all of the resources. |
| 411 RefCurrentFrameResources(); | 397 RefCurrentFrameResources(); |
| 412 | 398 |
| 413 ResourceId fourth_frame_ids[] = {12, 13}; | 399 ResourceId fourth_frame_ids[] = {12, 13}; |
| 414 SubmitCompositorFrameWithResources(fourth_frame_ids, | 400 SubmitCompositorFrameWithResources(fourth_frame_ids, |
| 415 arraysize(fourth_frame_ids)); | 401 arraysize(fourth_frame_ids)); |
| 416 | 402 |
| 417 EXPECT_EQ(0u, client_.returned_resources().size()); | 403 EXPECT_EQ(0u, |
| 404 fake_surface_resource_holder_client_.returned_resources().size()); |
| 418 | 405 |
| 419 RefCurrentFrameResources(); | 406 RefCurrentFrameResources(); |
| 420 | 407 |
| 421 // All resources are still being used by the external reference, so none can | 408 // All resources are still being used by the external reference, so none can |
| 422 // be returned to the client. | 409 // be returned to the client. |
| 423 EXPECT_EQ(0u, client_.returned_resources().size()); | 410 EXPECT_EQ(0u, |
| 411 fake_surface_resource_holder_client_.returned_resources().size()); |
| 424 | 412 |
| 425 // Release resources associated with the first RefCurrentFrameResources() call | 413 // Release resources associated with the first RefCurrentFrameResources() call |
| 426 // first. | 414 // first. |
| 427 { | 415 { |
| 428 ResourceId ids_to_unref[] = {10, 11, 12, 13}; | 416 ResourceId ids_to_unref[] = {10, 11, 12, 13}; |
| 429 int counts[] = {1, 1, 1, 1}; | 417 int counts[] = {1, 1, 1, 1}; |
| 430 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); | 418 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); |
| 431 } | 419 } |
| 432 | 420 |
| 433 { | 421 { |
| 434 SCOPED_TRACE("fourth frame, first unref"); | 422 SCOPED_TRACE("fourth frame, first unref"); |
| 435 ResourceId expected_returned_ids[] = {10, 11}; | 423 ResourceId expected_returned_ids[] = {10, 11}; |
| 436 int expected_returned_counts[] = {1, 1}; | 424 int expected_returned_counts[] = {1, 1}; |
| 437 CheckReturnedResourcesMatchExpected( | 425 CheckReturnedResourcesMatchExpected( |
| 438 expected_returned_ids, expected_returned_counts, | 426 expected_returned_ids, expected_returned_counts, |
| 439 arraysize(expected_returned_counts), consumer_sync_token_); | 427 arraysize(expected_returned_counts), consumer_sync_token_); |
| 440 } | 428 } |
| 441 | 429 |
| 442 { | 430 { |
| 443 ResourceId ids_to_unref[] = {12, 13}; | 431 ResourceId ids_to_unref[] = {12, 13}; |
| 444 int counts[] = {1, 1}; | 432 int counts[] = {1, 1}; |
| 445 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); | 433 UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); |
| 446 } | 434 } |
| 447 | 435 |
| 448 // Resources 12 and 13 are still in use by the current frame, so they | 436 // Resources 12 and 13 are still in use by the current frame, so they |
| 449 // shouldn't be available to be returned. | 437 // shouldn't be available to be returned. |
| 450 EXPECT_EQ(0u, client_.returned_resources().size()); | 438 EXPECT_EQ(0u, |
| 439 fake_surface_resource_holder_client_.returned_resources().size()); |
| 451 | 440 |
| 452 // If we submit an empty frame, however, they should become available. | 441 // If we submit an empty frame, however, they should become available. |
| 453 SubmitCompositorFrameWithResources(NULL, 0u); | 442 SubmitCompositorFrameWithResources(NULL, 0u); |
| 454 | 443 |
| 455 { | 444 { |
| 456 SCOPED_TRACE("fourth frame, second unref"); | 445 SCOPED_TRACE("fourth frame, second unref"); |
| 457 ResourceId expected_returned_ids[] = {12, 13}; | 446 ResourceId expected_returned_ids[] = {12, 13}; |
| 458 int expected_returned_counts[] = {2, 2}; | 447 int expected_returned_counts[] = {2, 2}; |
| 459 CheckReturnedResourcesMatchExpected( | 448 CheckReturnedResourcesMatchExpected( |
| 460 expected_returned_ids, expected_returned_counts, | 449 expected_returned_ids, expected_returned_counts, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 CompositorFrame frame; | 502 CompositorFrame frame; |
| 514 frame.resource_list.push_back(resource); | 503 frame.resource_list.push_back(resource); |
| 515 uint32_t execute_count = 0; | 504 uint32_t execute_count = 0; |
| 516 factory_->SubmitCompositorFrame(local_surface_id, std::move(frame), | 505 factory_->SubmitCompositorFrame(local_surface_id, std::move(frame), |
| 517 base::Bind(&DrawCallback, &execute_count), | 506 base::Bind(&DrawCallback, &execute_count), |
| 518 SurfaceFactory::WillDrawCallback()); | 507 SurfaceFactory::WillDrawCallback()); |
| 519 EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id); | 508 EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id); |
| 520 local_surface_id_ = LocalSurfaceId(); | 509 local_surface_id_ = LocalSurfaceId(); |
| 521 | 510 |
| 522 EXPECT_TRUE(manager_.GetSurfaceForId(id)); | 511 EXPECT_TRUE(manager_.GetSurfaceForId(id)); |
| 523 EXPECT_TRUE(client_.returned_resources().empty()); | 512 EXPECT_TRUE( |
| 513 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 524 factory_->EvictSurface(); | 514 factory_->EvictSurface(); |
| 525 EXPECT_FALSE(manager_.GetSurfaceForId(id)); | 515 EXPECT_FALSE(manager_.GetSurfaceForId(id)); |
| 526 EXPECT_FALSE(client_.returned_resources().empty()); | 516 EXPECT_FALSE( |
| 517 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 527 EXPECT_EQ(1u, execute_count); | 518 EXPECT_EQ(1u, execute_count); |
| 528 } | 519 } |
| 529 | 520 |
| 530 // Tests doing an EvictSurface which has unregistered dependency. | 521 // Tests doing an EvictSurface which has unregistered dependency. |
| 531 TEST_F(SurfaceFactoryTest, EvictSurfaceDependencyUnRegistered) { | 522 TEST_F(SurfaceFactoryTest, EvictSurfaceDependencyUnRegistered) { |
| 532 LocalSurfaceId local_surface_id(7, kArbitraryToken); | 523 LocalSurfaceId local_surface_id(7, kArbitraryToken); |
| 533 | 524 |
| 534 TransferableResource resource; | 525 TransferableResource resource; |
| 535 resource.id = 1; | 526 resource.id = 1; |
| 536 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; | 527 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; |
| 537 CompositorFrame frame; | 528 CompositorFrame frame; |
| 538 frame.resource_list.push_back(resource); | 529 frame.resource_list.push_back(resource); |
| 539 uint32_t execute_count = 0; | 530 uint32_t execute_count = 0; |
| 540 factory_->SubmitCompositorFrame(local_surface_id, std::move(frame), | 531 factory_->SubmitCompositorFrame(local_surface_id, std::move(frame), |
| 541 base::Bind(&DrawCallback, &execute_count), | 532 base::Bind(&DrawCallback, &execute_count), |
| 542 SurfaceFactory::WillDrawCallback()); | 533 SurfaceFactory::WillDrawCallback()); |
| 543 EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id); | 534 EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id); |
| 544 local_surface_id_ = LocalSurfaceId(); | 535 local_surface_id_ = LocalSurfaceId(); |
| 545 | 536 |
| 546 SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); | 537 SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); |
| 547 Surface* surface = manager_.GetSurfaceForId(surface_id); | 538 Surface* surface = manager_.GetSurfaceForId(surface_id); |
| 548 surface->AddDestructionDependency( | 539 surface->AddDestructionDependency( |
| 549 SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); | 540 SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); |
| 550 | 541 |
| 551 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id)); | 542 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id)); |
| 552 EXPECT_TRUE(client_.returned_resources().empty()); | 543 EXPECT_TRUE( |
| 544 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 553 factory_->EvictSurface(); | 545 factory_->EvictSurface(); |
| 554 EXPECT_FALSE(manager_.GetSurfaceForId(surface_id)); | 546 EXPECT_FALSE(manager_.GetSurfaceForId(surface_id)); |
| 555 EXPECT_FALSE(client_.returned_resources().empty()); | 547 EXPECT_FALSE( |
| 548 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 556 EXPECT_EQ(1u, execute_count); | 549 EXPECT_EQ(1u, execute_count); |
| 557 } | 550 } |
| 558 | 551 |
| 559 // Tests doing an EvictSurface which has registered dependency. | 552 // Tests doing an EvictSurface which has registered dependency. |
| 560 TEST_F(SurfaceFactoryTest, EvictSurfaceDependencyRegistered) { | 553 TEST_F(SurfaceFactoryTest, EvictSurfaceDependencyRegistered) { |
| 561 LocalSurfaceId local_surface_id(7, kArbitraryToken); | 554 LocalSurfaceId local_surface_id(7, kArbitraryToken); |
| 562 | 555 |
| 563 TransferableResource resource; | 556 TransferableResource resource; |
| 564 resource.id = 1; | 557 resource.id = 1; |
| 565 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; | 558 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; |
| 566 CompositorFrame frame; | 559 CompositorFrame frame; |
| 567 frame.resource_list.push_back(resource); | 560 frame.resource_list.push_back(resource); |
| 568 uint32_t execute_count = 0; | 561 uint32_t execute_count = 0; |
| 569 factory_->SubmitCompositorFrame(local_surface_id, std::move(frame), | 562 factory_->SubmitCompositorFrame(local_surface_id, std::move(frame), |
| 570 base::Bind(&DrawCallback, &execute_count), | 563 base::Bind(&DrawCallback, &execute_count), |
| 571 SurfaceFactory::WillDrawCallback()); | 564 SurfaceFactory::WillDrawCallback()); |
| 572 EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id); | 565 EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id); |
| 573 local_surface_id_ = LocalSurfaceId(); | 566 local_surface_id_ = LocalSurfaceId(); |
| 574 | 567 |
| 575 manager_.RegisterFrameSinkId(kAnotherArbitraryFrameSinkId); | 568 manager_.RegisterFrameSinkId(kAnotherArbitraryFrameSinkId); |
| 576 | 569 |
| 577 SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); | 570 SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); |
| 578 Surface* surface = manager_.GetSurfaceForId(surface_id); | 571 Surface* surface = manager_.GetSurfaceForId(surface_id); |
| 579 surface->AddDestructionDependency( | 572 surface->AddDestructionDependency( |
| 580 SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); | 573 SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); |
| 581 | 574 |
| 582 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id)); | 575 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id)); |
| 583 EXPECT_TRUE(client_.returned_resources().empty()); | 576 EXPECT_TRUE( |
| 577 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 584 factory_->EvictSurface(); | 578 factory_->EvictSurface(); |
| 585 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id)); | 579 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id)); |
| 586 EXPECT_TRUE(client_.returned_resources().empty()); | 580 EXPECT_TRUE( |
| 581 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 587 EXPECT_EQ(0u, execute_count); | 582 EXPECT_EQ(0u, execute_count); |
| 588 | 583 |
| 589 manager_.SatisfySequence(SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); | 584 manager_.SatisfySequence(SurfaceSequence(kAnotherArbitraryFrameSinkId, 4)); |
| 590 EXPECT_FALSE(manager_.GetSurfaceForId(surface_id)); | 585 EXPECT_FALSE(manager_.GetSurfaceForId(surface_id)); |
| 591 EXPECT_FALSE(client_.returned_resources().empty()); | 586 EXPECT_FALSE( |
| 587 fake_surface_resource_holder_client_.returned_resources().empty()); |
| 592 } | 588 } |
| 593 | 589 |
| 594 TEST_F(SurfaceFactoryTest, DestroySequence) { | 590 TEST_F(SurfaceFactoryTest, DestroySequence) { |
| 595 LocalSurfaceId local_surface_id2(5, kArbitraryToken); | 591 LocalSurfaceId local_surface_id2(5, kArbitraryToken); |
| 596 std::unique_ptr<SurfaceFactory> factory2( | 592 std::unique_ptr<SurfaceFactory> factory2(new SurfaceFactory( |
| 597 new SurfaceFactory(kArbitraryFrameSinkId, &manager_, &client_)); | 593 kArbitraryFrameSinkId, &manager_, &stub_surface_factory_client_, |
| 594 &fake_surface_resource_holder_client_)); |
| 598 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); | 595 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); |
| 599 factory2->SubmitCompositorFrame(local_surface_id2, CompositorFrame(), | 596 factory2->SubmitCompositorFrame(local_surface_id2, CompositorFrame(), |
| 600 SurfaceFactory::DrawCallback(), | 597 SurfaceFactory::DrawCallback(), |
| 601 SurfaceFactory::WillDrawCallback()); | 598 SurfaceFactory::WillDrawCallback()); |
| 602 | 599 |
| 603 manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); | 600 manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); |
| 604 | 601 |
| 605 // Check that waiting before the sequence is satisfied works. | 602 // Check that waiting before the sequence is satisfied works. |
| 606 manager_.GetSurfaceForId(id2)->AddDestructionDependency( | 603 manager_.GetSurfaceForId(id2)->AddDestructionDependency( |
| 607 SurfaceSequence(kArbitraryFrameSinkId, 4)); | 604 SurfaceSequence(kArbitraryFrameSinkId, 4)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 manager_.InvalidateFrameSinkId(frame_sink_id); | 643 manager_.InvalidateFrameSinkId(frame_sink_id); |
| 647 | 644 |
| 648 // Verify that the invalidated namespace caused the unsatisfied sequence | 645 // Verify that the invalidated namespace caused the unsatisfied sequence |
| 649 // to be ignored. | 646 // to be ignored. |
| 650 EXPECT_FALSE(manager_.GetSurfaceForId(id)); | 647 EXPECT_FALSE(manager_.GetSurfaceForId(id)); |
| 651 } | 648 } |
| 652 | 649 |
| 653 TEST_F(SurfaceFactoryTest, DestroyCycle) { | 650 TEST_F(SurfaceFactoryTest, DestroyCycle) { |
| 654 LocalSurfaceId local_surface_id2(5, kArbitraryToken); | 651 LocalSurfaceId local_surface_id2(5, kArbitraryToken); |
| 655 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); | 652 SurfaceId id2(kArbitraryFrameSinkId, local_surface_id2); |
| 656 std::unique_ptr<SurfaceFactory> factory2( | 653 std::unique_ptr<SurfaceFactory> factory2(new SurfaceFactory( |
| 657 new SurfaceFactory(kArbitraryFrameSinkId, &manager_, &client_)); | 654 kArbitraryFrameSinkId, &manager_, &stub_surface_factory_client_, |
| 655 &fake_surface_resource_holder_client_)); |
| 658 manager_.RegisterFrameSinkId(kAnotherArbitraryFrameSinkId); | 656 manager_.RegisterFrameSinkId(kAnotherArbitraryFrameSinkId); |
| 659 // Give id2 a frame that references local_surface_id_. | 657 // Give id2 a frame that references local_surface_id_. |
| 660 { | 658 { |
| 661 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); | 659 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); |
| 662 CompositorFrame frame; | 660 CompositorFrame frame; |
| 663 frame.render_pass_list.push_back(std::move(render_pass)); | 661 frame.render_pass_list.push_back(std::move(render_pass)); |
| 664 frame.metadata.referenced_surfaces.push_back( | 662 frame.metadata.referenced_surfaces.push_back( |
| 665 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); | 663 SurfaceId(factory_->frame_sink_id(), local_surface_id_)); |
| 666 factory2->SubmitCompositorFrame(local_surface_id2, std::move(frame), | 664 factory2->SubmitCompositorFrame(local_surface_id2, std::move(frame), |
| 667 SurfaceFactory::DrawCallback(), | 665 SurfaceFactory::DrawCallback(), |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 SurfaceFactory::DrawCallback(), | 771 SurfaceFactory::DrawCallback(), |
| 774 SurfaceFactory::WillDrawCallback()); | 772 SurfaceFactory::WillDrawCallback()); |
| 775 SurfaceId expected_surface_id(factory_->frame_sink_id(), local_surface_id_); | 773 SurfaceId expected_surface_id(factory_->frame_sink_id(), local_surface_id_); |
| 776 EXPECT_EQ(expected_surface_id, last_surface_info_.id()); | 774 EXPECT_EQ(expected_surface_id, last_surface_info_.id()); |
| 777 EXPECT_EQ(2.5f, last_surface_info_.device_scale_factor()); | 775 EXPECT_EQ(2.5f, last_surface_info_.device_scale_factor()); |
| 778 EXPECT_EQ(gfx::Size(7, 8), last_surface_info_.size_in_pixels()); | 776 EXPECT_EQ(gfx::Size(7, 8), last_surface_info_.size_in_pixels()); |
| 779 } | 777 } |
| 780 | 778 |
| 781 } // namespace | 779 } // namespace |
| 782 } // namespace cc | 780 } // namespace cc |
| OLD | NEW |