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

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

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