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

Side by Side Diff: ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm

Issue 2387653004: Mac: Fix bugs in Sierra color fix (Closed)
Patch Set: Created 4 years, 2 months 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <AVFoundation/AVFoundation.h> 5 #include <AVFoundation/AVFoundation.h>
6 #include <memory> 6 #include <memory>
7 7
8 #include "base/mac/sdk_forward_declarations.h" 8 #include "base/mac/sdk_forward_declarations.h"
9 #include "gpu/GLES2/gl2extchromium.h" 9 #include "gpu/GLES2/gl2extchromium.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 21 matching lines...) Expand all
32 int sorting_context_id = 0; 32 int sorting_context_id = 0;
33 gfx::Transform transform; 33 gfx::Transform transform;
34 gfx::RectF contents_rect = gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f); 34 gfx::RectF contents_rect = gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f);
35 gfx::Rect rect = gfx::Rect(0, 0, 256, 256); 35 gfx::Rect rect = gfx::Rect(0, 0, 256, 256);
36 unsigned background_color = SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF); 36 unsigned background_color = SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF);
37 unsigned edge_aa_mask = 0; 37 unsigned edge_aa_mask = 0;
38 float opacity = 1.0f; 38 float opacity = 1.0f;
39 float scale_factor = 1.0f; 39 float scale_factor = 1.0f;
40 unsigned filter = GL_LINEAR; 40 unsigned filter = GL_LINEAR;
41 scoped_refptr<gl::GLImageIOSurface> gl_image; 41 scoped_refptr<gl::GLImageIOSurface> gl_image;
42
43 bool allow_av_layers = true;
44 bool allow_solid_color_layers = true;
42 }; 45 };
43 46
44 scoped_refptr<gl::GLImageIOSurface> CreateGLImage(const gfx::Size& size, 47 scoped_refptr<gl::GLImageIOSurface> CreateGLImage(const gfx::Size& size,
45 gfx::BufferFormat format, 48 gfx::BufferFormat format,
46 bool video) { 49 bool video) {
47 scoped_refptr<gl::GLImageIOSurface> gl_image( 50 scoped_refptr<gl::GLImageIOSurface> gl_image(
48 new gl::GLImageIOSurface(size, GL_RGBA)); 51 new gl::GLImageIOSurface(size, GL_RGBA));
49 base::ScopedCFTypeRef<IOSurfaceRef> io_surface( 52 base::ScopedCFTypeRef<IOSurfaceRef> io_surface(
50 gfx::CreateIOSurface(size, format)); 53 gfx::CreateIOSurface(size, format));
51 if (video) { 54 if (video) {
(...skipping 15 matching lines...) Expand all
67 properties->sorting_context_id, properties->transform, 70 properties->sorting_context_id, properties->transform,
68 properties->gl_image.get(), properties->contents_rect, properties->rect, 71 properties->gl_image.get(), properties->contents_rect, properties->rect,
69 properties->background_color, properties->edge_aa_mask, 72 properties->background_color, properties->edge_aa_mask,
70 properties->opacity, properties->filter)); 73 properties->opacity, properties->filter));
71 } 74 }
72 75
73 void UpdateCALayerTree(std::unique_ptr<ui::CARendererLayerTree>& ca_layer_tree, 76 void UpdateCALayerTree(std::unique_ptr<ui::CARendererLayerTree>& ca_layer_tree,
74 CALayerProperties* properties, 77 CALayerProperties* properties,
75 CALayer* superlayer) { 78 CALayer* superlayer) {
76 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( 79 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
77 new ui::CARendererLayerTree(true)); 80 new ui::CARendererLayerTree(properties->allow_av_layers,
81 properties->allow_solid_color_layers));
78 bool result = ScheduleCALayer(new_ca_layer_tree.get(), properties); 82 bool result = ScheduleCALayer(new_ca_layer_tree.get(), properties);
79 EXPECT_TRUE(result); 83 EXPECT_TRUE(result);
80 new_ca_layer_tree->CommitScheduledCALayers( 84 new_ca_layer_tree->CommitScheduledCALayers(
81 superlayer, std::move(ca_layer_tree), properties->scale_factor);
82 std::swap(new_ca_layer_tree, ca_layer_tree);
83 }
84
85 void UpdateCALayerTreeWithAVDisabled(
86 std::unique_ptr<ui::CARendererLayerTree>& ca_layer_tree,
87 CALayerProperties* properties,
88 CALayer* superlayer) {
89 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
90 new ui::CARendererLayerTree(false));
91 bool result = ScheduleCALayer(new_ca_layer_tree.get(), properties);
92 EXPECT_TRUE(result);
93 new_ca_layer_tree->CommitScheduledCALayers(
94 superlayer, std::move(ca_layer_tree), properties->scale_factor); 85 superlayer, std::move(ca_layer_tree), properties->scale_factor);
95 std::swap(new_ca_layer_tree, ca_layer_tree); 86 std::swap(new_ca_layer_tree, ca_layer_tree);
96 } 87 }
97 88
98 } // namespace 89 } // namespace
99 90
100 class CALayerTreeTest : public testing::Test { 91 class CALayerTreeTest : public testing::Test {
101 protected: 92 protected:
102 void SetUp() override { 93 void SetUp() override {
103 superlayer_.reset([[CALayer alloc] init]); 94 superlayer_.reset([[CALayer alloc] init]);
104 fullscreen_low_power_layer_.reset( 95 fullscreen_low_power_layer_.reset(
105 [[AVSampleBufferDisplayLayer alloc] init]); 96 [[AVSampleBufferDisplayLayer alloc] init]);
106 } 97 }
107 98
108 base::scoped_nsobject<CALayer> superlayer_; 99 base::scoped_nsobject<CALayer> superlayer_;
109 base::scoped_nsobject<AVSampleBufferDisplayLayer> fullscreen_low_power_layer_; 100 base::scoped_nsobject<AVSampleBufferDisplayLayer> fullscreen_low_power_layer_;
110 }; 101 };
111 102
112 // Test updating each layer's properties. 103 // Test updating each layer's properties.
113 TEST_F(CALayerTreeTest, PropertyUpdates) { 104 class CALayerTreePropertyUpdatesTest : public CALayerTreeTest {
114 CALayerProperties properties; 105 public:
115 properties.clip_rect = gfx::Rect(2, 4, 8, 16); 106 void RunTest(bool allow_solid_color_layers) {
116 properties.transform.Translate(10, 20); 107 CALayerProperties properties;
117 properties.contents_rect = gfx::RectF(0.0f, 0.25f, 0.5f, 0.75f); 108 properties.allow_solid_color_layers = allow_solid_color_layers;
118 properties.rect = gfx::Rect(16, 32, 64, 128); 109 properties.clip_rect = gfx::Rect(2, 4, 8, 16);
119 properties.background_color = SkColorSetARGB(0xFF, 0xFF, 0, 0); 110 properties.transform.Translate(10, 20);
120 properties.edge_aa_mask = GL_CA_LAYER_EDGE_LEFT_CHROMIUM; 111 properties.contents_rect = gfx::RectF(0.0f, 0.25f, 0.5f, 0.75f);
121 properties.opacity = 0.5f; 112 properties.rect = gfx::Rect(16, 32, 64, 128);
122 properties.gl_image = 113 properties.background_color = SkColorSetARGB(0xFF, 0xFF, 0, 0);
123 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false); 114 properties.edge_aa_mask = GL_CA_LAYER_EDGE_LEFT_CHROMIUM;
124 115 properties.opacity = 0.5f;
125 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree;
126 CALayer* root_layer = nil;
127 CALayer* clip_and_sorting_layer = nil;
128 CALayer* transform_layer = nil;
129 CALayer* content_layer = nil;
130
131 // Validate the initial values.
132 {
133 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
134 new ui::CARendererLayerTree(true));
135
136 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
137
138 // Validate the tree structure.
139 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
140 root_layer = [[superlayer_ sublayers] objectAtIndex:0];
141 EXPECT_EQ(1u, [[root_layer sublayers] count]);
142 clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0];
143 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
144 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0];
145 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
146 content_layer = [[transform_layer sublayers] objectAtIndex:0];
147
148 // Validate the clip and sorting context layer.
149 EXPECT_TRUE([clip_and_sorting_layer masksToBounds]);
150 EXPECT_EQ(gfx::Rect(properties.clip_rect.size()),
151 gfx::Rect([clip_and_sorting_layer bounds]));
152 EXPECT_EQ(properties.clip_rect.origin(),
153 gfx::Point([clip_and_sorting_layer position]));
154 EXPECT_EQ(-properties.clip_rect.origin().x(),
155 [clip_and_sorting_layer sublayerTransform].m41);
156 EXPECT_EQ(-properties.clip_rect.origin().y(),
157 [clip_and_sorting_layer sublayerTransform].m42);
158
159 // Validate the transform layer.
160 EXPECT_EQ(properties.transform.matrix().get(3, 0),
161 [transform_layer sublayerTransform].m41);
162 EXPECT_EQ(properties.transform.matrix().get(3, 1),
163 [transform_layer sublayerTransform].m42);
164
165 // Validate the content layer.
166 EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()),
167 [content_layer contents]);
168 EXPECT_EQ(properties.contents_rect,
169 gfx::RectF([content_layer contentsRect]));
170 EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position]));
171 EXPECT_EQ(gfx::Rect(properties.rect.size()),
172 gfx::Rect([content_layer bounds]));
173 EXPECT_EQ(kCALayerLeftEdge, [content_layer edgeAntialiasingMask]);
174 EXPECT_EQ(properties.opacity, [content_layer opacity]);
175 EXPECT_NSEQ(kCAFilterLinear, [content_layer minificationFilter]);
176 EXPECT_NSEQ(kCAFilterLinear, [content_layer magnificationFilter]);
177 if ([content_layer respondsToSelector:(@selector(contentsScale))])
178 EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
179 }
180
181 // Update just the clip rect and re-commit.
182 {
183 properties.clip_rect = gfx::Rect(4, 8, 16, 32);
184 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
185
186 // Validate the tree structure
187 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
188 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
189 EXPECT_EQ(1u, [[root_layer sublayers] count]);
190 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
191 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
192 EXPECT_EQ(transform_layer,
193 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
194
195 // Validate the clip and sorting context layer.
196 EXPECT_TRUE([clip_and_sorting_layer masksToBounds]);
197 EXPECT_EQ(gfx::Rect(properties.clip_rect.size()),
198 gfx::Rect([clip_and_sorting_layer bounds]));
199 EXPECT_EQ(properties.clip_rect.origin(),
200 gfx::Point([clip_and_sorting_layer position]));
201 EXPECT_EQ(-properties.clip_rect.origin().x(),
202 [clip_and_sorting_layer sublayerTransform].m41);
203 EXPECT_EQ(-properties.clip_rect.origin().y(),
204 [clip_and_sorting_layer sublayerTransform].m42);
205 }
206
207 // Disable clipping and re-commit.
208 {
209 properties.is_clipped = false;
210 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
211
212 // Validate the tree structure
213 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
214 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
215 EXPECT_EQ(1u, [[root_layer sublayers] count]);
216 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
217 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
218 EXPECT_EQ(transform_layer,
219 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
220
221 // Validate the clip and sorting context layer.
222 EXPECT_FALSE([clip_and_sorting_layer masksToBounds]);
223 EXPECT_EQ(gfx::Rect(), gfx::Rect([clip_and_sorting_layer bounds]));
224 EXPECT_EQ(gfx::Point(), gfx::Point([clip_and_sorting_layer position]));
225 EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m41);
226 EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m42);
227 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
228 }
229
230 // Change the transform and re-commit.
231 {
232 properties.transform.Translate(5, 5);
233 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
234
235 // Validate the tree structure.
236 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
237 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
238 EXPECT_EQ(1u, [[root_layer sublayers] count]);
239 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
240 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
241 EXPECT_EQ(transform_layer,
242 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
243
244 // Validate the transform layer.
245 EXPECT_EQ(properties.transform.matrix().get(3, 0),
246 [transform_layer sublayerTransform].m41);
247 EXPECT_EQ(properties.transform.matrix().get(3, 1),
248 [transform_layer sublayerTransform].m42);
249 }
250
251 // Change the edge antialiasing mask and commit.
252 {
253 properties.edge_aa_mask = GL_CA_LAYER_EDGE_TOP_CHROMIUM;
254 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
255
256 // Validate the tree structure.
257 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
258 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
259 EXPECT_EQ(1u, [[root_layer sublayers] count]);
260 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
261 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
262 EXPECT_EQ(transform_layer,
263 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
264 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
265 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
266
267 // Validate the content layer. Note that top and bottom edges flip.
268 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
269 }
270
271 // Change the contents and commit.
272 {
273 properties.gl_image->Destroy(true);
274 properties.gl_image = nullptr;
275 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
276
277 // Validate the tree structure.
278 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
279 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
280 EXPECT_EQ(1u, [[root_layer sublayers] count]);
281 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
282 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
283 EXPECT_EQ(transform_layer,
284 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
285 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
286 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
287
288 // Validate the content layer. Note that edge anti-aliasing no longer flips.
289 EXPECT_EQ(nil, [content_layer contents]);
290 EXPECT_EQ(kCALayerTopEdge, [content_layer edgeAntialiasingMask]);
291 }
292
293 // Change the rect size.
294 {
295 properties.rect = gfx::Rect(properties.rect.origin(), gfx::Size(32, 16));
296 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
297
298 // Validate the tree structure.
299 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
300 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
301 EXPECT_EQ(1u, [[root_layer sublayers] count]);
302 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
303 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
304 EXPECT_EQ(transform_layer,
305 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
306 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
307 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
308
309 // Validate the content layer.
310 EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position]));
311 EXPECT_EQ(gfx::Rect(properties.rect.size()),
312 gfx::Rect([content_layer bounds]));
313 }
314
315 // Change the rect position.
316 {
317 properties.rect = gfx::Rect(gfx::Point(16, 4), properties.rect.size());
318 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
319
320 // Validate the tree structure.
321 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
322 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
323 EXPECT_EQ(1u, [[root_layer sublayers] count]);
324 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
325 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
326 EXPECT_EQ(transform_layer,
327 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
328 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
329 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
330
331 // Validate the content layer.
332 EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position]));
333 EXPECT_EQ(gfx::Rect(properties.rect.size()),
334 gfx::Rect([content_layer bounds]));
335 }
336
337 // Change the opacity.
338 {
339 properties.opacity = 1.0f;
340 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
341
342 // Validate the tree structure.
343 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
344 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
345 EXPECT_EQ(1u, [[root_layer sublayers] count]);
346 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
347 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
348 EXPECT_EQ(transform_layer,
349 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
350 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
351 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
352
353 // Validate the content layer.
354 EXPECT_EQ(properties.opacity, [content_layer opacity]);
355 }
356
357 // Change the filter.
358 {
359 properties.filter = GL_NEAREST;
360 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
361
362 // Validate the tree structure.
363 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
364 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
365 EXPECT_EQ(1u, [[root_layer sublayers] count]);
366 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
367 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
368 EXPECT_EQ(transform_layer,
369 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
370 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
371 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
372
373 // Validate the content layer.
374 EXPECT_NSEQ(kCAFilterNearest, [content_layer minificationFilter]);
375 EXPECT_NSEQ(kCAFilterNearest, [content_layer magnificationFilter]);
376 }
377
378 // Add the clipping and IOSurface contents back.
379 {
380 properties.is_clipped = true;
381 properties.gl_image = 116 properties.gl_image =
382 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false); 117 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false);
383 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); 118
384 119 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree;
385 // Validate the tree structure. 120 CALayer* root_layer = nil;
386 EXPECT_EQ(1u, [[superlayer_ sublayers] count]); 121 CALayer* clip_and_sorting_layer = nil;
387 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); 122 CALayer* transform_layer = nil;
388 EXPECT_EQ(1u, [[root_layer sublayers] count]); 123 CALayer* content_layer = nil;
389 EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); 124
390 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); 125 // Validate the initial values.
391 EXPECT_EQ(transform_layer, 126 {
392 [[clip_and_sorting_layer sublayers] objectAtIndex:0]); 127 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
393 EXPECT_EQ(1u, [[transform_layer sublayers] count]); 128 new ui::CARendererLayerTree(true, allow_solid_color_layers));
394 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); 129
395 130 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
396 // Validate the content layer. 131
397 EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), 132 // Validate the tree structure.
398 [content_layer contents]); 133 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
399 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); 134 root_layer = [[superlayer_ sublayers] objectAtIndex:0];
135 EXPECT_EQ(1u, [[root_layer sublayers] count]);
136 clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0];
137 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
138 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0];
139 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
140 content_layer = [[transform_layer sublayers] objectAtIndex:0];
141
142 // Validate the clip and sorting context layer.
143 EXPECT_TRUE([clip_and_sorting_layer masksToBounds]);
144 EXPECT_EQ(gfx::Rect(properties.clip_rect.size()),
145 gfx::Rect([clip_and_sorting_layer bounds]));
146 EXPECT_EQ(properties.clip_rect.origin(),
147 gfx::Point([clip_and_sorting_layer position]));
148 EXPECT_EQ(-properties.clip_rect.origin().x(),
149 [clip_and_sorting_layer sublayerTransform].m41);
150 EXPECT_EQ(-properties.clip_rect.origin().y(),
151 [clip_and_sorting_layer sublayerTransform].m42);
152
153 // Validate the transform layer.
154 EXPECT_EQ(properties.transform.matrix().get(3, 0),
155 [transform_layer sublayerTransform].m41);
156 EXPECT_EQ(properties.transform.matrix().get(3, 1),
157 [transform_layer sublayerTransform].m42);
158
159 // Validate the content layer.
160 EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()),
161 [content_layer contents]);
162 EXPECT_EQ(properties.contents_rect,
163 gfx::RectF([content_layer contentsRect]));
164 EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position]));
165 EXPECT_EQ(gfx::Rect(properties.rect.size()),
166 gfx::Rect([content_layer bounds]));
167 EXPECT_EQ(kCALayerLeftEdge, [content_layer edgeAntialiasingMask]);
168 EXPECT_EQ(properties.opacity, [content_layer opacity]);
169 EXPECT_NSEQ(kCAFilterLinear, [content_layer minificationFilter]);
170 EXPECT_NSEQ(kCAFilterLinear, [content_layer magnificationFilter]);
171 if ([content_layer respondsToSelector:(@selector(contentsScale))])
172 EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
173 }
174
175 // Update just the clip rect and re-commit.
176 {
177 properties.clip_rect = gfx::Rect(4, 8, 16, 32);
178 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
179
180 // Validate the tree structure
181 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
182 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
183 EXPECT_EQ(1u, [[root_layer sublayers] count]);
184 EXPECT_EQ(clip_and_sorting_layer,
185 [[root_layer sublayers] objectAtIndex:0]);
186 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
187 EXPECT_EQ(transform_layer,
188 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
189
190 // Validate the clip and sorting context layer.
191 EXPECT_TRUE([clip_and_sorting_layer masksToBounds]);
192 EXPECT_EQ(gfx::Rect(properties.clip_rect.size()),
193 gfx::Rect([clip_and_sorting_layer bounds]));
194 EXPECT_EQ(properties.clip_rect.origin(),
195 gfx::Point([clip_and_sorting_layer position]));
196 EXPECT_EQ(-properties.clip_rect.origin().x(),
197 [clip_and_sorting_layer sublayerTransform].m41);
198 EXPECT_EQ(-properties.clip_rect.origin().y(),
199 [clip_and_sorting_layer sublayerTransform].m42);
200 }
201
202 // Disable clipping and re-commit.
203 {
204 properties.is_clipped = false;
205 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
206
207 // Validate the tree structure
208 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
209 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
210 EXPECT_EQ(1u, [[root_layer sublayers] count]);
211 EXPECT_EQ(clip_and_sorting_layer,
212 [[root_layer sublayers] objectAtIndex:0]);
213 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
214 EXPECT_EQ(transform_layer,
215 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
216
217 // Validate the clip and sorting context layer.
218 EXPECT_FALSE([clip_and_sorting_layer masksToBounds]);
219 EXPECT_EQ(gfx::Rect(), gfx::Rect([clip_and_sorting_layer bounds]));
220 EXPECT_EQ(gfx::Point(), gfx::Point([clip_and_sorting_layer position]));
221 EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m41);
222 EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m42);
223 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
224 }
225
226 // Change the transform and re-commit.
227 {
228 properties.transform.Translate(5, 5);
229 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
230
231 // Validate the tree structure.
232 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
233 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
234 EXPECT_EQ(1u, [[root_layer sublayers] count]);
235 EXPECT_EQ(clip_and_sorting_layer,
236 [[root_layer sublayers] objectAtIndex:0]);
237 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
238 EXPECT_EQ(transform_layer,
239 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
240
241 // Validate the transform layer.
242 EXPECT_EQ(properties.transform.matrix().get(3, 0),
243 [transform_layer sublayerTransform].m41);
244 EXPECT_EQ(properties.transform.matrix().get(3, 1),
245 [transform_layer sublayerTransform].m42);
246 }
247
248 // Change the edge antialiasing mask and commit.
249 {
250 properties.edge_aa_mask = GL_CA_LAYER_EDGE_TOP_CHROMIUM;
251 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
252
253 // Validate the tree structure.
254 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
255 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
256 EXPECT_EQ(1u, [[root_layer sublayers] count]);
257 EXPECT_EQ(clip_and_sorting_layer,
258 [[root_layer sublayers] objectAtIndex:0]);
259 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
260 EXPECT_EQ(transform_layer,
261 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
262 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
263 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
264
265 // Validate the content layer. Note that top and bottom edges flip.
266 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
267 }
268
269 // Change the contents and commit.
270 {
271 properties.gl_image->Destroy(true);
272 properties.gl_image = nullptr;
273 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
274
275 // Validate the tree structure.
276 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
277 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
278 EXPECT_EQ(1u, [[root_layer sublayers] count]);
279 EXPECT_EQ(clip_and_sorting_layer,
280 [[root_layer sublayers] objectAtIndex:0]);
281 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
282 EXPECT_EQ(transform_layer,
283 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
284 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
285 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
286
287 // Validate the content layer. Note that edge anti-aliasing does not flip
288 // for solid colors.
289 if (allow_solid_color_layers) {
290 EXPECT_EQ(nil, [content_layer contents]);
291 EXPECT_EQ(kCALayerTopEdge, [content_layer edgeAntialiasingMask]);
292 } else {
293 EXPECT_EQ(ca_layer_tree->ContentsForSolidColorForTesting(
294 properties.background_color),
295 [content_layer contents]);
296 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
297 }
298 }
299
300 // Change the rect size.
301 {
302 properties.rect = gfx::Rect(properties.rect.origin(), gfx::Size(32, 16));
303 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
304
305 // Validate the tree structure.
306 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
307 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
308 EXPECT_EQ(1u, [[root_layer sublayers] count]);
309 EXPECT_EQ(clip_and_sorting_layer,
310 [[root_layer sublayers] objectAtIndex:0]);
311 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
312 EXPECT_EQ(transform_layer,
313 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
314 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
315 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
316
317 // Validate the content layer.
318 EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position]));
319 EXPECT_EQ(gfx::Rect(properties.rect.size()),
320 gfx::Rect([content_layer bounds]));
321 }
322
323 // Change the rect position.
324 {
325 properties.rect = gfx::Rect(gfx::Point(16, 4), properties.rect.size());
326 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
327
328 // Validate the tree structure.
329 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
330 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
331 EXPECT_EQ(1u, [[root_layer sublayers] count]);
332 EXPECT_EQ(clip_and_sorting_layer,
333 [[root_layer sublayers] objectAtIndex:0]);
334 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
335 EXPECT_EQ(transform_layer,
336 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
337 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
338 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
339
340 // Validate the content layer.
341 EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position]));
342 EXPECT_EQ(gfx::Rect(properties.rect.size()),
343 gfx::Rect([content_layer bounds]));
344 }
345
346 // Change the opacity.
347 {
348 properties.opacity = 1.0f;
349 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
350
351 // Validate the tree structure.
352 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
353 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
354 EXPECT_EQ(1u, [[root_layer sublayers] count]);
355 EXPECT_EQ(clip_and_sorting_layer,
356 [[root_layer sublayers] objectAtIndex:0]);
357 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
358 EXPECT_EQ(transform_layer,
359 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
360 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
361 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
362
363 // Validate the content layer.
364 EXPECT_EQ(properties.opacity, [content_layer opacity]);
365 }
366
367 // Change the filter.
368 {
369 properties.filter = GL_NEAREST;
370 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
371
372 // Validate the tree structure.
373 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
374 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
375 EXPECT_EQ(1u, [[root_layer sublayers] count]);
376 EXPECT_EQ(clip_and_sorting_layer,
377 [[root_layer sublayers] objectAtIndex:0]);
378 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
379 EXPECT_EQ(transform_layer,
380 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
381 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
382 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
383
384 // Validate the content layer.
385 EXPECT_NSEQ(kCAFilterNearest, [content_layer minificationFilter]);
386 EXPECT_NSEQ(kCAFilterNearest, [content_layer magnificationFilter]);
387 }
388
389 // Add the clipping and IOSurface contents back.
390 {
391 properties.is_clipped = true;
392 properties.gl_image = CreateGLImage(gfx::Size(256, 256),
393 gfx::BufferFormat::BGRA_8888, false);
394 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
395
396 // Validate the tree structure.
397 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
398 EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
399 EXPECT_EQ(1u, [[root_layer sublayers] count]);
400 EXPECT_EQ(clip_and_sorting_layer,
401 [[root_layer sublayers] objectAtIndex:0]);
402 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
403 EXPECT_EQ(transform_layer,
404 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
405 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
406 EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
407
408 // Validate the content layer.
409 EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()),
410 [content_layer contents]);
411 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
412 }
413
414 // Change the scale factor. This should result in a new tree being created.
415 {
416 properties.scale_factor = 2.0f;
417 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
418
419 // Validate the tree structure.
420 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
421 EXPECT_NE(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
422 root_layer = [[superlayer_ sublayers] objectAtIndex:0];
423 EXPECT_EQ(1u, [[root_layer sublayers] count]);
424 EXPECT_NE(clip_and_sorting_layer,
425 [[root_layer sublayers] objectAtIndex:0]);
426 clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0];
427 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
428 EXPECT_NE(transform_layer,
429 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
430 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0];
431 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
432 EXPECT_NE(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
433 content_layer = [[transform_layer sublayers] objectAtIndex:0];
434
435 // Validate the clip and sorting context layer.
436 EXPECT_TRUE([clip_and_sorting_layer masksToBounds]);
437 EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor,
438 gfx::Rect(properties.clip_rect.size())),
439 gfx::Rect([clip_and_sorting_layer bounds]));
440 EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor,
441 properties.clip_rect.origin()),
442 gfx::Point([clip_and_sorting_layer position]));
443 EXPECT_EQ(-properties.clip_rect.origin().x() / properties.scale_factor,
444 [clip_and_sorting_layer sublayerTransform].m41);
445 EXPECT_EQ(-properties.clip_rect.origin().y() / properties.scale_factor,
446 [clip_and_sorting_layer sublayerTransform].m42);
447
448 // Validate the transform layer.
449 EXPECT_EQ(
450 properties.transform.matrix().get(3, 0) / properties.scale_factor,
451 [transform_layer sublayerTransform].m41);
452 EXPECT_EQ(
453 properties.transform.matrix().get(3, 1) / properties.scale_factor,
454 [transform_layer sublayerTransform].m42);
455
456 // Validate the content layer.
457 EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()),
458 [content_layer contents]);
459 EXPECT_EQ(properties.contents_rect,
460 gfx::RectF([content_layer contentsRect]));
461 EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor,
462 properties.rect.origin()),
463 gfx::Point([content_layer position]));
464 EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor,
465 gfx::Rect(properties.rect.size())),
466 gfx::Rect([content_layer bounds]));
467 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
468 EXPECT_EQ(properties.opacity, [content_layer opacity]);
469 if ([content_layer respondsToSelector:(@selector(contentsScale))])
470 EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
471 }
472
473 properties.gl_image->Destroy(true);
400 } 474 }
401 475 };
402 // Change the scale factor. This should result in a new tree being created. 476
403 { 477 TEST_F(CALayerTreePropertyUpdatesTest, AllowSolidColors) {
404 properties.scale_factor = 2.0f; 478 RunTest(true);
405 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
406
407 // Validate the tree structure.
408 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
409 EXPECT_NE(root_layer, [[superlayer_ sublayers] objectAtIndex:0]);
410 root_layer = [[superlayer_ sublayers] objectAtIndex:0];
411 EXPECT_EQ(1u, [[root_layer sublayers] count]);
412 EXPECT_NE(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]);
413 clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0];
414 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
415 EXPECT_NE(transform_layer,
416 [[clip_and_sorting_layer sublayers] objectAtIndex:0]);
417 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0];
418 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
419 EXPECT_NE(content_layer, [[transform_layer sublayers] objectAtIndex:0]);
420 content_layer = [[transform_layer sublayers] objectAtIndex:0];
421
422 // Validate the clip and sorting context layer.
423 EXPECT_TRUE([clip_and_sorting_layer masksToBounds]);
424 EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor,
425 gfx::Rect(properties.clip_rect.size())),
426 gfx::Rect([clip_and_sorting_layer bounds]));
427 EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor,
428 properties.clip_rect.origin()),
429 gfx::Point([clip_and_sorting_layer position]));
430 EXPECT_EQ(-properties.clip_rect.origin().x() / properties.scale_factor,
431 [clip_and_sorting_layer sublayerTransform].m41);
432 EXPECT_EQ(-properties.clip_rect.origin().y() / properties.scale_factor,
433 [clip_and_sorting_layer sublayerTransform].m42);
434
435 // Validate the transform layer.
436 EXPECT_EQ(properties.transform.matrix().get(3, 0) / properties.scale_factor,
437 [transform_layer sublayerTransform].m41);
438 EXPECT_EQ(properties.transform.matrix().get(3, 1) / properties.scale_factor,
439 [transform_layer sublayerTransform].m42);
440
441 // Validate the content layer.
442 EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()),
443 [content_layer contents]);
444 EXPECT_EQ(properties.contents_rect,
445 gfx::RectF([content_layer contentsRect]));
446 EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor,
447 properties.rect.origin()),
448 gfx::Point([content_layer position]));
449 EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor,
450 gfx::Rect(properties.rect.size())),
451 gfx::Rect([content_layer bounds]));
452 EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
453 EXPECT_EQ(properties.opacity, [content_layer opacity]);
454 if ([content_layer respondsToSelector:(@selector(contentsScale))])
455 EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
456 }
457
458 properties.gl_image->Destroy(true);
459 } 479 }
460 480
481 TEST_F(CALayerTreePropertyUpdatesTest, DisallowSolidColors) {
482 RunTest(false);
483 }
484
461 // Verify that sorting context zero is split at non-flat transforms. 485 // Verify that sorting context zero is split at non-flat transforms.
462 TEST_F(CALayerTreeTest, SplitSortingContextZero) { 486 TEST_F(CALayerTreeTest, SplitSortingContextZero) {
463 CALayerProperties properties; 487 CALayerProperties properties;
464 properties.is_clipped = false; 488 properties.is_clipped = false;
465 properties.clip_rect = gfx::Rect(); 489 properties.clip_rect = gfx::Rect();
466 properties.rect = gfx::Rect(0, 0, 256, 256); 490 properties.rect = gfx::Rect(0, 0, 256, 256);
467 491
468 // We'll use the IOSurface contents to identify the content layers. 492 // We'll use the IOSurface contents to identify the content layers.
469 scoped_refptr<gl::GLImageIOSurface> gl_images[5]; 493 scoped_refptr<gl::GLImageIOSurface> gl_images[5];
470 for (size_t i = 0; i < 5; ++i) { 494 for (size_t i = 0; i < 5; ++i) {
471 gl_images[i] = 495 gl_images[i] =
472 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false); 496 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false);
473 } 497 }
474 498
475 // Have 5 transforms: 499 // Have 5 transforms:
476 // * 2 flat but different (1 sorting context layer, 2 transform layers) 500 // * 2 flat but different (1 sorting context layer, 2 transform layers)
477 // * 1 non-flat (new sorting context layer) 501 // * 1 non-flat (new sorting context layer)
478 // * 2 flat and the same (new sorting context layer, 1 transform layer) 502 // * 2 flat and the same (new sorting context layer, 1 transform layer)
479 gfx::Transform transforms[5]; 503 gfx::Transform transforms[5];
480 transforms[0].Translate(10, 10); 504 transforms[0].Translate(10, 10);
481 transforms[1].RotateAboutZAxis(45.0f); 505 transforms[1].RotateAboutZAxis(45.0f);
482 transforms[2].RotateAboutYAxis(45.0f); 506 transforms[2].RotateAboutYAxis(45.0f);
483 transforms[3].Translate(10, 10); 507 transforms[3].Translate(10, 10);
484 transforms[4].Translate(10, 10); 508 transforms[4].Translate(10, 10);
485 509
486 // Schedule and commit the layers. 510 // Schedule and commit the layers.
487 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree( 511 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree(
488 new ui::CARendererLayerTree(true)); 512 new ui::CARendererLayerTree(true, true));
489 for (size_t i = 0; i < 5; ++i) { 513 for (size_t i = 0; i < 5; ++i) {
490 properties.gl_image = gl_images[i]; 514 properties.gl_image = gl_images[i];
491 properties.transform = transforms[i]; 515 properties.transform = transforms[i];
492 bool result = ScheduleCALayer(ca_layer_tree.get(), &properties); 516 bool result = ScheduleCALayer(ca_layer_tree.get(), &properties);
493 EXPECT_TRUE(result); 517 EXPECT_TRUE(result);
494 } 518 }
495 ca_layer_tree->CommitScheduledCALayers(superlayer_, nullptr, 519 ca_layer_tree->CommitScheduledCALayers(superlayer_, nullptr,
496 properties.scale_factor); 520 properties.scale_factor);
497 521
498 // Validate the root layer. 522 // Validate the root layer.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 scoped_refptr<gl::GLImageIOSurface> gl_images[3]; 585 scoped_refptr<gl::GLImageIOSurface> gl_images[3];
562 for (size_t i = 0; i < 3; ++i) { 586 for (size_t i = 0; i < 3; ++i) {
563 gl_images[i] = 587 gl_images[i] =
564 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false); 588 CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false);
565 } 589 }
566 590
567 int sorting_context_ids[3] = {3, -1, 0}; 591 int sorting_context_ids[3] = {3, -1, 0};
568 592
569 // Schedule and commit the layers. 593 // Schedule and commit the layers.
570 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree( 594 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree(
571 new ui::CARendererLayerTree(true)); 595 new ui::CARendererLayerTree(true, true));
572 for (size_t i = 0; i < 3; ++i) { 596 for (size_t i = 0; i < 3; ++i) {
573 properties.sorting_context_id = sorting_context_ids[i]; 597 properties.sorting_context_id = sorting_context_ids[i];
574 properties.gl_image = gl_images[i]; 598 properties.gl_image = gl_images[i];
575 bool result = ScheduleCALayer(ca_layer_tree.get(), &properties); 599 bool result = ScheduleCALayer(ca_layer_tree.get(), &properties);
576 EXPECT_TRUE(result); 600 EXPECT_TRUE(result);
577 } 601 }
578 ca_layer_tree->CommitScheduledCALayers(superlayer_, nullptr, 602 ca_layer_tree->CommitScheduledCALayers(superlayer_, nullptr,
579 properties.scale_factor); 603 properties.scale_factor);
580 604
581 // Validate the root layer. 605 // Validate the root layer.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 649
626 // Vary the clipping parameters within sorting contexts. 650 // Vary the clipping parameters within sorting contexts.
627 bool is_clippeds[3] = { true, true, false}; 651 bool is_clippeds[3] = { true, true, false};
628 gfx::Rect clip_rects[3] = { 652 gfx::Rect clip_rects[3] = {
629 gfx::Rect(0, 0, 16, 16), 653 gfx::Rect(0, 0, 16, 16),
630 gfx::Rect(4, 8, 16, 32), 654 gfx::Rect(4, 8, 16, 32),
631 gfx::Rect(0, 0, 16, 16) 655 gfx::Rect(0, 0, 16, 16)
632 }; 656 };
633 657
634 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree( 658 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree(
635 new ui::CARendererLayerTree(true)); 659 new ui::CARendererLayerTree(true, true));
636 // First send the various clip parameters to sorting context zero. This is 660 // First send the various clip parameters to sorting context zero. This is
637 // legitimate. 661 // legitimate.
638 for (size_t i = 0; i < 3; ++i) { 662 for (size_t i = 0; i < 3; ++i) {
639 properties.is_clipped = is_clippeds[i]; 663 properties.is_clipped = is_clippeds[i];
640 properties.clip_rect = clip_rects[i]; 664 properties.clip_rect = clip_rects[i];
641 665
642 bool result = ScheduleCALayer(ca_layer_tree.get(), &properties); 666 bool result = ScheduleCALayer(ca_layer_tree.get(), &properties);
643 EXPECT_TRUE(result); 667 EXPECT_TRUE(result);
644 } 668 }
645 669
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0]; 824 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0];
801 EXPECT_EQ(1u, [[transform_layer sublayers] count]); 825 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
802 content_layer1 = [[transform_layer sublayers] objectAtIndex:0]; 826 content_layer1 = [[transform_layer sublayers] objectAtIndex:0];
803 827
804 // Validate the content layer. 828 // Validate the content layer.
805 EXPECT_TRUE([content_layer1 829 EXPECT_TRUE([content_layer1
806 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]); 830 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
807 } 831 }
808 832
809 { 833 {
810 UpdateCALayerTreeWithAVDisabled(ca_layer_tree, &properties, superlayer_); 834 properties.allow_av_layers = false;
835 UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
811 836
812 // Validate the tree structure. 837 // Validate the tree structure.
813 EXPECT_EQ(1u, [[superlayer_ sublayers] count]); 838 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
814 root_layer = [[superlayer_ sublayers] objectAtIndex:0]; 839 root_layer = [[superlayer_ sublayers] objectAtIndex:0];
815 EXPECT_EQ(1u, [[root_layer sublayers] count]); 840 EXPECT_EQ(1u, [[root_layer sublayers] count]);
816 clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0]; 841 clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0];
817 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); 842 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
818 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0]; 843 transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0];
819 EXPECT_EQ(1u, [[transform_layer sublayers] count]); 844 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
820 content_layer2 = [[transform_layer sublayers] objectAtIndex:0]; 845 content_layer2 = [[transform_layer sublayers] objectAtIndex:0];
(...skipping 17 matching lines...) Expand all
838 properties_black.background_color = SK_ColorBLACK; 863 properties_black.background_color = SK_ColorBLACK;
839 CALayerProperties properties_white; 864 CALayerProperties properties_white;
840 properties_white.is_clipped = false; 865 properties_white.is_clipped = false;
841 properties_white.background_color = SK_ColorWHITE; 866 properties_white.background_color = SK_ColorWHITE;
842 867
843 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree; 868 std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree;
844 869
845 // Test a configuration with no background. 870 // Test a configuration with no background.
846 { 871 {
847 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( 872 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
848 new ui::CARendererLayerTree(true)); 873 new ui::CARendererLayerTree(true, true));
849 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); 874 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties);
850 EXPECT_TRUE(result); 875 EXPECT_TRUE(result);
851 new_ca_layer_tree->CommitScheduledCALayers( 876 new_ca_layer_tree->CommitScheduledCALayers(
852 superlayer_, std::move(ca_layer_tree), properties.scale_factor); 877 superlayer_, std::move(ca_layer_tree), properties.scale_factor);
853 bool fullscreen_low_power_valid = 878 bool fullscreen_low_power_valid =
854 new_ca_layer_tree->CommitFullscreenLowPowerLayer( 879 new_ca_layer_tree->CommitFullscreenLowPowerLayer(
855 fullscreen_low_power_layer_); 880 fullscreen_low_power_layer_);
856 std::swap(new_ca_layer_tree, ca_layer_tree); 881 std::swap(new_ca_layer_tree, ca_layer_tree);
857 882
858 // Validate the tree structure. 883 // Validate the tree structure.
859 EXPECT_EQ(1u, [[superlayer_ sublayers] count]); 884 EXPECT_EQ(1u, [[superlayer_ sublayers] count]);
860 CALayer* root_layer = [[superlayer_ sublayers] objectAtIndex:0]; 885 CALayer* root_layer = [[superlayer_ sublayers] objectAtIndex:0];
861 EXPECT_EQ(1u, [[root_layer sublayers] count]); 886 EXPECT_EQ(1u, [[root_layer sublayers] count]);
862 CALayer* clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0]; 887 CALayer* clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0];
863 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); 888 EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]);
864 CALayer* transform_layer = 889 CALayer* transform_layer =
865 [[clip_and_sorting_layer sublayers] objectAtIndex:0]; 890 [[clip_and_sorting_layer sublayers] objectAtIndex:0];
866 EXPECT_EQ(1u, [[transform_layer sublayers] count]); 891 EXPECT_EQ(1u, [[transform_layer sublayers] count]);
867 CALayer* content_layer = [[transform_layer sublayers] objectAtIndex:0]; 892 CALayer* content_layer = [[transform_layer sublayers] objectAtIndex:0];
868 893
869 // Validate the content layer and fullscreen low power mode. 894 // Validate the content layer and fullscreen low power mode.
870 EXPECT_TRUE([content_layer 895 EXPECT_TRUE([content_layer
871 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]); 896 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
872 EXPECT_TRUE(fullscreen_low_power_valid); 897 EXPECT_TRUE(fullscreen_low_power_valid);
873 } 898 }
874 899
875 // Test a configuration with a black background. 900 // Test a configuration with a black background.
876 { 901 {
877 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( 902 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
878 new ui::CARendererLayerTree(true)); 903 new ui::CARendererLayerTree(true, true));
879 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_black); 904 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_black);
880 EXPECT_TRUE(result); 905 EXPECT_TRUE(result);
881 result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); 906 result = ScheduleCALayer(new_ca_layer_tree.get(), &properties);
882 EXPECT_TRUE(result); 907 EXPECT_TRUE(result);
883 new_ca_layer_tree->CommitScheduledCALayers( 908 new_ca_layer_tree->CommitScheduledCALayers(
884 superlayer_, std::move(ca_layer_tree), properties.scale_factor); 909 superlayer_, std::move(ca_layer_tree), properties.scale_factor);
885 bool fullscreen_low_power_valid = 910 bool fullscreen_low_power_valid =
886 new_ca_layer_tree->CommitFullscreenLowPowerLayer( 911 new_ca_layer_tree->CommitFullscreenLowPowerLayer(
887 fullscreen_low_power_layer_); 912 fullscreen_low_power_layer_);
888 std::swap(new_ca_layer_tree, ca_layer_tree); 913 std::swap(new_ca_layer_tree, ca_layer_tree);
(...skipping 11 matching lines...) Expand all
900 925
901 // Validate the content layer and fullscreen low power mode. 926 // Validate the content layer and fullscreen low power mode.
902 EXPECT_TRUE([content_layer 927 EXPECT_TRUE([content_layer
903 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]); 928 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
904 EXPECT_TRUE(fullscreen_low_power_valid); 929 EXPECT_TRUE(fullscreen_low_power_valid);
905 } 930 }
906 931
907 // Test a configuration with a white background. It will fail. 932 // Test a configuration with a white background. It will fail.
908 { 933 {
909 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( 934 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
910 new ui::CARendererLayerTree(true)); 935 new ui::CARendererLayerTree(true, true));
911 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_white); 936 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_white);
912 EXPECT_TRUE(result); 937 EXPECT_TRUE(result);
913 result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); 938 result = ScheduleCALayer(new_ca_layer_tree.get(), &properties);
914 EXPECT_TRUE(result); 939 EXPECT_TRUE(result);
915 new_ca_layer_tree->CommitScheduledCALayers( 940 new_ca_layer_tree->CommitScheduledCALayers(
916 superlayer_, std::move(ca_layer_tree), properties.scale_factor); 941 superlayer_, std::move(ca_layer_tree), properties.scale_factor);
917 bool fullscreen_low_power_valid = 942 bool fullscreen_low_power_valid =
918 new_ca_layer_tree->CommitFullscreenLowPowerLayer( 943 new_ca_layer_tree->CommitFullscreenLowPowerLayer(
919 fullscreen_low_power_layer_); 944 fullscreen_low_power_layer_);
920 std::swap(new_ca_layer_tree, ca_layer_tree); 945 std::swap(new_ca_layer_tree, ca_layer_tree);
(...skipping 11 matching lines...) Expand all
932 957
933 // Validate the content layer and fullscreen low power mode. 958 // Validate the content layer and fullscreen low power mode.
934 EXPECT_TRUE([content_layer 959 EXPECT_TRUE([content_layer
935 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]); 960 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
936 EXPECT_FALSE(fullscreen_low_power_valid); 961 EXPECT_FALSE(fullscreen_low_power_valid);
937 } 962 }
938 963
939 // Test a configuration with a black foreground. It too will fail. 964 // Test a configuration with a black foreground. It too will fail.
940 { 965 {
941 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( 966 std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree(
942 new ui::CARendererLayerTree(true)); 967 new ui::CARendererLayerTree(true, true));
943 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); 968 bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties);
944 EXPECT_TRUE(result); 969 EXPECT_TRUE(result);
945 result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_black); 970 result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_black);
946 EXPECT_TRUE(result); 971 EXPECT_TRUE(result);
947 new_ca_layer_tree->CommitScheduledCALayers( 972 new_ca_layer_tree->CommitScheduledCALayers(
948 superlayer_, std::move(ca_layer_tree), properties.scale_factor); 973 superlayer_, std::move(ca_layer_tree), properties.scale_factor);
949 bool fullscreen_low_power_valid = 974 bool fullscreen_low_power_valid =
950 new_ca_layer_tree->CommitFullscreenLowPowerLayer( 975 new_ca_layer_tree->CommitFullscreenLowPowerLayer(
951 fullscreen_low_power_layer_); 976 fullscreen_low_power_layer_);
952 std::swap(new_ca_layer_tree, ca_layer_tree); 977 std::swap(new_ca_layer_tree, ca_layer_tree);
(...skipping 10 matching lines...) Expand all
963 CALayer* content_layer = [[transform_layer sublayers] objectAtIndex:0]; 988 CALayer* content_layer = [[transform_layer sublayers] objectAtIndex:0];
964 989
965 // Validate the content layer and fullscreen low power mode. 990 // Validate the content layer and fullscreen low power mode.
966 EXPECT_TRUE([content_layer 991 EXPECT_TRUE([content_layer
967 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]); 992 isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
968 EXPECT_FALSE(fullscreen_low_power_valid); 993 EXPECT_FALSE(fullscreen_low_power_valid);
969 } 994 }
970 } 995 }
971 996
972 } // namespace gpu 997 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698