Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: cc/surfaces/surface_aggregator_unittest.cc

Issue 2485473003: Remove SurfaceFactory::Create and SurfaceFactory::Destroy (Closed)
Patch Set: up Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/surfaces/surface_aggregator_perftest.cc ('k') | cc/surfaces/surface_factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_aggregator.h" 5 #include "cc/surfaces/surface_aggregator.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>
(...skipping 16 matching lines...) Expand all
27 #include "cc/test/render_pass_test_utils.h" 27 #include "cc/test/render_pass_test_utils.h"
28 #include "cc/test/surface_aggregator_test_helpers.h" 28 #include "cc/test/surface_aggregator_test_helpers.h"
29 #include "cc/test/test_shared_bitmap_manager.h" 29 #include "cc/test/test_shared_bitmap_manager.h"
30 #include "testing/gmock/include/gmock/gmock.h" 30 #include "testing/gmock/include/gmock/gmock.h"
31 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
32 #include "third_party/skia/include/core/SkColor.h" 32 #include "third_party/skia/include/core/SkColor.h"
33 33
34 namespace cc { 34 namespace cc {
35 namespace { 35 namespace {
36 36
37 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); 37 static constexpr FrameSinkId kArbitraryRootFrameSinkId(1, 1);
38 static constexpr FrameSinkId kArbitraryChildFrameSinkId(2, 2); 38 static constexpr FrameSinkId kArbitraryChildFrameSinkId(2, 2);
39 static constexpr FrameSinkId kArbitraryMiddleFrameSinkId(3, 3);
39 static const base::UnguessableToken kArbitraryToken = 40 static const base::UnguessableToken kArbitraryToken =
40 base::UnguessableToken::Create(); 41 base::UnguessableToken::Create();
41 42
42 SurfaceId InvalidSurfaceId() { 43 SurfaceId InvalidSurfaceId() {
43 static SurfaceId invalid(kArbitraryFrameSinkId, 44 static SurfaceId invalid(kArbitraryRootFrameSinkId,
44 LocalFrameId(0xdeadbeef, kArbitraryToken)); 45 LocalFrameId(0xdeadbeef, kArbitraryToken));
45 return invalid; 46 return invalid;
46 } 47 }
47 48
48 gfx::Size SurfaceSize() { 49 gfx::Size SurfaceSize() {
49 static gfx::Size size(100, 100); 50 static gfx::Size size(100, 100);
50 return size; 51 return size;
51 } 52 }
52 53
53 class EmptySurfaceFactoryClient : public SurfaceFactoryClient { 54 class EmptySurfaceFactoryClient : public SurfaceFactoryClient {
54 public: 55 public:
55 void ReturnResources(const ReturnedResourceArray& resources) override {} 56 void ReturnResources(const ReturnedResourceArray& resources) override {}
56 57
57 void WillDrawSurface(const LocalFrameId& id, 58 void WillDrawSurface(const LocalFrameId& id,
58 const gfx::Rect& damage_rect) override { 59 const gfx::Rect& damage_rect) override {
59 last_local_frame_id_ = id; 60 last_local_frame_id_ = id;
60 last_damage_rect_ = damage_rect; 61 last_damage_rect_ = damage_rect;
61 } 62 }
62 63
63 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} 64 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {}
64 65
65 gfx::Rect last_damage_rect_; 66 gfx::Rect last_damage_rect_;
66 LocalFrameId last_local_frame_id_; 67 LocalFrameId last_local_frame_id_;
67 }; 68 };
68 69
69 class SurfaceAggregatorTest : public testing::Test { 70 class SurfaceAggregatorTest : public testing::Test {
70 public: 71 public:
71 explicit SurfaceAggregatorTest(bool use_damage_rect) 72 explicit SurfaceAggregatorTest(bool use_damage_rect)
72 : factory_(kArbitraryFrameSinkId, &manager_, &empty_client_), 73 : factory_(kArbitraryRootFrameSinkId, &manager_, &empty_client_),
73 aggregator_(&manager_, NULL, use_damage_rect) {} 74 aggregator_(&manager_, NULL, use_damage_rect) {}
74 75
75 SurfaceAggregatorTest() : SurfaceAggregatorTest(false) {} 76 SurfaceAggregatorTest() : SurfaceAggregatorTest(false) {}
76 77
78 void TearDown() override {
79 factory_.EvictSurface();
80 testing::Test::TearDown();
81 }
82
77 protected: 83 protected:
78 SurfaceManager manager_; 84 SurfaceManager manager_;
79 EmptySurfaceFactoryClient empty_client_; 85 EmptySurfaceFactoryClient empty_client_;
80 SurfaceFactory factory_; 86 SurfaceFactory factory_;
81 SurfaceAggregator aggregator_; 87 SurfaceAggregator aggregator_;
82 }; 88 };
83 89
84 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) { 90 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) {
85 LocalFrameId local_frame_id(7, base::UnguessableToken::Create()); 91 LocalFrameId local_frame_id(7, base::UnguessableToken::Create());
86 SurfaceId one_id(kArbitraryFrameSinkId, local_frame_id); 92 SurfaceId one_id(kArbitraryRootFrameSinkId, local_frame_id);
87 factory_.Create(local_frame_id); 93 factory_.SubmitCompositorFrame(local_frame_id, CompositorFrame(),
94 SurfaceFactory::DrawCallback());
88 95
89 CompositorFrame frame = aggregator_.Aggregate(one_id); 96 CompositorFrame frame = aggregator_.Aggregate(one_id);
90 EXPECT_TRUE(frame.render_pass_list.empty()); 97 EXPECT_TRUE(frame.render_pass_list.empty());
91
92 factory_.Destroy(local_frame_id);
93 } 98 }
94 99
95 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest { 100 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest {
96 public: 101 public:
97 explicit SurfaceAggregatorValidSurfaceTest(bool use_damage_rect) 102 explicit SurfaceAggregatorValidSurfaceTest(bool use_damage_rect)
98 : SurfaceAggregatorTest(use_damage_rect), 103 : SurfaceAggregatorTest(use_damage_rect),
99 child_factory_(kArbitraryChildFrameSinkId, 104 child_factory_(kArbitraryChildFrameSinkId,
100 &manager_, 105 &manager_,
101 &empty_child_client_) {} 106 &empty_child_client_) {}
102 SurfaceAggregatorValidSurfaceTest() 107 SurfaceAggregatorValidSurfaceTest()
103 : SurfaceAggregatorValidSurfaceTest(false) {} 108 : SurfaceAggregatorValidSurfaceTest(false) {}
104 109
105 void SetUp() override { 110 void SetUp() override {
106 SurfaceAggregatorTest::SetUp(); 111 SurfaceAggregatorTest::SetUp();
107 root_local_frame_id_ = allocator_.GenerateId(); 112 root_local_frame_id_ = allocator_.GenerateId();
108 factory_.Create(root_local_frame_id_);
109 root_surface_ = manager_.GetSurfaceForId( 113 root_surface_ = manager_.GetSurfaceForId(
110 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_)); 114 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_));
111 } 115 }
112 116
113 void TearDown() override { 117 void TearDown() override {
114 factory_.Destroy(root_local_frame_id_); 118 child_factory_.EvictSurface();
115 SurfaceAggregatorTest::TearDown(); 119 SurfaceAggregatorTest::TearDown();
116 } 120 }
117 121
118 void AggregateAndVerify(test::Pass* expected_passes, 122 void AggregateAndVerify(test::Pass* expected_passes,
119 size_t expected_pass_count, 123 size_t expected_pass_count,
120 SurfaceId* surface_ids, 124 SurfaceId* surface_ids,
121 size_t expected_surface_count) { 125 size_t expected_surface_count) {
122 CompositorFrame aggregated_frame = aggregator_.Aggregate( 126 CompositorFrame aggregated_frame = aggregator_.Aggregate(
123 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_)); 127 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_));
124 128
(...skipping 28 matching lines...) Expand all
153 void SubmitCompositorFrame(SurfaceFactory* factory, 157 void SubmitCompositorFrame(SurfaceFactory* factory,
154 test::Pass* passes, 158 test::Pass* passes,
155 size_t pass_count, 159 size_t pass_count,
156 const LocalFrameId& local_frame_id) { 160 const LocalFrameId& local_frame_id) {
157 RenderPassList pass_list; 161 RenderPassList pass_list;
158 AddPasses(&pass_list, gfx::Rect(SurfaceSize()), passes, pass_count); 162 AddPasses(&pass_list, gfx::Rect(SurfaceSize()), passes, pass_count);
159 SubmitPassListAsFrame(factory, local_frame_id, &pass_list); 163 SubmitPassListAsFrame(factory, local_frame_id, &pass_list);
160 } 164 }
161 165
162 void QueuePassAsFrame(std::unique_ptr<RenderPass> pass, 166 void QueuePassAsFrame(std::unique_ptr<RenderPass> pass,
163 const LocalFrameId& local_frame_id) { 167 const LocalFrameId& local_frame_id,
168 SurfaceFactory* factory) {
164 CompositorFrame child_frame; 169 CompositorFrame child_frame;
165 child_frame.render_pass_list.push_back(std::move(pass)); 170 child_frame.render_pass_list.push_back(std::move(pass));
166 171
167 factory_.SubmitCompositorFrame(local_frame_id, std::move(child_frame), 172 factory->SubmitCompositorFrame(local_frame_id, std::move(child_frame),
168 SurfaceFactory::DrawCallback()); 173 SurfaceFactory::DrawCallback());
169 } 174 }
170 175
171 protected: 176 protected:
172 LocalFrameId root_local_frame_id_; 177 LocalFrameId root_local_frame_id_;
173 Surface* root_surface_; 178 Surface* root_surface_;
174 SurfaceIdAllocator allocator_; 179 SurfaceIdAllocator allocator_;
175 EmptySurfaceFactoryClient empty_child_client_; 180 EmptySurfaceFactoryClient empty_child_client_;
176 SurfaceFactory child_factory_; 181 SurfaceFactory child_factory_;
177 SurfaceIdAllocator child_allocator_; 182 SurfaceIdAllocator child_allocator_;
(...skipping 13 matching lines...) Expand all
191 SurfaceId ids[] = {root_surface_id}; 196 SurfaceId ids[] = {root_surface_id};
192 197
193 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); 198 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids));
194 199
195 // Check that WillDrawSurface was called. 200 // Check that WillDrawSurface was called.
196 EXPECT_EQ(gfx::Rect(SurfaceSize()), empty_client_.last_damage_rect_); 201 EXPECT_EQ(gfx::Rect(SurfaceSize()), empty_client_.last_damage_rect_);
197 EXPECT_EQ(root_local_frame_id_, empty_client_.last_local_frame_id_); 202 EXPECT_EQ(root_local_frame_id_, empty_client_.last_local_frame_id_);
198 } 203 }
199 204
200 TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) { 205 TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) {
206 SurfaceFactory embedded_factory(kArbitraryChildFrameSinkId, &manager_,
207 &empty_client_);
201 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); 208 LocalFrameId embedded_local_frame_id = allocator_.GenerateId();
202 SurfaceId embedded_surface_id(factory_.frame_sink_id(), 209 SurfaceId embedded_surface_id(embedded_factory.frame_sink_id(),
203 embedded_local_frame_id); 210 embedded_local_frame_id);
204 factory_.Create(embedded_local_frame_id);
205 211
206 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 212 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
207 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 213 test::Quad::SolidColorQuad(SK_ColorBLUE)};
208 test::Pass embedded_passes[] = { 214 test::Pass embedded_passes[] = {
209 test::Pass(embedded_quads, arraysize(embedded_quads))}; 215 test::Pass(embedded_quads, arraysize(embedded_quads))};
210 216
211 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), 217 SubmitCompositorFrame(&embedded_factory, embedded_passes,
212 embedded_local_frame_id); 218 arraysize(embedded_passes), embedded_local_frame_id);
213 219
214 test::Quad quads[] = {test::Quad::SurfaceQuad(embedded_surface_id, .5f)}; 220 test::Quad quads[] = {test::Quad::SurfaceQuad(embedded_surface_id, .5f)};
215 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 221 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
216 222
217 SubmitCompositorFrame(&factory_, passes, arraysize(passes), 223 SubmitCompositorFrame(&factory_, passes, arraysize(passes),
218 root_local_frame_id_); 224 root_local_frame_id_);
219 225
220 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 226 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
221 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); 227 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id);
222 228
223 RenderPassList& render_pass_list(aggregated_frame.render_pass_list); 229 RenderPassList& render_pass_list(aggregated_frame.render_pass_list);
224 ASSERT_EQ(2u, render_pass_list.size()); 230 ASSERT_EQ(2u, render_pass_list.size());
225 SharedQuadStateList& shared_quad_state_list( 231 SharedQuadStateList& shared_quad_state_list(
226 render_pass_list[0]->shared_quad_state_list); 232 render_pass_list[0]->shared_quad_state_list);
227 ASSERT_EQ(2u, shared_quad_state_list.size()); 233 ASSERT_EQ(2u, shared_quad_state_list.size());
228 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(0)->opacity); 234 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(0)->opacity);
229 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(1)->opacity); 235 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(1)->opacity);
230 236
231 SharedQuadStateList& shared_quad_state_list2( 237 SharedQuadStateList& shared_quad_state_list2(
232 render_pass_list[1]->shared_quad_state_list); 238 render_pass_list[1]->shared_quad_state_list);
233 ASSERT_EQ(1u, shared_quad_state_list2.size()); 239 ASSERT_EQ(1u, shared_quad_state_list2.size());
234 EXPECT_EQ(.5f, shared_quad_state_list2.ElementAt(0)->opacity); 240 EXPECT_EQ(.5f, shared_quad_state_list2.ElementAt(0)->opacity);
235 241
236 factory_.Destroy(embedded_local_frame_id); 242 embedded_factory.EvictSurface();
237 } 243 }
238 244
239 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSimpleFrame) { 245 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSimpleFrame) {
240 test::Quad quads[][2] = {{test::Quad::SolidColorQuad(SK_ColorWHITE), 246 test::Quad quads[][2] = {{test::Quad::SolidColorQuad(SK_ColorWHITE),
241 test::Quad::SolidColorQuad(SK_ColorLTGRAY)}, 247 test::Quad::SolidColorQuad(SK_ColorLTGRAY)},
242 {test::Quad::SolidColorQuad(SK_ColorGRAY), 248 {test::Quad::SolidColorQuad(SK_ColorGRAY),
243 test::Quad::SolidColorQuad(SK_ColorDKGRAY)}}; 249 test::Quad::SolidColorQuad(SK_ColorDKGRAY)}};
244 test::Pass passes[] = { 250 test::Pass passes[] = {
245 test::Pass(quads[0], arraysize(quads[0]), RenderPassId(1, 1)), 251 test::Pass(quads[0], arraysize(quads[0]), RenderPassId(1, 1)),
246 test::Pass(quads[1], arraysize(quads[1]), RenderPassId(1, 2))}; 252 test::Pass(quads[1], arraysize(quads[1]), RenderPassId(1, 2))};
247 253
248 SubmitCompositorFrame(&factory_, passes, arraysize(passes), 254 SubmitCompositorFrame(&factory_, passes, arraysize(passes),
249 root_local_frame_id_); 255 root_local_frame_id_);
250 256
251 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 257 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
252 SurfaceId ids[] = {root_surface_id}; 258 SurfaceId ids[] = {root_surface_id};
253 259
254 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); 260 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids));
255 } 261 }
256 262
257 // This tests very simple embedding. root_surface has a frame containing a few 263 // This tests very simple embedding. root_surface has a frame containing a few
258 // solid color quads and a surface quad referencing embedded_surface. 264 // solid color quads and a surface quad referencing embedded_surface.
259 // embedded_surface has a frame containing only a solid color quad. The solid 265 // embedded_surface has a frame containing only a solid color quad. The solid
260 // color quad should be aggregated into the final frame. 266 // color quad should be aggregated into the final frame.
261 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) { 267 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) {
268 SurfaceFactory embedded_factory(kArbitraryChildFrameSinkId, &manager_,
269 &empty_client_);
262 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); 270 LocalFrameId embedded_local_frame_id = allocator_.GenerateId();
263 SurfaceId embedded_surface_id(factory_.frame_sink_id(), 271 SurfaceId embedded_surface_id(embedded_factory.frame_sink_id(),
264 embedded_local_frame_id); 272 embedded_local_frame_id);
265 factory_.Create(embedded_local_frame_id);
266 273
267 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 274 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
268 test::Pass embedded_passes[] = { 275 test::Pass embedded_passes[] = {
269 test::Pass(embedded_quads, arraysize(embedded_quads))}; 276 test::Pass(embedded_quads, arraysize(embedded_quads))};
270 277
271 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), 278 SubmitCompositorFrame(&embedded_factory, embedded_passes,
272 embedded_local_frame_id); 279 arraysize(embedded_passes), embedded_local_frame_id);
273 280
274 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 281 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
275 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 282 test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
276 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 283 test::Quad::SolidColorQuad(SK_ColorBLACK)};
277 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; 284 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
278 285
279 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes), 286 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes),
280 root_local_frame_id_); 287 root_local_frame_id_);
281 288
282 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 289 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
283 test::Quad::SolidColorQuad(SK_ColorGREEN), 290 test::Quad::SolidColorQuad(SK_ColorGREEN),
284 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 291 test::Quad::SolidColorQuad(SK_ColorBLACK)};
285 test::Pass expected_passes[] = { 292 test::Pass expected_passes[] = {
286 test::Pass(expected_quads, arraysize(expected_quads))}; 293 test::Pass(expected_quads, arraysize(expected_quads))};
287 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 294 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
288 SurfaceId ids[] = {root_surface_id, embedded_surface_id}; 295 SurfaceId ids[] = {root_surface_id, embedded_surface_id};
289 AggregateAndVerify( 296 AggregateAndVerify(
290 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 297 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
291 298
292 factory_.Destroy(embedded_local_frame_id); 299 embedded_factory.EvictSurface();
293 } 300 }
294 301
295 TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) { 302 TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) {
303 SurfaceFactory embedded_factory(kArbitraryChildFrameSinkId, &manager_,
304 &empty_client_);
296 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); 305 LocalFrameId embedded_local_frame_id = allocator_.GenerateId();
297 SurfaceId embedded_surface_id(factory_.frame_sink_id(), 306 SurfaceId embedded_surface_id(embedded_factory.frame_sink_id(),
298 embedded_local_frame_id); 307 embedded_local_frame_id);
299 factory_.Create(embedded_local_frame_id);
300 308
301 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 309 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
302 test::Pass embedded_passes[] = { 310 test::Pass embedded_passes[] = {
303 test::Pass(embedded_quads, arraysize(embedded_quads))}; 311 test::Pass(embedded_quads, arraysize(embedded_quads))};
304 312
305 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), 313 SubmitCompositorFrame(&embedded_factory, embedded_passes,
306 embedded_local_frame_id); 314 arraysize(embedded_passes), embedded_local_frame_id);
307 std::unique_ptr<CopyOutputRequest> copy_request( 315 std::unique_ptr<CopyOutputRequest> copy_request(
308 CopyOutputRequest::CreateEmptyRequest()); 316 CopyOutputRequest::CreateEmptyRequest());
309 CopyOutputRequest* copy_request_ptr = copy_request.get(); 317 CopyOutputRequest* copy_request_ptr = copy_request.get();
310 factory_.RequestCopyOfSurface(embedded_local_frame_id, 318 embedded_factory.RequestCopyOfSurface(std::move(copy_request));
311 std::move(copy_request));
312 319
313 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 320 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
314 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 321 test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
315 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 322 test::Quad::SolidColorQuad(SK_ColorBLACK)};
316 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; 323 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
317 324
318 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes), 325 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes),
319 root_local_frame_id_); 326 root_local_frame_id_);
320 327
321 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 328 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
(...skipping 15 matching lines...) Expand all
337 344
338 SurfaceId surface_ids[] = {root_surface_id, embedded_surface_id}; 345 SurfaceId surface_ids[] = {root_surface_id, embedded_surface_id};
339 EXPECT_EQ(arraysize(surface_ids), 346 EXPECT_EQ(arraysize(surface_ids),
340 aggregator_.previous_contained_surfaces().size()); 347 aggregator_.previous_contained_surfaces().size());
341 for (size_t i = 0; i < arraysize(surface_ids); i++) { 348 for (size_t i = 0; i < arraysize(surface_ids); i++) {
342 EXPECT_TRUE( 349 EXPECT_TRUE(
343 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != 350 aggregator_.previous_contained_surfaces().find(surface_ids[i]) !=
344 aggregator_.previous_contained_surfaces().end()); 351 aggregator_.previous_contained_surfaces().end());
345 } 352 }
346 353
347 factory_.Destroy(embedded_local_frame_id); 354 embedded_factory.EvictSurface();
348 } 355 }
349 356
350 // Root surface may contain copy requests. 357 // Root surface may contain copy requests.
351 TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) { 358 TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) {
359 SurfaceFactory embedded_factory(kArbitraryChildFrameSinkId, &manager_,
360 &empty_client_);
352 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); 361 LocalFrameId embedded_local_frame_id = allocator_.GenerateId();
353 SurfaceId embedded_surface_id(factory_.frame_sink_id(), 362 SurfaceId embedded_surface_id(embedded_factory.frame_sink_id(),
354 embedded_local_frame_id); 363 embedded_local_frame_id);
355 factory_.Create(embedded_local_frame_id);
356 364
357 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 365 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
358 test::Pass embedded_passes[] = { 366 test::Pass embedded_passes[] = {
359 test::Pass(embedded_quads, arraysize(embedded_quads))}; 367 test::Pass(embedded_quads, arraysize(embedded_quads))};
360 368
361 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), 369 SubmitCompositorFrame(&embedded_factory, embedded_passes,
362 embedded_local_frame_id); 370 arraysize(embedded_passes), embedded_local_frame_id);
363 std::unique_ptr<CopyOutputRequest> copy_request( 371 std::unique_ptr<CopyOutputRequest> copy_request(
364 CopyOutputRequest::CreateEmptyRequest()); 372 CopyOutputRequest::CreateEmptyRequest());
365 CopyOutputRequest* copy_request_ptr = copy_request.get(); 373 CopyOutputRequest* copy_request_ptr = copy_request.get();
366 std::unique_ptr<CopyOutputRequest> copy_request2( 374 std::unique_ptr<CopyOutputRequest> copy_request2(
367 CopyOutputRequest::CreateEmptyRequest()); 375 CopyOutputRequest::CreateEmptyRequest());
368 CopyOutputRequest* copy_request2_ptr = copy_request2.get(); 376 CopyOutputRequest* copy_request2_ptr = copy_request2.get();
369 377
370 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 378 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
371 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 379 test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
372 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 380 test::Quad::SolidColorQuad(SK_ColorBLACK)};
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 } 423 }
416 424
417 // Ensure copy requests have been removed from root surface. 425 // Ensure copy requests have been removed from root surface.
418 const CompositorFrame& original_frame = 426 const CompositorFrame& original_frame =
419 manager_.GetSurfaceForId(root_surface_id)->GetEligibleFrame(); 427 manager_.GetSurfaceForId(root_surface_id)->GetEligibleFrame();
420 const RenderPassList& original_pass_list = original_frame.render_pass_list; 428 const RenderPassList& original_pass_list = original_frame.render_pass_list;
421 ASSERT_EQ(2u, original_pass_list.size()); 429 ASSERT_EQ(2u, original_pass_list.size());
422 DCHECK(original_pass_list[0]->copy_requests.empty()); 430 DCHECK(original_pass_list[0]->copy_requests.empty());
423 DCHECK(original_pass_list[1]->copy_requests.empty()); 431 DCHECK(original_pass_list[1]->copy_requests.empty());
424 432
425 factory_.Destroy(embedded_local_frame_id); 433 embedded_factory.EvictSurface();
426 } 434 }
427 435
428 TEST_F(SurfaceAggregatorValidSurfaceTest, UnreferencedSurface) { 436 TEST_F(SurfaceAggregatorValidSurfaceTest, UnreferencedSurface) {
437 SurfaceFactory embedded_factory(kArbitraryChildFrameSinkId, &manager_,
438 &empty_client_);
439 SurfaceFactory parent_factory(kArbitraryRootFrameSinkId, &manager_,
440 &empty_client_);
429 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); 441 LocalFrameId embedded_local_frame_id = allocator_.GenerateId();
430 SurfaceId embedded_surface_id(factory_.frame_sink_id(), 442 SurfaceId embedded_surface_id(embedded_factory.frame_sink_id(),
431 embedded_local_frame_id); 443 embedded_local_frame_id);
432 SurfaceId nonexistent_surface_id(factory_.frame_sink_id(), 444 SurfaceId nonexistent_surface_id(factory_.frame_sink_id(),
433 allocator_.GenerateId()); 445 allocator_.GenerateId());
434 factory_.Create(embedded_local_frame_id);
435 446
436 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 447 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
437 test::Pass embedded_passes[] = { 448 test::Pass embedded_passes[] = {
438 test::Pass(embedded_quads, arraysize(embedded_quads))}; 449 test::Pass(embedded_quads, arraysize(embedded_quads))};
439 450
440 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), 451 SubmitCompositorFrame(&embedded_factory, embedded_passes,
441 embedded_local_frame_id); 452 arraysize(embedded_passes), embedded_local_frame_id);
442 std::unique_ptr<CopyOutputRequest> copy_request( 453 std::unique_ptr<CopyOutputRequest> copy_request(
443 CopyOutputRequest::CreateEmptyRequest()); 454 CopyOutputRequest::CreateEmptyRequest());
444 CopyOutputRequest* copy_request_ptr = copy_request.get(); 455 CopyOutputRequest* copy_request_ptr = copy_request.get();
445 factory_.RequestCopyOfSurface(embedded_local_frame_id, 456 embedded_factory.RequestCopyOfSurface(std::move(copy_request));
446 std::move(copy_request));
447 457
448 LocalFrameId parent_local_frame_id = allocator_.GenerateId(); 458 LocalFrameId parent_local_frame_id = allocator_.GenerateId();
449 SurfaceId parent_surface_id(factory_.frame_sink_id(), parent_local_frame_id); 459 SurfaceId parent_surface_id(parent_factory.frame_sink_id(),
450 factory_.Create(parent_local_frame_id); 460 parent_local_frame_id);
451 461
452 test::Quad parent_quads[] = { 462 test::Quad parent_quads[] = {
453 test::Quad::SolidColorQuad(SK_ColorWHITE), 463 test::Quad::SolidColorQuad(SK_ColorWHITE),
454 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 464 test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
455 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 465 test::Quad::SolidColorQuad(SK_ColorBLACK)};
456 test::Pass parent_passes[] = { 466 test::Pass parent_passes[] = {
457 test::Pass(parent_quads, arraysize(parent_quads))}; 467 test::Pass(parent_quads, arraysize(parent_quads))};
458 468
459 { 469 {
460 CompositorFrame frame; 470 CompositorFrame frame;
461 471
462 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), parent_passes, 472 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), parent_passes,
463 arraysize(parent_passes)); 473 arraysize(parent_passes));
464 474
465 frame.metadata.referenced_surfaces.push_back(embedded_surface_id); 475 frame.metadata.referenced_surfaces.push_back(embedded_surface_id);
466 476
467 factory_.SubmitCompositorFrame(parent_local_frame_id, std::move(frame), 477 parent_factory.SubmitCompositorFrame(parent_local_frame_id,
468 SurfaceFactory::DrawCallback()); 478 std::move(frame),
479 SurfaceFactory::DrawCallback());
469 } 480 }
470 481
471 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 482 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
472 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 483 test::Quad::SolidColorQuad(SK_ColorBLACK)};
473 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; 484 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
474 485
475 { 486 {
476 CompositorFrame frame; 487 CompositorFrame frame;
477 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes, 488 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes,
478 arraysize(root_passes)); 489 arraysize(root_passes));
(...skipping 28 matching lines...) Expand all
507 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_), 518 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_),
508 parent_surface_id, embedded_surface_id, nonexistent_surface_id}; 519 parent_surface_id, embedded_surface_id, nonexistent_surface_id};
509 EXPECT_EQ(arraysize(surface_ids), 520 EXPECT_EQ(arraysize(surface_ids),
510 aggregator_.previous_contained_surfaces().size()); 521 aggregator_.previous_contained_surfaces().size());
511 for (size_t i = 0; i < arraysize(surface_ids); i++) { 522 for (size_t i = 0; i < arraysize(surface_ids); i++) {
512 EXPECT_TRUE( 523 EXPECT_TRUE(
513 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != 524 aggregator_.previous_contained_surfaces().find(surface_ids[i]) !=
514 aggregator_.previous_contained_surfaces().end()); 525 aggregator_.previous_contained_surfaces().end());
515 } 526 }
516 527
517 factory_.Destroy(parent_local_frame_id); 528 embedded_factory.EvictSurface();
518 factory_.Destroy(embedded_local_frame_id); 529 parent_factory.EvictSurface();
519 } 530 }
520 531
521 // This tests referencing a surface that has multiple render passes. 532 // This tests referencing a surface that has multiple render passes.
522 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { 533 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) {
523 LocalFrameId embedded_local_frame_id = child_allocator_.GenerateId(); 534 LocalFrameId embedded_local_frame_id = child_allocator_.GenerateId();
524 SurfaceId embedded_surface_id(child_factory_.frame_sink_id(), 535 SurfaceId embedded_surface_id(child_factory_.frame_sink_id(),
525 embedded_local_frame_id); 536 embedded_local_frame_id);
526 child_factory_.Create(embedded_local_frame_id);
527 537
528 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), 538 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2),
529 RenderPassId(1, 3)}; 539 RenderPassId(1, 3)};
530 540
531 test::Quad embedded_quads[][2] = { 541 test::Quad embedded_quads[][2] = {
532 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)}, 542 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)},
533 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])}, 543 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])},
534 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}}; 544 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}};
535 test::Pass embedded_passes[] = { 545 test::Pass embedded_passes[] = {
536 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]), 546 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]),
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 // The last quad in the last pass will reference the second pass from the 657 // The last quad in the last pass will reference the second pass from the
648 // root surface, which after aggregating is the fourth pass in the overall 658 // root surface, which after aggregating is the fourth pass in the overall
649 // list. 659 // list.
650 ASSERT_EQ(DrawQuad::RENDER_PASS, 660 ASSERT_EQ(DrawQuad::RENDER_PASS,
651 fifth_pass_quad_list.ElementAt(1)->material); 661 fifth_pass_quad_list.ElementAt(1)->material);
652 const RenderPassDrawQuad* fifth_pass_render_pass_draw_quad = 662 const RenderPassDrawQuad* fifth_pass_render_pass_draw_quad =
653 RenderPassDrawQuad::MaterialCast(fifth_pass_quad_list.ElementAt(1)); 663 RenderPassDrawQuad::MaterialCast(fifth_pass_quad_list.ElementAt(1));
654 EXPECT_EQ(actual_pass_ids[3], 664 EXPECT_EQ(actual_pass_ids[3],
655 fifth_pass_render_pass_draw_quad->render_pass_id); 665 fifth_pass_render_pass_draw_quad->render_pass_id);
656 } 666 }
657 child_factory_.Destroy(embedded_local_frame_id);
658 } 667 }
659 668
660 // Tests an invalid surface reference in a frame. The surface quad should just 669 // Tests an invalid surface reference in a frame. The surface quad should just
661 // be dropped. 670 // be dropped.
662 TEST_F(SurfaceAggregatorValidSurfaceTest, InvalidSurfaceReference) { 671 TEST_F(SurfaceAggregatorValidSurfaceTest, InvalidSurfaceReference) {
663 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 672 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
664 test::Quad::SurfaceQuad(InvalidSurfaceId(), 1.f), 673 test::Quad::SurfaceQuad(InvalidSurfaceId(), 1.f),
665 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 674 test::Quad::SolidColorQuad(SK_ColorBLUE)};
666 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 675 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
667 676
(...skipping 10 matching lines...) Expand all
678 AggregateAndVerify( 687 AggregateAndVerify(
679 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 688 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
680 } 689 }
681 690
682 // Tests a reference to a valid surface with no submitted frame. This quad 691 // Tests a reference to a valid surface with no submitted frame. This quad
683 // should also just be dropped. 692 // should also just be dropped.
684 TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) { 693 TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) {
685 LocalFrameId empty_local_frame_id = allocator_.GenerateId(); 694 LocalFrameId empty_local_frame_id = allocator_.GenerateId();
686 SurfaceId surface_with_no_frame_id(factory_.frame_sink_id(), 695 SurfaceId surface_with_no_frame_id(factory_.frame_sink_id(),
687 empty_local_frame_id); 696 empty_local_frame_id);
688 factory_.Create(empty_local_frame_id);
689 697
690 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 698 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
691 test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f), 699 test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f),
692 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 700 test::Quad::SolidColorQuad(SK_ColorBLUE)};
693 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 701 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
694 702
695 SubmitCompositorFrame(&factory_, passes, arraysize(passes), 703 SubmitCompositorFrame(&factory_, passes, arraysize(passes),
696 root_local_frame_id_); 704 root_local_frame_id_);
697 705
698 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 706 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
699 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 707 test::Quad::SolidColorQuad(SK_ColorBLUE)};
700 test::Pass expected_passes[] = { 708 test::Pass expected_passes[] = {
701 test::Pass(expected_quads, arraysize(expected_quads))}; 709 test::Pass(expected_quads, arraysize(expected_quads))};
702 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 710 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
703 SurfaceId ids[] = {root_surface_id, surface_with_no_frame_id}; 711 SurfaceId ids[] = {root_surface_id, surface_with_no_frame_id};
704 AggregateAndVerify( 712 AggregateAndVerify(
705 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 713 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
706 factory_.Destroy(empty_local_frame_id);
707 } 714 }
708 715
709 // Tests a surface quad referencing itself, generating a trivial cycle. 716 // Tests a surface quad referencing itself, generating a trivial cycle.
710 // The quad creating the cycle should be dropped from the final frame. 717 // The quad creating the cycle should be dropped from the final frame.
711 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleCyclicalReference) { 718 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleCyclicalReference) {
712 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 719 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
713 test::Quad quads[] = {test::Quad::SurfaceQuad(root_surface_id, 1.f), 720 test::Quad quads[] = {test::Quad::SurfaceQuad(root_surface_id, 1.f),
714 test::Quad::SolidColorQuad(SK_ColorYELLOW)}; 721 test::Quad::SolidColorQuad(SK_ColorYELLOW)};
715 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 722 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
716 723
717 SubmitCompositorFrame(&factory_, passes, arraysize(passes), 724 SubmitCompositorFrame(&factory_, passes, arraysize(passes),
718 root_local_frame_id_); 725 root_local_frame_id_);
719 726
720 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorYELLOW)}; 727 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorYELLOW)};
721 test::Pass expected_passes[] = { 728 test::Pass expected_passes[] = {
722 test::Pass(expected_quads, arraysize(expected_quads))}; 729 test::Pass(expected_quads, arraysize(expected_quads))};
723 SurfaceId ids[] = {root_surface_id}; 730 SurfaceId ids[] = {root_surface_id};
724 AggregateAndVerify( 731 AggregateAndVerify(
725 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 732 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
726 } 733 }
727 734
728 // Tests a more complex cycle with one intermediate surface. 735 // Tests a more complex cycle with one intermediate surface.
729 TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) { 736 TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) {
730 LocalFrameId child_local_frame_id = allocator_.GenerateId(); 737 LocalFrameId child_local_frame_id = allocator_.GenerateId();
731 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); 738 SurfaceId child_surface_id(child_factory_.frame_sink_id(),
732 factory_.Create(child_local_frame_id); 739 child_local_frame_id);
733 740
734 test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), 741 test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE),
735 test::Quad::SurfaceQuad(child_surface_id, 1.f), 742 test::Quad::SurfaceQuad(child_surface_id, 1.f),
736 test::Quad::SolidColorQuad(SK_ColorCYAN)}; 743 test::Quad::SolidColorQuad(SK_ColorCYAN)};
737 test::Pass parent_passes[] = { 744 test::Pass parent_passes[] = {
738 test::Pass(parent_quads, arraysize(parent_quads))}; 745 test::Pass(parent_quads, arraysize(parent_quads))};
739 746
740 SubmitCompositorFrame(&factory_, parent_passes, arraysize(parent_passes), 747 SubmitCompositorFrame(&factory_, parent_passes, arraysize(parent_passes),
741 root_local_frame_id_); 748 root_local_frame_id_);
742 749
743 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 750 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
744 test::Quad child_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 751 test::Quad child_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
745 test::Quad::SurfaceQuad(root_surface_id, 1.f), 752 test::Quad::SurfaceQuad(root_surface_id, 1.f),
746 test::Quad::SolidColorQuad(SK_ColorMAGENTA)}; 753 test::Quad::SolidColorQuad(SK_ColorMAGENTA)};
747 test::Pass child_passes[] = {test::Pass(child_quads, arraysize(child_quads))}; 754 test::Pass child_passes[] = {test::Pass(child_quads, arraysize(child_quads))};
748 755
749 SubmitCompositorFrame(&factory_, child_passes, arraysize(child_passes), 756 SubmitCompositorFrame(&child_factory_, child_passes, arraysize(child_passes),
750 child_local_frame_id); 757 child_local_frame_id);
751 758
752 // The child surface's reference to the root_surface_ will be dropped, so 759 // The child surface's reference to the root_surface_ will be dropped, so
753 // we'll end up with: 760 // we'll end up with:
754 // SK_ColorBLUE from the parent 761 // SK_ColorBLUE from the parent
755 // SK_ColorGREEN from the child 762 // SK_ColorGREEN from the child
756 // SK_ColorMAGENTA from the child 763 // SK_ColorMAGENTA from the child
757 // SK_ColorCYAN from the parent 764 // SK_ColorCYAN from the parent
758 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), 765 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE),
759 test::Quad::SolidColorQuad(SK_ColorGREEN), 766 test::Quad::SolidColorQuad(SK_ColorGREEN),
760 test::Quad::SolidColorQuad(SK_ColorMAGENTA), 767 test::Quad::SolidColorQuad(SK_ColorMAGENTA),
761 test::Quad::SolidColorQuad(SK_ColorCYAN)}; 768 test::Quad::SolidColorQuad(SK_ColorCYAN)};
762 test::Pass expected_passes[] = { 769 test::Pass expected_passes[] = {
763 test::Pass(expected_quads, arraysize(expected_quads))}; 770 test::Pass(expected_quads, arraysize(expected_quads))};
764 SurfaceId ids[] = {root_surface_id, child_surface_id}; 771 SurfaceId ids[] = {root_surface_id, child_surface_id};
765 AggregateAndVerify( 772 AggregateAndVerify(
766 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 773 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
767 factory_.Destroy(child_local_frame_id);
768 } 774 }
769 775
770 // Tests that we map render pass IDs from different surfaces into a unified 776 // Tests that we map render pass IDs from different surfaces into a unified
771 // namespace and update RenderPassDrawQuad's id references to match. 777 // namespace and update RenderPassDrawQuad's id references to match.
772 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) { 778 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) {
773 LocalFrameId child_local_frame_id = allocator_.GenerateId(); 779 LocalFrameId child_local_frame_id = allocator_.GenerateId();
774 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); 780 SurfaceId child_surface_id(child_factory_.frame_sink_id(),
775 factory_.Create(child_local_frame_id); 781 child_local_frame_id);
776 782
777 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; 783 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)};
778 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)}, 784 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)},
779 {test::Quad::RenderPassQuad(child_pass_id[0])}}; 785 {test::Quad::RenderPassQuad(child_pass_id[0])}};
780 test::Pass surface_passes[] = { 786 test::Pass surface_passes[] = {
781 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]), 787 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]),
782 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])}; 788 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])};
783 789
784 SubmitCompositorFrame(&factory_, surface_passes, arraysize(surface_passes), 790 SubmitCompositorFrame(&child_factory_, surface_passes,
785 child_local_frame_id); 791 arraysize(surface_passes), child_local_frame_id);
786 792
787 // Pass IDs from the parent surface may collide with ones from the child. 793 // Pass IDs from the parent surface may collide with ones from the child.
788 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; 794 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)};
789 test::Quad parent_quad[][1] = { 795 test::Quad parent_quad[][1] = {
790 {test::Quad::SurfaceQuad(child_surface_id, 1.f)}, 796 {test::Quad::SurfaceQuad(child_surface_id, 1.f)},
791 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; 797 {test::Quad::RenderPassQuad(parent_pass_id[0])}};
792 test::Pass parent_passes[] = { 798 test::Pass parent_passes[] = {
793 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), 799 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]),
794 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; 800 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])};
795 801
(...skipping 23 matching lines...) Expand all
819 aggregated_pass_list[2]->quad_list.front()}; 825 aggregated_pass_list[2]->quad_list.front()};
820 ASSERT_EQ(render_pass_quads[0]->material, DrawQuad::RENDER_PASS); 826 ASSERT_EQ(render_pass_quads[0]->material, DrawQuad::RENDER_PASS);
821 EXPECT_EQ( 827 EXPECT_EQ(
822 actual_pass_ids[0], 828 actual_pass_ids[0],
823 RenderPassDrawQuad::MaterialCast(render_pass_quads[0])->render_pass_id); 829 RenderPassDrawQuad::MaterialCast(render_pass_quads[0])->render_pass_id);
824 830
825 ASSERT_EQ(render_pass_quads[1]->material, DrawQuad::RENDER_PASS); 831 ASSERT_EQ(render_pass_quads[1]->material, DrawQuad::RENDER_PASS);
826 EXPECT_EQ( 832 EXPECT_EQ(
827 actual_pass_ids[1], 833 actual_pass_ids[1],
828 RenderPassDrawQuad::MaterialCast(render_pass_quads[1])->render_pass_id); 834 RenderPassDrawQuad::MaterialCast(render_pass_quads[1])->render_pass_id);
829 factory_.Destroy(child_local_frame_id);
830 } 835 }
831 836
832 void AddSolidColorQuadWithBlendMode(const gfx::Size& size, 837 void AddSolidColorQuadWithBlendMode(const gfx::Size& size,
833 RenderPass* pass, 838 RenderPass* pass,
834 const SkBlendMode blend_mode) { 839 const SkBlendMode blend_mode) {
835 const gfx::Transform layer_to_target_transform; 840 const gfx::Transform layer_to_target_transform;
836 const gfx::Size layer_bounds(size); 841 const gfx::Size layer_bounds(size);
837 const gfx::Rect visible_layer_rect(size); 842 const gfx::Rect visible_layer_rect(size);
838 const gfx::Rect clip_rect(size); 843 const gfx::Rect clip_rect(size);
839 844
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 const SkBlendMode blend_modes[] = { 888 const SkBlendMode blend_modes[] = {
884 SkBlendMode::kClear, // 0 889 SkBlendMode::kClear, // 0
885 SkBlendMode::kSrc, // 1 890 SkBlendMode::kSrc, // 1
886 SkBlendMode::kDst, // 2 891 SkBlendMode::kDst, // 2
887 SkBlendMode::kSrcOver, // 3 892 SkBlendMode::kSrcOver, // 3
888 SkBlendMode::kDstOver, // 4 893 SkBlendMode::kDstOver, // 4
889 SkBlendMode::kSrcIn, // 5 894 SkBlendMode::kSrcIn, // 5
890 SkBlendMode::kDstIn, // 6 895 SkBlendMode::kDstIn, // 6
891 }; 896 };
892 897
898 SurfaceFactory grandchild_factory(FrameSinkId(2, 2), &manager_,
899 &empty_client_);
900 SurfaceFactory child_one_factory(FrameSinkId(3, 3), &manager_,
901 &empty_client_);
902 SurfaceFactory child_two_factory(FrameSinkId(4, 4), &manager_,
903 &empty_client_);
893 RenderPassId pass_id(1, 1); 904 RenderPassId pass_id(1, 1);
894 LocalFrameId grandchild_local_frame_id = allocator_.GenerateId(); 905 LocalFrameId grandchild_local_frame_id = allocator_.GenerateId();
895 SurfaceId grandchild_surface_id(factory_.frame_sink_id(), 906 SurfaceId grandchild_surface_id(grandchild_factory.frame_sink_id(),
896 grandchild_local_frame_id); 907 grandchild_local_frame_id);
897 factory_.Create(grandchild_local_frame_id); 908 grandchild_factory.SubmitCompositorFrame(grandchild_local_frame_id,
909 CompositorFrame(),
910 SurfaceFactory::DrawCallback());
898 std::unique_ptr<RenderPass> grandchild_pass = RenderPass::Create(); 911 std::unique_ptr<RenderPass> grandchild_pass = RenderPass::Create();
899 gfx::Rect output_rect(SurfaceSize()); 912 gfx::Rect output_rect(SurfaceSize());
900 gfx::Rect damage_rect(SurfaceSize()); 913 gfx::Rect damage_rect(SurfaceSize());
901 gfx::Transform transform_to_root_target; 914 gfx::Transform transform_to_root_target;
902 grandchild_pass->SetNew( 915 grandchild_pass->SetNew(
903 pass_id, output_rect, damage_rect, transform_to_root_target); 916 pass_id, output_rect, damage_rect, transform_to_root_target);
904 AddSolidColorQuadWithBlendMode( 917 AddSolidColorQuadWithBlendMode(
905 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); 918 SurfaceSize(), grandchild_pass.get(), blend_modes[2]);
906 QueuePassAsFrame(std::move(grandchild_pass), grandchild_local_frame_id); 919 QueuePassAsFrame(std::move(grandchild_pass), grandchild_local_frame_id,
920 &grandchild_factory);
907 921
908 LocalFrameId child_one_local_frame_id = allocator_.GenerateId(); 922 LocalFrameId child_one_local_frame_id = allocator_.GenerateId();
909 SurfaceId child_one_surface_id(factory_.frame_sink_id(), 923 SurfaceId child_one_surface_id(child_one_factory.frame_sink_id(),
910 child_one_local_frame_id); 924 child_one_local_frame_id);
911 factory_.Create(child_one_local_frame_id); 925 child_one_factory.SubmitCompositorFrame(child_one_local_frame_id,
926 CompositorFrame(),
927 SurfaceFactory::DrawCallback());
912 928
913 std::unique_ptr<RenderPass> child_one_pass = RenderPass::Create(); 929 std::unique_ptr<RenderPass> child_one_pass = RenderPass::Create();
914 child_one_pass->SetNew( 930 child_one_pass->SetNew(
915 pass_id, output_rect, damage_rect, transform_to_root_target); 931 pass_id, output_rect, damage_rect, transform_to_root_target);
916 AddSolidColorQuadWithBlendMode( 932 AddSolidColorQuadWithBlendMode(
917 SurfaceSize(), child_one_pass.get(), blend_modes[1]); 933 SurfaceSize(), child_one_pass.get(), blend_modes[1]);
918 SurfaceDrawQuad* grandchild_surface_quad = 934 SurfaceDrawQuad* grandchild_surface_quad =
919 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 935 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
920 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(), 936 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(),
921 gfx::Rect(SurfaceSize()), 937 gfx::Rect(SurfaceSize()),
922 gfx::Rect(SurfaceSize()), 938 gfx::Rect(SurfaceSize()),
923 grandchild_surface_id); 939 grandchild_surface_id);
924 AddSolidColorQuadWithBlendMode( 940 AddSolidColorQuadWithBlendMode(
925 SurfaceSize(), child_one_pass.get(), blend_modes[3]); 941 SurfaceSize(), child_one_pass.get(), blend_modes[3]);
926 QueuePassAsFrame(std::move(child_one_pass), child_one_local_frame_id); 942 QueuePassAsFrame(std::move(child_one_pass), child_one_local_frame_id,
943 &child_one_factory);
927 944
928 LocalFrameId child_two_local_frame_id = allocator_.GenerateId(); 945 LocalFrameId child_two_local_frame_id = allocator_.GenerateId();
929 SurfaceId child_two_surface_id(factory_.frame_sink_id(), 946 SurfaceId child_two_surface_id(child_two_factory.frame_sink_id(),
930 child_two_local_frame_id); 947 child_two_local_frame_id);
931 factory_.Create(child_two_local_frame_id); 948 child_two_factory.SubmitCompositorFrame(child_two_local_frame_id,
949 CompositorFrame(),
950 SurfaceFactory::DrawCallback());
932 951
933 std::unique_ptr<RenderPass> child_two_pass = RenderPass::Create(); 952 std::unique_ptr<RenderPass> child_two_pass = RenderPass::Create();
934 child_two_pass->SetNew( 953 child_two_pass->SetNew(
935 pass_id, output_rect, damage_rect, transform_to_root_target); 954 pass_id, output_rect, damage_rect, transform_to_root_target);
936 AddSolidColorQuadWithBlendMode( 955 AddSolidColorQuadWithBlendMode(
937 SurfaceSize(), child_two_pass.get(), blend_modes[5]); 956 SurfaceSize(), child_two_pass.get(), blend_modes[5]);
938 QueuePassAsFrame(std::move(child_two_pass), child_two_local_frame_id); 957 QueuePassAsFrame(std::move(child_two_pass), child_two_local_frame_id,
958 &child_two_factory);
939 959
940 std::unique_ptr<RenderPass> root_pass = RenderPass::Create(); 960 std::unique_ptr<RenderPass> root_pass = RenderPass::Create();
941 root_pass->SetNew( 961 root_pass->SetNew(
942 pass_id, output_rect, damage_rect, transform_to_root_target); 962 pass_id, output_rect, damage_rect, transform_to_root_target);
943 963
944 AddSolidColorQuadWithBlendMode( 964 AddSolidColorQuadWithBlendMode(
945 SurfaceSize(), root_pass.get(), blend_modes[0]); 965 SurfaceSize(), root_pass.get(), blend_modes[0]);
946 SurfaceDrawQuad* child_one_surface_quad = 966 SurfaceDrawQuad* child_one_surface_quad =
947 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 967 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
948 child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), 968 child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(),
949 gfx::Rect(SurfaceSize()), 969 gfx::Rect(SurfaceSize()),
950 gfx::Rect(SurfaceSize()), 970 gfx::Rect(SurfaceSize()),
951 child_one_surface_id); 971 child_one_surface_id);
952 AddSolidColorQuadWithBlendMode( 972 AddSolidColorQuadWithBlendMode(
953 SurfaceSize(), root_pass.get(), blend_modes[4]); 973 SurfaceSize(), root_pass.get(), blend_modes[4]);
954 SurfaceDrawQuad* child_two_surface_quad = 974 SurfaceDrawQuad* child_two_surface_quad =
955 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 975 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
956 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), 976 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(),
957 gfx::Rect(SurfaceSize()), 977 gfx::Rect(SurfaceSize()),
958 gfx::Rect(SurfaceSize()), 978 gfx::Rect(SurfaceSize()),
959 child_two_surface_id); 979 child_two_surface_id);
960 AddSolidColorQuadWithBlendMode( 980 AddSolidColorQuadWithBlendMode(
961 SurfaceSize(), root_pass.get(), blend_modes[6]); 981 SurfaceSize(), root_pass.get(), blend_modes[6]);
962 982
963 QueuePassAsFrame(std::move(root_pass), root_local_frame_id_); 983 QueuePassAsFrame(std::move(root_pass), root_local_frame_id_, &factory_);
964 984
965 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 985 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
966 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); 986 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id);
967 987
968 const RenderPassList& aggregated_pass_list = 988 const RenderPassList& aggregated_pass_list =
969 aggregated_frame.render_pass_list; 989 aggregated_frame.render_pass_list;
970 990
971 ASSERT_EQ(1u, aggregated_pass_list.size()); 991 ASSERT_EQ(1u, aggregated_pass_list.size());
972 992
973 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list; 993 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list;
974 994
975 ASSERT_EQ(7u, aggregated_quad_list.size()); 995 ASSERT_EQ(7u, aggregated_quad_list.size());
976 996
977 for (auto iter = aggregated_quad_list.cbegin(); 997 for (auto iter = aggregated_quad_list.cbegin();
978 iter != aggregated_quad_list.cend(); 998 iter != aggregated_quad_list.cend();
979 ++iter) { 999 ++iter) {
980 EXPECT_EQ(blend_modes[iter.index()], iter->shared_quad_state->blend_mode) 1000 EXPECT_EQ(blend_modes[iter.index()], iter->shared_quad_state->blend_mode)
981 << iter.index(); 1001 << iter.index();
982 } 1002 }
983 factory_.Destroy(child_one_local_frame_id); 1003
984 factory_.Destroy(child_two_local_frame_id); 1004 grandchild_factory.EvictSurface();
985 factory_.Destroy(grandchild_local_frame_id); 1005 child_one_factory.EvictSurface();
1006 child_two_factory.EvictSurface();
986 } 1007 }
987 1008
988 // This tests that when aggregating a frame with multiple render passes that we 1009 // This tests that when aggregating a frame with multiple render passes that we
989 // map the transforms for the root pass but do not modify the transform on child 1010 // map the transforms for the root pass but do not modify the transform on child
990 // passes. 1011 // passes.
991 // 1012 //
992 // The root surface has one pass with a surface quad transformed by +10 in the y 1013 // The root surface has one pass with a surface quad transformed by +10 in the y
993 // direction. 1014 // direction.
994 // 1015 //
995 // The middle surface has one pass with a surface quad scaled by 2 in the x 1016 // The middle surface has one pass with a surface quad scaled by 2 in the x
996 // and 3 in the y directions. 1017 // and 3 in the y directions.
997 // 1018 //
998 // The child surface has two passes. The first pass has a quad with a transform 1019 // The child surface has two passes. The first pass has a quad with a transform
999 // of +5 in the x direction. The second pass has a reference to the first pass' 1020 // of +5 in the x direction. The second pass has a reference to the first pass'
1000 // pass id and a transform of +8 in the x direction. 1021 // pass id and a transform of +8 in the x direction.
1001 // 1022 //
1002 // After aggregation, the child surface's root pass quad should have all 1023 // After aggregation, the child surface's root pass quad should have all
1003 // transforms concatenated for a total transform of +23 x, +10 y. The 1024 // transforms concatenated for a total transform of +23 x, +10 y. The
1004 // contributing render pass' transform in the aggregate frame should not be 1025 // contributing render pass' transform in the aggregate frame should not be
1005 // affected. 1026 // affected.
1006 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) { 1027 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) {
1028 SurfaceFactory middle_factory(kArbitraryMiddleFrameSinkId, &manager_,
1029 &empty_client_);
1007 // Innermost child surface. 1030 // Innermost child surface.
1008 LocalFrameId child_local_frame_id = allocator_.GenerateId(); 1031 LocalFrameId child_local_frame_id = allocator_.GenerateId();
1009 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); 1032 SurfaceId child_surface_id(child_factory_.frame_sink_id(),
1010 factory_.Create(child_local_frame_id); 1033 child_local_frame_id);
1011 { 1034 {
1012 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; 1035 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)};
1013 test::Quad child_quads[][1] = { 1036 test::Quad child_quads[][1] = {
1014 {test::Quad::SolidColorQuad(SK_ColorGREEN)}, 1037 {test::Quad::SolidColorQuad(SK_ColorGREEN)},
1015 {test::Quad::RenderPassQuad(child_pass_id[0])}, 1038 {test::Quad::RenderPassQuad(child_pass_id[0])},
1016 }; 1039 };
1017 test::Pass child_passes[] = { 1040 test::Pass child_passes[] = {
1018 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]), 1041 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]),
1019 test::Pass(child_quads[1], arraysize(child_quads[1]), 1042 test::Pass(child_quads[1], arraysize(child_quads[1]),
1020 child_pass_id[1])}; 1043 child_pass_id[1])};
1021 1044
1022 CompositorFrame child_frame; 1045 CompositorFrame child_frame;
1023 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), 1046 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()),
1024 child_passes, arraysize(child_passes)); 1047 child_passes, arraysize(child_passes));
1025 1048
1026 RenderPass* child_nonroot_pass = child_frame.render_pass_list[0].get(); 1049 RenderPass* child_nonroot_pass = child_frame.render_pass_list[0].get();
1027 child_nonroot_pass->transform_to_root_target.Translate(8, 0); 1050 child_nonroot_pass->transform_to_root_target.Translate(8, 0);
1028 SharedQuadState* child_nonroot_pass_sqs = 1051 SharedQuadState* child_nonroot_pass_sqs =
1029 child_nonroot_pass->shared_quad_state_list.front(); 1052 child_nonroot_pass->shared_quad_state_list.front();
1030 child_nonroot_pass_sqs->quad_to_target_transform.Translate(5, 0); 1053 child_nonroot_pass_sqs->quad_to_target_transform.Translate(5, 0);
1031 1054
1032 RenderPass* child_root_pass = child_frame.render_pass_list[1].get(); 1055 RenderPass* child_root_pass = child_frame.render_pass_list[1].get();
1033 SharedQuadState* child_root_pass_sqs = 1056 SharedQuadState* child_root_pass_sqs =
1034 child_root_pass->shared_quad_state_list.front(); 1057 child_root_pass->shared_quad_state_list.front();
1035 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); 1058 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0);
1036 child_root_pass_sqs->is_clipped = true; 1059 child_root_pass_sqs->is_clipped = true;
1037 child_root_pass_sqs->clip_rect = gfx::Rect(0, 0, 5, 5); 1060 child_root_pass_sqs->clip_rect = gfx::Rect(0, 0, 5, 5);
1038 1061
1039 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), 1062 child_factory_.SubmitCompositorFrame(child_local_frame_id,
1040 SurfaceFactory::DrawCallback()); 1063 std::move(child_frame),
1064 SurfaceFactory::DrawCallback());
1041 } 1065 }
1042 1066
1043 // Middle child surface. 1067 // Middle child surface.
1044 LocalFrameId middle_local_frame_id = allocator_.GenerateId(); 1068 LocalFrameId middle_local_frame_id = allocator_.GenerateId();
1045 SurfaceId middle_surface_id(factory_.frame_sink_id(), middle_local_frame_id); 1069 SurfaceId middle_surface_id(middle_factory.frame_sink_id(),
1046 factory_.Create(middle_local_frame_id); 1070 middle_local_frame_id);
1047 { 1071 {
1048 test::Quad middle_quads[] = { 1072 test::Quad middle_quads[] = {
1049 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; 1073 test::Quad::SurfaceQuad(child_surface_id, 1.f)};
1050 test::Pass middle_passes[] = { 1074 test::Pass middle_passes[] = {
1051 test::Pass(middle_quads, arraysize(middle_quads)), 1075 test::Pass(middle_quads, arraysize(middle_quads)),
1052 }; 1076 };
1053 1077
1054 CompositorFrame middle_frame; 1078 CompositorFrame middle_frame;
1055 AddPasses(&middle_frame.render_pass_list, gfx::Rect(SurfaceSize()), 1079 AddPasses(&middle_frame.render_pass_list, gfx::Rect(SurfaceSize()),
1056 middle_passes, arraysize(middle_passes)); 1080 middle_passes, arraysize(middle_passes));
1057 1081
1058 RenderPass* middle_root_pass = middle_frame.render_pass_list[0].get(); 1082 RenderPass* middle_root_pass = middle_frame.render_pass_list[0].get();
1059 middle_root_pass->quad_list.ElementAt(0)->visible_rect = 1083 middle_root_pass->quad_list.ElementAt(0)->visible_rect =
1060 gfx::Rect(0, 1, 100, 7); 1084 gfx::Rect(0, 1, 100, 7);
1061 SharedQuadState* middle_root_pass_sqs = 1085 SharedQuadState* middle_root_pass_sqs =
1062 middle_root_pass->shared_quad_state_list.front(); 1086 middle_root_pass->shared_quad_state_list.front();
1063 middle_root_pass_sqs->quad_to_target_transform.Scale(2, 3); 1087 middle_root_pass_sqs->quad_to_target_transform.Scale(2, 3);
1064 1088
1065 factory_.SubmitCompositorFrame(middle_local_frame_id, 1089 middle_factory.SubmitCompositorFrame(middle_local_frame_id,
1066 std::move(middle_frame), 1090 std::move(middle_frame),
1067 SurfaceFactory::DrawCallback()); 1091 SurfaceFactory::DrawCallback());
1068 } 1092 }
1069 1093
1070 // Root surface. 1094 // Root surface.
1071 test::Quad secondary_quads[] = { 1095 test::Quad secondary_quads[] = {
1072 test::Quad::SolidColorQuad(1), 1096 test::Quad::SolidColorQuad(1),
1073 test::Quad::SurfaceQuad(middle_surface_id, 1.f)}; 1097 test::Quad::SurfaceQuad(middle_surface_id, 1.f)};
1074 test::Quad root_quads[] = {test::Quad::SolidColorQuad(1)}; 1098 test::Quad root_quads[] = {test::Quad::SolidColorQuad(1)};
1075 test::Pass root_passes[] = { 1099 test::Pass root_passes[] = {
1076 test::Pass(secondary_quads, arraysize(secondary_quads)), 1100 test::Pass(secondary_quads, arraysize(secondary_quads)),
1077 test::Pass(root_quads, arraysize(root_quads))}; 1101 test::Pass(root_quads, arraysize(root_quads))};
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 aggregated_pass_list[1]->shared_quad_state_list.ElementAt(1)->is_clipped); 1184 aggregated_pass_list[1]->shared_quad_state_list.ElementAt(1)->is_clipped);
1161 1185
1162 // The second quad in the root pass is aggregated from the child, so its 1186 // The second quad in the root pass is aggregated from the child, so its
1163 // clip rect must be transformed by the child's translation/scale and 1187 // clip rect must be transformed by the child's translation/scale and
1164 // clipped be the visible_rects for both children. 1188 // clipped be the visible_rects for both children.
1165 EXPECT_EQ(gfx::Rect(0, 13, 8, 12).ToString(), 1189 EXPECT_EQ(gfx::Rect(0, 13, 8, 12).ToString(),
1166 aggregated_pass_list[1] 1190 aggregated_pass_list[1]
1167 ->shared_quad_state_list.ElementAt(1) 1191 ->shared_quad_state_list.ElementAt(1)
1168 ->clip_rect.ToString()); 1192 ->clip_rect.ToString());
1169 1193
1170 factory_.Destroy(middle_local_frame_id); 1194 middle_factory.EvictSurface();
1171 factory_.Destroy(child_local_frame_id);
1172 } 1195 }
1173 1196
1174 // Tests that damage rects are aggregated correctly when surfaces change. 1197 // Tests that damage rects are aggregated correctly when surfaces change.
1175 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) { 1198 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) {
1199 SurfaceFactory parent_factory(kArbitraryMiddleFrameSinkId, &manager_,
1200 &empty_client_);
1176 test::Quad child_quads[] = {test::Quad::RenderPassQuad(RenderPassId(1, 1))}; 1201 test::Quad child_quads[] = {test::Quad::RenderPassQuad(RenderPassId(1, 1))};
1177 test::Pass child_passes[] = { 1202 test::Pass child_passes[] = {
1178 test::Pass(child_quads, arraysize(child_quads), RenderPassId(1, 1))}; 1203 test::Pass(child_quads, arraysize(child_quads), RenderPassId(1, 1))};
1179 1204
1180 CompositorFrame child_frame; 1205 CompositorFrame child_frame;
1181 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), 1206 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()),
1182 child_passes, arraysize(child_passes)); 1207 child_passes, arraysize(child_passes));
1183 1208
1184 RenderPass* child_root_pass = child_frame.render_pass_list[0].get(); 1209 RenderPass* child_root_pass = child_frame.render_pass_list[0].get();
1185 SharedQuadState* child_root_pass_sqs = 1210 SharedQuadState* child_root_pass_sqs =
1186 child_root_pass->shared_quad_state_list.front(); 1211 child_root_pass->shared_quad_state_list.front();
1187 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); 1212 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0);
1188 1213
1189 LocalFrameId child_local_frame_id = allocator_.GenerateId(); 1214 LocalFrameId child_local_frame_id = allocator_.GenerateId();
1190 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); 1215 SurfaceId child_surface_id(child_factory_.frame_sink_id(),
1191 factory_.Create(child_local_frame_id); 1216 child_local_frame_id);
1192 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), 1217 child_factory_.SubmitCompositorFrame(child_local_frame_id,
1193 SurfaceFactory::DrawCallback()); 1218 std::move(child_frame),
1219 SurfaceFactory::DrawCallback());
1194 1220
1195 test::Quad parent_surface_quads[] = { 1221 test::Quad parent_surface_quads[] = {
1196 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; 1222 test::Quad::SurfaceQuad(child_surface_id, 1.f)};
1197 test::Pass parent_surface_passes[] = { 1223 test::Pass parent_surface_passes[] = {
1198 test::Pass(parent_surface_quads, arraysize(parent_surface_quads), 1224 test::Pass(parent_surface_quads, arraysize(parent_surface_quads),
1199 RenderPassId(1, 1))}; 1225 RenderPassId(1, 1))};
1200 1226
1201 // Parent surface is only used to test if the transform is applied correctly 1227 // Parent surface is only used to test if the transform is applied correctly
1202 // to the child surface's damage. 1228 // to the child surface's damage.
1203 CompositorFrame parent_surface_frame; 1229 CompositorFrame parent_surface_frame;
1204 AddPasses(&parent_surface_frame.render_pass_list, gfx::Rect(SurfaceSize()), 1230 AddPasses(&parent_surface_frame.render_pass_list, gfx::Rect(SurfaceSize()),
1205 parent_surface_passes, arraysize(parent_surface_passes)); 1231 parent_surface_passes, arraysize(parent_surface_passes));
1206 1232
1207 LocalFrameId parent_local_frame_id = allocator_.GenerateId(); 1233 LocalFrameId parent_local_frame_id = allocator_.GenerateId();
1208 SurfaceId parent_surface_id(factory_.frame_sink_id(), parent_local_frame_id); 1234 SurfaceId parent_surface_id(parent_factory.frame_sink_id(),
1209 factory_.Create(parent_local_frame_id); 1235 parent_local_frame_id);
1210 factory_.SubmitCompositorFrame(parent_local_frame_id, 1236 parent_factory.SubmitCompositorFrame(parent_local_frame_id,
1211 std::move(parent_surface_frame), 1237 std::move(parent_surface_frame),
1212 SurfaceFactory::DrawCallback()); 1238 SurfaceFactory::DrawCallback());
1213 1239
1214 test::Quad root_surface_quads[] = { 1240 test::Quad root_surface_quads[] = {
1215 test::Quad::SurfaceQuad(parent_surface_id, 1.f)}; 1241 test::Quad::SurfaceQuad(parent_surface_id, 1.f)};
1216 test::Quad root_render_pass_quads[] = { 1242 test::Quad root_render_pass_quads[] = {
1217 test::Quad::RenderPassQuad(RenderPassId(1, 1))}; 1243 test::Quad::RenderPassQuad(RenderPassId(1, 1))};
1218 1244
1219 test::Pass root_passes[] = { 1245 test::Pass root_passes[] = {
1220 test::Pass(root_surface_quads, arraysize(root_surface_quads), 1246 test::Pass(root_surface_quads, arraysize(root_surface_quads),
1221 RenderPassId(1, 1)), 1247 RenderPassId(1, 1)),
1222 test::Pass(root_render_pass_quads, arraysize(root_render_pass_quads), 1248 test::Pass(root_render_pass_quads, arraysize(root_render_pass_quads),
(...skipping 28 matching lines...) Expand all
1251 CompositorFrame child_frame; 1277 CompositorFrame child_frame;
1252 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), 1278 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()),
1253 child_passes, arraysize(child_passes)); 1279 child_passes, arraysize(child_passes));
1254 1280
1255 RenderPass* child_root_pass = child_frame.render_pass_list[0].get(); 1281 RenderPass* child_root_pass = child_frame.render_pass_list[0].get();
1256 SharedQuadState* child_root_pass_sqs = 1282 SharedQuadState* child_root_pass_sqs =
1257 child_root_pass->shared_quad_state_list.front(); 1283 child_root_pass->shared_quad_state_list.front();
1258 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); 1284 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0);
1259 child_root_pass->damage_rect = gfx::Rect(10, 10, 10, 10); 1285 child_root_pass->damage_rect = gfx::Rect(10, 10, 10, 10);
1260 1286
1261 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), 1287 child_factory_.SubmitCompositorFrame(child_local_frame_id,
1262 SurfaceFactory::DrawCallback()); 1288 std::move(child_frame),
1289 SurfaceFactory::DrawCallback());
1263 1290
1264 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); 1291 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_);
1265 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); 1292 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id);
1266 1293
1267 const RenderPassList& aggregated_pass_list = 1294 const RenderPassList& aggregated_pass_list =
1268 aggregated_frame.render_pass_list; 1295 aggregated_frame.render_pass_list;
1269 1296
1270 ASSERT_EQ(2u, aggregated_pass_list.size()); 1297 ASSERT_EQ(2u, aggregated_pass_list.size());
1271 1298
1272 // Outer surface didn't change, so transformed inner damage rect should be 1299 // Outer surface didn't change, so transformed inner damage rect should be
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 1364
1338 const RenderPassList& aggregated_pass_list = 1365 const RenderPassList& aggregated_pass_list =
1339 aggregated_frame.render_pass_list; 1366 aggregated_frame.render_pass_list;
1340 1367
1341 ASSERT_EQ(2u, aggregated_pass_list.size()); 1368 ASSERT_EQ(2u, aggregated_pass_list.size());
1342 1369
1343 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains( 1370 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains(
1344 gfx::Rect(SurfaceSize()))); 1371 gfx::Rect(SurfaceSize())));
1345 } 1372 }
1346 1373
1347 factory_.Destroy(child_local_frame_id); 1374 parent_factory.EvictSurface();
1348 } 1375 }
1349 1376
1350 // Check that damage is correctly calculated for surfaces with 1377 // Check that damage is correctly calculated for surfaces.
1351 // SetPreviousFrameSurface.
1352 TEST_F(SurfaceAggregatorValidSurfaceTest, SwitchSurfaceDamage) { 1378 TEST_F(SurfaceAggregatorValidSurfaceTest, SwitchSurfaceDamage) {
1353 test::Quad root_render_pass_quads[] = {test::Quad::SolidColorQuad(1)}; 1379 test::Quad root_render_pass_quads[] = {test::Quad::SolidColorQuad(1)};
1354 1380
1355 test::Pass root_passes[] = {test::Pass(root_render_pass_quads, 1381 test::Pass root_passes[] = {test::Pass(root_render_pass_quads,
1356 arraysize(root_render_pass_quads), 1382 arraysize(root_render_pass_quads),
1357 RenderPassId(2, 1))}; 1383 RenderPassId(2, 1))};
1358 1384
1359 CompositorFrame root_frame; 1385 CompositorFrame root_frame;
1360 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes, 1386 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes,
1361 arraysize(root_passes)); 1387 arraysize(root_passes));
(...skipping 26 matching lines...) Expand all
1388 test::Pass root_passes[] = {test::Pass(root_render_pass_quads, 1414 test::Pass root_passes[] = {test::Pass(root_render_pass_quads,
1389 arraysize(root_render_pass_quads), 1415 arraysize(root_render_pass_quads),
1390 RenderPassId(2, 1))}; 1416 RenderPassId(2, 1))};
1391 1417
1392 CompositorFrame root_frame; 1418 CompositorFrame root_frame;
1393 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), 1419 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()),
1394 root_passes, arraysize(root_passes)); 1420 root_passes, arraysize(root_passes));
1395 1421
1396 root_frame.render_pass_list[0]->damage_rect = gfx::Rect(1, 2, 3, 4); 1422 root_frame.render_pass_list[0]->damage_rect = gfx::Rect(1, 2, 3, 4);
1397 1423
1398 factory_.Create(second_root_local_frame_id);
1399 factory_.SubmitCompositorFrame(second_root_local_frame_id, 1424 factory_.SubmitCompositorFrame(second_root_local_frame_id,
1400 std::move(root_frame), 1425 std::move(root_frame),
1401 SurfaceFactory::DrawCallback()); 1426 SurfaceFactory::DrawCallback());
1402 factory_.SetPreviousFrameSurface(second_root_local_frame_id,
1403 root_local_frame_id_);
1404 } 1427 }
1405 { 1428 {
1406 CompositorFrame aggregated_frame = 1429 CompositorFrame aggregated_frame =
1407 aggregator_.Aggregate(second_root_surface_id); 1430 aggregator_.Aggregate(second_root_surface_id);
1408 1431
1409 const RenderPassList& aggregated_pass_list = 1432 const RenderPassList& aggregated_pass_list =
1410 aggregated_frame.render_pass_list; 1433 aggregated_frame.render_pass_list;
1411 1434
1412 ASSERT_EQ(1u, aggregated_pass_list.size()); 1435 ASSERT_EQ(1u, aggregated_pass_list.size());
1413 1436
1414 // Frame from SetPreviousFrameSurface was aggregated last, so damage rect
1415 // from new surface should be used.
1416 EXPECT_EQ(gfx::Rect(1, 2, 3, 4), aggregated_pass_list[0]->damage_rect); 1437 EXPECT_EQ(gfx::Rect(1, 2, 3, 4), aggregated_pass_list[0]->damage_rect);
1417 } 1438 }
1418 { 1439 {
1419 CompositorFrame aggregated_frame = 1440 CompositorFrame aggregated_frame =
1420 aggregator_.Aggregate(second_root_surface_id); 1441 aggregator_.Aggregate(second_root_surface_id);
1421 1442
1422 const RenderPassList& aggregated_pass_list = 1443 const RenderPassList& aggregated_pass_list =
1423 aggregated_frame.render_pass_list; 1444 aggregated_frame.render_pass_list;
1424 1445
1425 ASSERT_EQ(1u, aggregated_pass_list.size()); 1446 ASSERT_EQ(1u, aggregated_pass_list.size());
1426 1447
1427 // No new frame, so no new damage. 1448 // No new frame, so no new damage.
1428 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty()); 1449 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty());
1429 } 1450 }
1430 factory_.Destroy(second_root_local_frame_id);
1431 } 1451 }
1432 1452
1433 class SurfaceAggregatorPartialSwapTest 1453 class SurfaceAggregatorPartialSwapTest
1434 : public SurfaceAggregatorValidSurfaceTest { 1454 : public SurfaceAggregatorValidSurfaceTest {
1435 public: 1455 public:
1436 SurfaceAggregatorPartialSwapTest() 1456 SurfaceAggregatorPartialSwapTest()
1437 : SurfaceAggregatorValidSurfaceTest(true) {} 1457 : SurfaceAggregatorValidSurfaceTest(true) {}
1438 }; 1458 };
1439 1459
1440 // Tests that quads outside the damage rect are ignored. 1460 // Tests that quads outside the damage rect are ignored.
1441 TEST_F(SurfaceAggregatorPartialSwapTest, IgnoreOutside) { 1461 TEST_F(SurfaceAggregatorPartialSwapTest, IgnoreOutside) {
1442 LocalFrameId child_local_frame_id = allocator_.GenerateId(); 1462 LocalFrameId child_local_frame_id = allocator_.GenerateId();
1443 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); 1463 SurfaceId child_surface_id(child_factory_.frame_sink_id(),
1444 factory_.Create(child_local_frame_id); 1464 child_local_frame_id);
1445 // The child surface has three quads, one with a visible rect of 13,13 4x4 and 1465 // The child surface has three quads, one with a visible rect of 13,13 4x4 and
1446 // the other other with a visible rect of 10,10 2x2 (relative to root target 1466 // the other other with a visible rect of 10,10 2x2 (relative to root target
1447 // space), and one with a non-invertible transform. 1467 // space), and one with a non-invertible transform.
1448 { 1468 {
1449 RenderPassId child_pass_id = RenderPassId(1, 1); 1469 RenderPassId child_pass_id = RenderPassId(1, 1);
1450 test::Quad child_quads1[] = {test::Quad::RenderPassQuad(child_pass_id)}; 1470 test::Quad child_quads1[] = {test::Quad::RenderPassQuad(child_pass_id)};
1451 test::Quad child_quads2[] = {test::Quad::RenderPassQuad(child_pass_id)}; 1471 test::Quad child_quads2[] = {test::Quad::RenderPassQuad(child_pass_id)};
1452 test::Quad child_quads3[] = {test::Quad::RenderPassQuad(child_pass_id)}; 1472 test::Quad child_quads3[] = {test::Quad::RenderPassQuad(child_pass_id)};
1453 test::Pass child_passes[] = { 1473 test::Pass child_passes[] = {
1454 test::Pass(child_quads1, arraysize(child_quads1), child_pass_id), 1474 test::Pass(child_quads1, arraysize(child_quads1), child_pass_id),
(...skipping 16 matching lines...) Expand all
1471 1491
1472 SharedQuadState* child_noninvertible_sqs = 1492 SharedQuadState* child_noninvertible_sqs =
1473 child_pass_list[2]->shared_quad_state_list.ElementAt(0u); 1493 child_pass_list[2]->shared_quad_state_list.ElementAt(0u);
1474 child_noninvertible_sqs->quad_to_target_transform.matrix().setDouble(0, 0, 1494 child_noninvertible_sqs->quad_to_target_transform.matrix().setDouble(0, 0,
1475 0.0); 1495 0.0);
1476 EXPECT_FALSE( 1496 EXPECT_FALSE(
1477 child_noninvertible_sqs->quad_to_target_transform.IsInvertible()); 1497 child_noninvertible_sqs->quad_to_target_transform.IsInvertible());
1478 child_pass_list[2]->quad_list.ElementAt(0)->visible_rect = 1498 child_pass_list[2]->quad_list.ElementAt(0)->visible_rect =
1479 gfx::Rect(0, 0, 2, 2); 1499 gfx::Rect(0, 0, 2, 2);
1480 1500
1481 SubmitPassListAsFrame(&factory_, child_local_frame_id, &child_pass_list); 1501 SubmitPassListAsFrame(&child_factory_, child_local_frame_id,
1502 &child_pass_list);
1482 } 1503 }
1483 1504
1484 { 1505 {
1485 test::Quad root_quads[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)}; 1506 test::Quad root_quads[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)};
1486 1507
1487 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; 1508 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
1488 1509
1489 RenderPassList root_pass_list; 1510 RenderPassList root_pass_list;
1490 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, 1511 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes,
1491 arraysize(root_passes)); 1512 arraysize(root_passes));
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 child_sqs->quad_to_target_transform.Scale(2, 2); 1590 child_sqs->quad_to_target_transform.Scale(2, 2);
1570 1591
1571 child_pass_list[1]->quad_list.ElementAt(0)->visible_rect = 1592 child_pass_list[1]->quad_list.ElementAt(0)->visible_rect =
1572 gfx::Rect(0, 0, 2, 2); 1593 gfx::Rect(0, 0, 2, 2);
1573 1594
1574 RenderPass* child_root_pass = child_pass_list[1].get(); 1595 RenderPass* child_root_pass = child_pass_list[1].get();
1575 1596
1576 child_root_pass->copy_requests.push_back( 1597 child_root_pass->copy_requests.push_back(
1577 CopyOutputRequest::CreateEmptyRequest()); 1598 CopyOutputRequest::CreateEmptyRequest());
1578 child_root_pass->damage_rect = gfx::Rect(); 1599 child_root_pass->damage_rect = gfx::Rect();
1579 SubmitPassListAsFrame(&factory_, child_local_frame_id, &child_pass_list); 1600 SubmitPassListAsFrame(&child_factory_, child_local_frame_id,
1601 &child_pass_list);
1580 } 1602 }
1581 1603
1582 { 1604 {
1583 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); 1605 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id);
1584 1606
1585 const RenderPassList& aggregated_pass_list = 1607 const RenderPassList& aggregated_pass_list =
1586 aggregated_frame.render_pass_list; 1608 aggregated_frame.render_pass_list;
1587 1609
1588 // Output frame should have no damage, but all quads included. 1610 // Output frame should have no damage, but all quads included.
1589 ASSERT_EQ(3u, aggregated_pass_list.size()); 1611 ASSERT_EQ(3u, aggregated_pass_list.size());
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 EXPECT_EQ(0u, aggregated_pass_list[0]->quad_list.size()); 1718 EXPECT_EQ(0u, aggregated_pass_list[0]->quad_list.size());
1697 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[1]->damage_rect); 1719 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[1]->damage_rect);
1698 EXPECT_EQ(1u, aggregated_pass_list[1]->quad_list.size()); 1720 EXPECT_EQ(1u, aggregated_pass_list[1]->quad_list.size());
1699 1721
1700 // First render pass draw quad is outside damage rect, so shouldn't be 1722 // First render pass draw quad is outside damage rect, so shouldn't be
1701 // drawn. SurfaceDrawQuad is after background filter, so corresponding 1723 // drawn. SurfaceDrawQuad is after background filter, so corresponding
1702 // RenderPassDrawQuad should be drawn. 1724 // RenderPassDrawQuad should be drawn.
1703 EXPECT_EQ(gfx::Rect(10, 10, 2, 2), aggregated_pass_list[2]->damage_rect); 1725 EXPECT_EQ(gfx::Rect(10, 10, 2, 2), aggregated_pass_list[2]->damage_rect);
1704 EXPECT_EQ(1u, aggregated_pass_list[2]->quad_list.size()); 1726 EXPECT_EQ(1u, aggregated_pass_list[2]->quad_list.size());
1705 } 1727 }
1706
1707 factory_.Destroy(child_local_frame_id);
1708 } 1728 }
1709 1729
1710 class SurfaceAggregatorWithResourcesTest : public testing::Test { 1730 class SurfaceAggregatorWithResourcesTest : public testing::Test {
1711 public: 1731 public:
1712 void SetUp() override { 1732 void SetUp() override {
1713 shared_bitmap_manager_.reset(new TestSharedBitmapManager); 1733 shared_bitmap_manager_.reset(new TestSharedBitmapManager);
1714 resource_provider_ = 1734 resource_provider_ =
1715 FakeResourceProvider::Create(nullptr, shared_bitmap_manager_.get()); 1735 FakeResourceProvider::Create(nullptr, shared_bitmap_manager_.get());
1716 1736
1717 aggregator_.reset( 1737 aggregator_.reset(
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 uv_bottom_right, background_color, vertex_opacity, flipped, 1809 uv_bottom_right, background_color, vertex_opacity, flipped,
1790 nearest_neighbor, secure_output_only); 1810 nearest_neighbor, secure_output_only);
1791 } 1811 }
1792 frame.render_pass_list.push_back(std::move(pass)); 1812 frame.render_pass_list.push_back(std::move(pass));
1793 factory->SubmitCompositorFrame(surface_id.local_frame_id(), std::move(frame), 1813 factory->SubmitCompositorFrame(surface_id.local_frame_id(), std::move(frame),
1794 SurfaceFactory::DrawCallback()); 1814 SurfaceFactory::DrawCallback());
1795 } 1815 }
1796 1816
1797 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) { 1817 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) {
1798 ResourceTrackingSurfaceFactoryClient client; 1818 ResourceTrackingSurfaceFactoryClient client;
1799 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); 1819 SurfaceFactory factory(kArbitraryRootFrameSinkId, &manager_, &client);
1800 LocalFrameId local_frame_id(7u, base::UnguessableToken::Create()); 1820 LocalFrameId local_frame_id(7u, base::UnguessableToken::Create());
1801 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); 1821 SurfaceId surface_id(factory.frame_sink_id(), local_frame_id);
1802 factory.Create(local_frame_id);
1803 1822
1804 ResourceId ids[] = {11, 12, 13}; 1823 ResourceId ids[] = {11, 12, 13};
1805 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1824 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1806 &factory, surface_id); 1825 &factory, surface_id);
1807 1826
1808 CompositorFrame frame = aggregator_->Aggregate(surface_id); 1827 CompositorFrame frame = aggregator_->Aggregate(surface_id);
1809 1828
1810 // Nothing should be available to be returned yet. 1829 // Nothing should be available to be returned yet.
1811 EXPECT_TRUE(client.returned_resources().empty()); 1830 EXPECT_TRUE(client.returned_resources().empty());
1812 1831
1813 SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), &factory, 1832 SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), &factory,
1814 surface_id); 1833 surface_id);
1815 1834
1816 frame = aggregator_->Aggregate(surface_id); 1835 frame = aggregator_->Aggregate(surface_id);
1817 1836
1818 ASSERT_EQ(3u, client.returned_resources().size()); 1837 ASSERT_EQ(3u, client.returned_resources().size());
1819 ResourceId returned_ids[3]; 1838 ResourceId returned_ids[3];
1820 for (size_t i = 0; i < 3; ++i) { 1839 for (size_t i = 0; i < 3; ++i) {
1821 returned_ids[i] = client.returned_resources()[i].id; 1840 returned_ids[i] = client.returned_resources()[i].id;
1822 } 1841 }
1823 EXPECT_THAT(returned_ids, 1842 EXPECT_THAT(returned_ids,
1824 testing::WhenSorted(testing::ElementsAreArray(ids))); 1843 testing::WhenSorted(testing::ElementsAreArray(ids)));
1825 factory.Destroy(local_frame_id); 1844
1845 factory.EvictSurface();
1826 } 1846 }
1827 1847
1828 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) { 1848 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) {
1829 ResourceTrackingSurfaceFactoryClient client; 1849 ResourceTrackingSurfaceFactoryClient client;
1830 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); 1850 SurfaceFactory factory(kArbitraryRootFrameSinkId, &manager_, &client);
1831 LocalFrameId local_frame_id(7u, base::UnguessableToken::Create()); 1851 LocalFrameId local_frame_id(7u, base::UnguessableToken::Create());
1832 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); 1852 SurfaceId surface_id(factory.frame_sink_id(), local_frame_id);
1833 factory.Create(local_frame_id);
1834 1853
1835 CompositorFrame frame; 1854 CompositorFrame frame;
1836 std::unique_ptr<RenderPass> pass = RenderPass::Create(); 1855 std::unique_ptr<RenderPass> pass = RenderPass::Create();
1837 pass->id = RenderPassId(1, 1); 1856 pass->id = RenderPassId(1, 1);
1838 TransferableResource resource; 1857 TransferableResource resource;
1839 resource.id = 11; 1858 resource.id = 11;
1840 // ResourceProvider is software but resource is not, so it should be 1859 // ResourceProvider is software but resource is not, so it should be
1841 // ignored. 1860 // ignored.
1842 resource.is_software = false; 1861 resource.is_software = false;
1843 frame.resource_list.push_back(resource); 1862 frame.resource_list.push_back(resource);
1844 frame.render_pass_list.push_back(std::move(pass)); 1863 frame.render_pass_list.push_back(std::move(pass));
1845 factory.SubmitCompositorFrame(local_frame_id, std::move(frame), 1864 factory.SubmitCompositorFrame(local_frame_id, std::move(frame),
1846 SurfaceFactory::DrawCallback()); 1865 SurfaceFactory::DrawCallback());
1847 1866
1848 CompositorFrame returned_frame = aggregator_->Aggregate(surface_id); 1867 CompositorFrame returned_frame = aggregator_->Aggregate(surface_id);
1849 1868
1850 // Nothing should be available to be returned yet. 1869 // Nothing should be available to be returned yet.
1851 EXPECT_TRUE(client.returned_resources().empty()); 1870 EXPECT_TRUE(client.returned_resources().empty());
1852 1871
1853 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, 1872 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory,
1854 surface_id); 1873 surface_id);
1855 ASSERT_EQ(1u, client.returned_resources().size()); 1874 ASSERT_EQ(1u, client.returned_resources().size());
1856 EXPECT_EQ(11u, client.returned_resources()[0].id); 1875 EXPECT_EQ(11u, client.returned_resources()[0].id);
1857 1876
1858 factory.Destroy(local_frame_id); 1877 factory.EvictSurface();
1859 } 1878 }
1860 1879
1861 TEST_F(SurfaceAggregatorWithResourcesTest, TwoSurfaces) { 1880 TEST_F(SurfaceAggregatorWithResourcesTest, TwoSurfaces) {
1862 ResourceTrackingSurfaceFactoryClient client; 1881 ResourceTrackingSurfaceFactoryClient client;
1863 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); 1882 SurfaceFactory factory1(FrameSinkId(1, 1), &manager_, &client);
1883 SurfaceFactory factory2(FrameSinkId(2, 2), &manager_, &client);
1864 LocalFrameId local_frame1_id(7u, base::UnguessableToken::Create()); 1884 LocalFrameId local_frame1_id(7u, base::UnguessableToken::Create());
1865 SurfaceId surface1_id(kArbitraryFrameSinkId, local_frame1_id); 1885 SurfaceId surface1_id(factory1.frame_sink_id(), local_frame1_id);
1866 factory.Create(local_frame1_id);
1867 1886
1868 LocalFrameId local_frame2_id(8u, base::UnguessableToken::Create()); 1887 LocalFrameId local_frame2_id(8u, base::UnguessableToken::Create());
1869 SurfaceId surface2_id(kArbitraryFrameSinkId, local_frame2_id); 1888 SurfaceId surface2_id(factory2.frame_sink_id(), local_frame2_id);
1870 factory.Create(local_frame2_id);
1871 1889
1872 ResourceId ids[] = {11, 12, 13}; 1890 ResourceId ids[] = {11, 12, 13};
1873 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1891 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1874 &factory, surface1_id); 1892 &factory1, surface1_id);
1875 ResourceId ids2[] = {14, 15, 16}; 1893 ResourceId ids2[] = {14, 15, 16};
1876 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), true, SurfaceId(), 1894 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), true, SurfaceId(),
1877 &factory, surface2_id); 1895 &factory2, surface2_id);
1878 1896
1879 CompositorFrame frame = aggregator_->Aggregate(surface1_id); 1897 CompositorFrame frame = aggregator_->Aggregate(surface1_id);
1880 1898
1881 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, 1899 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory1,
1882 surface1_id); 1900 surface1_id);
1883 1901
1884 // Nothing should be available to be returned yet. 1902 // Nothing should be available to be returned yet.
1885 EXPECT_TRUE(client.returned_resources().empty()); 1903 EXPECT_TRUE(client.returned_resources().empty());
1886 1904
1887 frame = aggregator_->Aggregate(surface2_id); 1905 frame = aggregator_->Aggregate(surface2_id);
1888 1906
1889 // surface1_id wasn't referenced, so its resources should be returned. 1907 // surface1_id wasn't referenced, so its resources should be returned.
1890 ASSERT_EQ(3u, client.returned_resources().size()); 1908 ASSERT_EQ(3u, client.returned_resources().size());
1891 ResourceId returned_ids[3]; 1909 ResourceId returned_ids[3];
1892 for (size_t i = 0; i < 3; ++i) { 1910 for (size_t i = 0; i < 3; ++i) {
1893 returned_ids[i] = client.returned_resources()[i].id; 1911 returned_ids[i] = client.returned_resources()[i].id;
1894 } 1912 }
1895 EXPECT_THAT(returned_ids, 1913 EXPECT_THAT(returned_ids,
1896 testing::WhenSorted(testing::ElementsAreArray(ids))); 1914 testing::WhenSorted(testing::ElementsAreArray(ids)));
1897 EXPECT_EQ(3u, resource_provider_->num_resources()); 1915 EXPECT_EQ(3u, resource_provider_->num_resources());
1898 factory.Destroy(local_frame1_id); 1916
1899 factory.Destroy(local_frame2_id); 1917 factory1.EvictSurface();
1918 factory2.EvictSurface();
1900 } 1919 }
1901 1920
1902 // Ensure that aggregator completely ignores Surfaces that reference invalid 1921 // Ensure that aggregator completely ignores Surfaces that reference invalid
1903 // resources. 1922 // resources.
1904 TEST_F(SurfaceAggregatorWithResourcesTest, InvalidChildSurface) { 1923 TEST_F(SurfaceAggregatorWithResourcesTest, InvalidChildSurface) {
1905 ResourceTrackingSurfaceFactoryClient client; 1924 ResourceTrackingSurfaceFactoryClient client;
1906 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); 1925 SurfaceFactory root_factory(kArbitraryRootFrameSinkId, &manager_, &client);
1926 SurfaceFactory middle_factory(kArbitraryMiddleFrameSinkId, &manager_,
1927 &client);
1928 SurfaceFactory child_factory(kArbitraryChildFrameSinkId, &manager_, &client);
1907 LocalFrameId root_local_frame_id(7u, kArbitraryToken); 1929 LocalFrameId root_local_frame_id(7u, kArbitraryToken);
1908 SurfaceId root_surface_id(kArbitraryFrameSinkId, root_local_frame_id); 1930 SurfaceId root_surface_id(root_factory.frame_sink_id(), root_local_frame_id);
1909 factory.Create(root_local_frame_id);
1910 LocalFrameId middle_local_frame_id(8u, kArbitraryToken); 1931 LocalFrameId middle_local_frame_id(8u, kArbitraryToken);
1911 SurfaceId middle_surface_id(kArbitraryFrameSinkId, middle_local_frame_id); 1932 SurfaceId middle_surface_id(middle_factory.frame_sink_id(),
1912 factory.Create(middle_local_frame_id); 1933 middle_local_frame_id);
1913 LocalFrameId child_local_frame_id(9u, kArbitraryToken); 1934 LocalFrameId child_local_frame_id(9u, kArbitraryToken);
1914 SurfaceId child_surface_id(kArbitraryFrameSinkId, child_local_frame_id); 1935 SurfaceId child_surface_id(child_factory.frame_sink_id(),
1915 factory.Create(child_local_frame_id); 1936 child_local_frame_id);
1916 1937
1917 ResourceId ids[] = {14, 15, 16}; 1938 ResourceId ids[] = {14, 15, 16};
1918 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1939 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1919 &factory, child_surface_id); 1940 &child_factory, child_surface_id);
1920 1941
1921 ResourceId ids2[] = {17, 18, 19}; 1942 ResourceId ids2[] = {17, 18, 19};
1922 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), false, 1943 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), false,
1923 child_surface_id, &factory, 1944 child_surface_id, &middle_factory,
1924 middle_surface_id); 1945 middle_surface_id);
1925 1946
1926 ResourceId ids3[] = {20, 21, 22}; 1947 ResourceId ids3[] = {20, 21, 22};
1927 SubmitCompositorFrameWithResources(ids3, arraysize(ids3), true, 1948 SubmitCompositorFrameWithResources(ids3, arraysize(ids3), true,
1928 middle_surface_id, &factory, 1949 middle_surface_id, &root_factory,
1929 root_surface_id); 1950 root_surface_id);
1930 1951
1931 CompositorFrame frame; 1952 CompositorFrame frame;
1932 frame = aggregator_->Aggregate(root_surface_id); 1953 frame = aggregator_->Aggregate(root_surface_id);
1933 1954
1934 RenderPassList* pass_list = &frame.render_pass_list; 1955 RenderPassList* pass_list = &frame.render_pass_list;
1935 ASSERT_EQ(1u, pass_list->size()); 1956 ASSERT_EQ(1u, pass_list->size());
1936 EXPECT_EQ(1u, pass_list->back()->shared_quad_state_list.size()); 1957 EXPECT_EQ(1u, pass_list->back()->shared_quad_state_list.size());
1937 EXPECT_EQ(3u, pass_list->back()->quad_list.size()); 1958 EXPECT_EQ(3u, pass_list->back()->quad_list.size());
1938 SubmitCompositorFrameWithResources(ids2, arraysize(ids), true, 1959 SubmitCompositorFrameWithResources(ids2, arraysize(ids), true,
1939 child_surface_id, &factory, 1960 child_surface_id, &middle_factory,
1940 middle_surface_id); 1961 middle_surface_id);
1941 1962
1942 frame = aggregator_->Aggregate(root_surface_id); 1963 frame = aggregator_->Aggregate(root_surface_id);
1943 1964
1944 pass_list = &frame.render_pass_list; 1965 pass_list = &frame.render_pass_list;
1945 ASSERT_EQ(1u, pass_list->size()); 1966 ASSERT_EQ(1u, pass_list->size());
1946 EXPECT_EQ(3u, pass_list->back()->shared_quad_state_list.size()); 1967 EXPECT_EQ(3u, pass_list->back()->shared_quad_state_list.size());
1947 EXPECT_EQ(9u, pass_list->back()->quad_list.size()); 1968 EXPECT_EQ(9u, pass_list->back()->quad_list.size());
1948 1969
1949 factory.Destroy(root_local_frame_id); 1970 root_factory.EvictSurface();
1950 factory.Destroy(child_local_frame_id); 1971 middle_factory.EvictSurface();
1951 factory.Destroy(middle_local_frame_id); 1972 child_factory.EvictSurface();
1952 } 1973 }
1953 1974
1954 TEST_F(SurfaceAggregatorWithResourcesTest, SecureOutputTexture) { 1975 TEST_F(SurfaceAggregatorWithResourcesTest, SecureOutputTexture) {
1955 ResourceTrackingSurfaceFactoryClient client; 1976 ResourceTrackingSurfaceFactoryClient client;
1956 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); 1977 SurfaceFactory factory1(FrameSinkId(1, 1), &manager_, &client);
1978 SurfaceFactory factory2(FrameSinkId(2, 2), &manager_, &client);
1957 LocalFrameId local_frame1_id(7u, base::UnguessableToken::Create()); 1979 LocalFrameId local_frame1_id(7u, base::UnguessableToken::Create());
1958 SurfaceId surface1_id(kArbitraryFrameSinkId, local_frame1_id); 1980 SurfaceId surface1_id(factory1.frame_sink_id(), local_frame1_id);
1959 factory.Create(local_frame1_id);
1960 1981
1961 LocalFrameId local_frame2_id(8u, base::UnguessableToken::Create()); 1982 LocalFrameId local_frame2_id(8u, base::UnguessableToken::Create());
1962 SurfaceId surface2_id(kArbitraryFrameSinkId, local_frame2_id); 1983 SurfaceId surface2_id(factory2.frame_sink_id(), local_frame2_id);
1963 factory.Create(local_frame2_id);
1964 1984
1965 ResourceId ids[] = {11, 12, 13}; 1985 ResourceId ids[] = {11, 12, 13};
1966 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1986 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1967 &factory, surface1_id); 1987 &factory1, surface1_id);
1968 1988
1969 CompositorFrame frame = aggregator_->Aggregate(surface1_id); 1989 CompositorFrame frame = aggregator_->Aggregate(surface1_id);
1970 1990
1971 RenderPass* render_pass = frame.render_pass_list.back().get(); 1991 RenderPass* render_pass = frame.render_pass_list.back().get();
1972 1992
1973 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, render_pass->quad_list.back()->material); 1993 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, render_pass->quad_list.back()->material);
1974 1994
1975 { 1995 {
1976 std::unique_ptr<RenderPass> pass = RenderPass::Create(); 1996 std::unique_ptr<RenderPass> pass = RenderPass::Create();
1977 pass->id = RenderPassId(1, 1); 1997 pass->id = RenderPassId(1, 1);
1978 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 1998 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
1979 sqs->opacity = 1.f; 1999 sqs->opacity = 1.f;
1980 SurfaceDrawQuad* surface_quad = 2000 SurfaceDrawQuad* surface_quad =
1981 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 2001 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
2002
1982 surface_quad->SetNew(sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), 2003 surface_quad->SetNew(sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1),
1983 surface1_id); 2004 surface1_id);
1984 pass->copy_requests.push_back(CopyOutputRequest::CreateEmptyRequest()); 2005 pass->copy_requests.push_back(CopyOutputRequest::CreateEmptyRequest());
1985 2006
1986 CompositorFrame frame; 2007 CompositorFrame frame;
1987 frame.render_pass_list.push_back(std::move(pass)); 2008 frame.render_pass_list.push_back(std::move(pass));
1988 2009
1989 factory.SubmitCompositorFrame(local_frame2_id, std::move(frame), 2010 factory2.SubmitCompositorFrame(local_frame2_id, std::move(frame),
1990 SurfaceFactory::DrawCallback()); 2011 SurfaceFactory::DrawCallback());
1991 } 2012 }
1992 2013
1993 frame = aggregator_->Aggregate(surface2_id); 2014 frame = aggregator_->Aggregate(surface2_id);
1994 EXPECT_EQ(1u, frame.render_pass_list.size()); 2015 EXPECT_EQ(1u, frame.render_pass_list.size());
1995 render_pass = frame.render_pass_list.front().get(); 2016 render_pass = frame.render_pass_list.front().get();
1996 2017
1997 // Parent has copy request, so texture should not be drawn. 2018 // Parent has copy request, so texture should not be drawn.
1998 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); 2019 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material);
1999 2020
2000 frame = aggregator_->Aggregate(surface2_id); 2021 frame = aggregator_->Aggregate(surface2_id);
2001 EXPECT_EQ(1u, frame.render_pass_list.size()); 2022 EXPECT_EQ(1u, frame.render_pass_list.size());
2002 render_pass = frame.render_pass_list.front().get(); 2023 render_pass = frame.render_pass_list.front().get();
2003 2024
2004 // Copy request has been executed earlier, so texture should be drawn. 2025 // Copy request has been executed earlier, so texture should be drawn.
2005 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, 2026 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT,
2006 render_pass->quad_list.front()->material); 2027 render_pass->quad_list.front()->material);
2007 2028
2008 aggregator_->set_output_is_secure(false); 2029 aggregator_->set_output_is_secure(false);
2009 2030
2010 frame = aggregator_->Aggregate(surface2_id); 2031 frame = aggregator_->Aggregate(surface2_id);
2011 render_pass = frame.render_pass_list.back().get(); 2032 render_pass = frame.render_pass_list.back().get();
2012 2033
2013 // Output is insecure, so texture should be drawn. 2034 // Output is insecure, so texture should be drawn.
2014 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); 2035 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material);
2015 2036
2016 factory.Destroy(local_frame1_id); 2037 factory1.EvictSurface();
2017 factory.Destroy(local_frame2_id); 2038 factory2.EvictSurface();
2018 } 2039 }
2019 2040
2020 } // namespace 2041 } // namespace
2021 } // namespace cc 2042 } // namespace cc
2022 2043
OLDNEW
« no previous file with comments | « cc/surfaces/surface_aggregator_perftest.cc ('k') | cc/surfaces/surface_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698