blob: 9c490d43ee7c7f9ac575866b9a1a1cf5ee7a5285 [file] [log] [blame]
[email protected]4934d362012-11-22 22:04:531// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/common/cc_messages.h"
6
7#include <string.h>
8
[email protected]032bfc42013-10-29 22:23:529#include <algorithm>
10
[email protected]7f0d825f2013-03-18 07:24:3011#include "cc/output/compositor_frame.h"
[email protected]4934d362012-11-22 22:04:5312#include "ipc/ipc_message.h"
13#include "testing/gtest/include/gtest/gtest.h"
[email protected]645a47f22013-09-26 05:42:3214#include "third_party/khronos/GLES2/gl2ext.h"
[email protected]a1765672013-08-12 23:45:0215#include "third_party/skia/include/effects/SkBlurImageFilter.h"
[email protected]4934d362012-11-22 22:04:5316
17using cc::CheckerboardDrawQuad;
[email protected]bf189f62012-12-18 03:42:1118using cc::DelegatedFrameData;
[email protected]4934d362012-11-22 22:04:5319using cc::DebugBorderDrawQuad;
20using cc::DrawQuad;
[email protected]ae6b1a72013-06-25 18:49:2921using cc::FilterOperation;
22using cc::FilterOperations;
[email protected]4934d362012-11-22 22:04:5323using cc::IOSurfaceDrawQuad;
[email protected]9ee4d3a2013-03-27 17:43:1624using cc::PictureDrawQuad;
[email protected]4934d362012-11-22 22:04:5325using cc::RenderPass;
26using cc::RenderPassDrawQuad;
27using cc::ResourceProvider;
28using cc::SharedQuadState;
29using cc::SolidColorDrawQuad;
30using cc::TextureDrawQuad;
31using cc::TileDrawQuad;
[email protected]bca159072012-12-04 00:52:4432using cc::TransferableResource;
[email protected]4934d362012-11-22 22:04:5333using cc::StreamVideoDrawQuad;
34using cc::VideoLayerImpl;
35using cc::YUVVideoDrawQuad;
[email protected]c8686a02012-11-27 08:29:0036using gfx::Transform;
[email protected]4934d362012-11-22 22:04:5337
[email protected]bca159072012-12-04 00:52:4438namespace content {
39namespace {
40
[email protected]4934d362012-11-22 22:04:5341class CCMessagesTest : public testing::Test {
42 protected:
43 void Compare(const RenderPass* a, const RenderPass* b) {
44 EXPECT_EQ(a->id, b->id);
45 EXPECT_EQ(a->output_rect.ToString(), b->output_rect.ToString());
46 EXPECT_EQ(a->damage_rect.ToString(), b->damage_rect.ToString());
47 EXPECT_EQ(a->transform_to_root_target, b->transform_to_root_target);
48 EXPECT_EQ(a->has_transparent_background, b->has_transparent_background);
[email protected]4934d362012-11-22 22:04:5349 }
50
51 void Compare(const SharedQuadState* a, const SharedQuadState* b) {
52 EXPECT_EQ(a->content_to_target_transform, b->content_to_target_transform);
[email protected]f902bf92013-03-04 18:33:2753 EXPECT_EQ(a->content_bounds, b->content_bounds);
[email protected]4934d362012-11-22 22:04:5354 EXPECT_EQ(a->visible_content_rect, b->visible_content_rect);
[email protected]4934d362012-11-22 22:04:5355 EXPECT_EQ(a->clip_rect, b->clip_rect);
56 EXPECT_EQ(a->is_clipped, b->is_clipped);
57 EXPECT_EQ(a->opacity, b->opacity);
58 }
59
60 void Compare(const DrawQuad* a, const DrawQuad* b) {
61 ASSERT_NE(DrawQuad::INVALID, a->material);
62 ASSERT_EQ(a->material, b->material);
63 EXPECT_EQ(a->rect.ToString(), b->rect.ToString());
64 EXPECT_EQ(a->opaque_rect.ToString(), b->opaque_rect.ToString());
65 EXPECT_EQ(a->visible_rect.ToString(), b->visible_rect.ToString());
66 EXPECT_EQ(a->needs_blending, b->needs_blending);
67
68 Compare(a->shared_quad_state, b->shared_quad_state);
69
70 switch (a->material) {
71 case DrawQuad::CHECKERBOARD:
72 Compare(CheckerboardDrawQuad::MaterialCast(a),
73 CheckerboardDrawQuad::MaterialCast(b));
74 break;
75 case DrawQuad::DEBUG_BORDER:
76 Compare(DebugBorderDrawQuad::MaterialCast(a),
77 DebugBorderDrawQuad::MaterialCast(b));
78 break;
79 case DrawQuad::IO_SURFACE_CONTENT:
80 Compare(IOSurfaceDrawQuad::MaterialCast(a),
81 IOSurfaceDrawQuad::MaterialCast(b));
82 break;
[email protected]9ee4d3a2013-03-27 17:43:1683 case DrawQuad::PICTURE_CONTENT:
84 Compare(PictureDrawQuad::MaterialCast(a),
85 PictureDrawQuad::MaterialCast(b));
86 break;
[email protected]4934d362012-11-22 22:04:5387 case DrawQuad::RENDER_PASS:
88 Compare(RenderPassDrawQuad::MaterialCast(a),
89 RenderPassDrawQuad::MaterialCast(b));
90 break;
91 case DrawQuad::TEXTURE_CONTENT:
92 Compare(TextureDrawQuad::MaterialCast(a),
93 TextureDrawQuad::MaterialCast(b));
94 break;
95 case DrawQuad::TILED_CONTENT:
96 Compare(TileDrawQuad::MaterialCast(a),
97 TileDrawQuad::MaterialCast(b));
98 break;
99 case DrawQuad::SOLID_COLOR:
100 Compare(SolidColorDrawQuad::MaterialCast(a),
101 SolidColorDrawQuad::MaterialCast(b));
102 break;
103 case DrawQuad::STREAM_VIDEO_CONTENT:
104 Compare(StreamVideoDrawQuad::MaterialCast(a),
105 StreamVideoDrawQuad::MaterialCast(b));
106 break;
107 case DrawQuad::YUV_VIDEO_CONTENT:
108 Compare(YUVVideoDrawQuad::MaterialCast(a),
109 YUVVideoDrawQuad::MaterialCast(b));
110 break;
111 case DrawQuad::INVALID:
112 break;
113 }
114 }
115
116 void Compare(const CheckerboardDrawQuad* a, const CheckerboardDrawQuad* b) {
117 EXPECT_EQ(a->color, b->color);
118 }
119
120 void Compare(const DebugBorderDrawQuad* a, const DebugBorderDrawQuad* b) {
121 EXPECT_EQ(a->color, b->color);
122 EXPECT_EQ(a->width, b->width);
123 }
124
125 void Compare(const IOSurfaceDrawQuad* a, const IOSurfaceDrawQuad* b) {
126 EXPECT_EQ(a->io_surface_size.ToString(), b->io_surface_size.ToString());
[email protected]b7cfc632013-04-10 04:44:49127 EXPECT_EQ(a->io_surface_resource_id, b->io_surface_resource_id);
[email protected]4934d362012-11-22 22:04:53128 EXPECT_EQ(a->orientation, b->orientation);
129 }
130
131 void Compare(const RenderPassDrawQuad* a, const RenderPassDrawQuad* b) {
[email protected]82f93fb2013-04-17 21:42:06132 EXPECT_EQ(a->render_pass_id, b->render_pass_id);
[email protected]4934d362012-11-22 22:04:53133 EXPECT_EQ(a->is_replica, b->is_replica);
134 EXPECT_EQ(a->mask_resource_id, b->mask_resource_id);
135 EXPECT_EQ(a->contents_changed_since_last_frame,
136 b->contents_changed_since_last_frame);
[email protected]458af1e2012-12-13 05:12:18137 EXPECT_EQ(a->mask_uv_rect.ToString(), b->mask_uv_rect.ToString());
[email protected]1dc7943e2013-09-26 04:41:48138 EXPECT_EQ(a->filters.size(), b->filters.size());
139 for (size_t i = 0; i < a->filters.size(); ++i) {
140 if (a->filters.at(i).type() != cc::FilterOperation::REFERENCE) {
141 EXPECT_EQ(a->filters.at(i), b->filters.at(i));
142 } else {
143 EXPECT_EQ(b->filters.at(i).type(), cc::FilterOperation::REFERENCE);
144 EXPECT_EQ(a->filters.at(i).image_filter()->countInputs(),
145 b->filters.at(i).image_filter()->countInputs());
146 }
147 }
[email protected]20062042012-12-21 22:16:36148 EXPECT_EQ(a->background_filters, b->background_filters);
[email protected]4934d362012-11-22 22:04:53149 }
150
151 void Compare(const SolidColorDrawQuad* a, const SolidColorDrawQuad* b) {
152 EXPECT_EQ(a->color, b->color);
[email protected]10a30b12013-05-02 16:42:11153 EXPECT_EQ(a->force_anti_aliasing_off, b->force_anti_aliasing_off);
[email protected]4934d362012-11-22 22:04:53154 }
155
156 void Compare(const StreamVideoDrawQuad* a, const StreamVideoDrawQuad* b) {
[email protected]b7cfc632013-04-10 04:44:49157 EXPECT_EQ(a->resource_id, b->resource_id);
[email protected]4934d362012-11-22 22:04:53158 EXPECT_EQ(a->matrix, b->matrix);
159 }
160
161 void Compare(const TextureDrawQuad* a, const TextureDrawQuad* b) {
162 EXPECT_EQ(a->resource_id, b->resource_id);
163 EXPECT_EQ(a->premultiplied_alpha, b->premultiplied_alpha);
[email protected]1fd555b2013-01-18 00:13:21164 EXPECT_EQ(a->uv_top_left, b->uv_top_left);
165 EXPECT_EQ(a->uv_bottom_right, b->uv_bottom_right);
[email protected]d18b4d62013-07-12 05:33:49166 EXPECT_EQ(a->background_color, b->background_color);
[email protected]61df9d82013-01-30 02:32:42167 EXPECT_EQ(a->vertex_opacity[0], b->vertex_opacity[0]);
168 EXPECT_EQ(a->vertex_opacity[1], b->vertex_opacity[1]);
169 EXPECT_EQ(a->vertex_opacity[2], b->vertex_opacity[2]);
170 EXPECT_EQ(a->vertex_opacity[3], b->vertex_opacity[3]);
[email protected]4934d362012-11-22 22:04:53171 EXPECT_EQ(a->flipped, b->flipped);
172 }
173
174 void Compare(const TileDrawQuad* a, const TileDrawQuad* b) {
175 EXPECT_EQ(a->resource_id, b->resource_id);
176 EXPECT_EQ(a->tex_coord_rect, b->tex_coord_rect);
177 EXPECT_EQ(a->texture_size, b->texture_size);
178 EXPECT_EQ(a->swizzle_contents, b->swizzle_contents);
[email protected]4934d362012-11-22 22:04:53179 }
180
181 void Compare(const YUVVideoDrawQuad* a, const YUVVideoDrawQuad* b) {
182 EXPECT_EQ(a->tex_scale, b->tex_scale);
[email protected]b7cfc632013-04-10 04:44:49183 EXPECT_EQ(a->y_plane_resource_id, b->y_plane_resource_id);
184 EXPECT_EQ(a->u_plane_resource_id, b->u_plane_resource_id);
185 EXPECT_EQ(a->v_plane_resource_id, b->v_plane_resource_id);
[email protected]0402b2382013-06-07 21:50:54186 EXPECT_EQ(a->a_plane_resource_id, b->a_plane_resource_id);
[email protected]4934d362012-11-22 22:04:53187 }
[email protected]bca159072012-12-04 00:52:44188
189 void Compare(const TransferableResource& a, const TransferableResource& b) {
190 EXPECT_EQ(a.id, b.id);
[email protected]09831f7f2013-02-27 03:32:15191 EXPECT_EQ(a.sync_point, b.sync_point);
[email protected]bca159072012-12-04 00:52:44192 EXPECT_EQ(a.format, b.format);
[email protected]645a47f22013-09-26 05:42:32193 EXPECT_EQ(a.target, b.target);
[email protected]80189292013-02-28 01:59:36194 EXPECT_EQ(a.filter, b.filter);
[email protected]bca159072012-12-04 00:52:44195 EXPECT_EQ(a.size.ToString(), b.size.ToString());
196 for (size_t i = 0; i < arraysize(a.mailbox.name); ++i)
197 EXPECT_EQ(a.mailbox.name[i], b.mailbox.name[i]);
198 }
[email protected]4934d362012-11-22 22:04:53199};
200
201TEST_F(CCMessagesTest, AllQuads) {
[email protected]753bb252013-11-04 22:28:12202 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
[email protected]4934d362012-11-22 22:04:53203
[email protected]c8686a02012-11-27 08:29:00204 Transform arbitrary_matrix;
205 arbitrary_matrix.Scale(3, 3);
206 arbitrary_matrix.Translate(-5, 20);
207 arbitrary_matrix.Rotate(15);
[email protected]4934d362012-11-22 22:04:53208 gfx::Rect arbitrary_rect1(-5, 9, 3, 15);
[email protected]8e1da692013-10-12 17:11:30209 gfx::Rect arbitrary_rect1_inside_rect1(-4, 12, 2, 8);
210 gfx::Rect arbitrary_rect2_inside_rect1(-5, 11, 1, 2);
[email protected]4934d362012-11-22 22:04:53211 gfx::Rect arbitrary_rect2(40, 23, 11, 7);
[email protected]8e1da692013-10-12 17:11:30212 gfx::Rect arbitrary_rect1_inside_rect2(44, 23, 4, 2);
213 gfx::Rect arbitrary_rect2_inside_rect2(41, 25, 3, 5);
[email protected]4934d362012-11-22 22:04:53214 gfx::Rect arbitrary_rect3(7, -53, 22, 19);
[email protected]8e1da692013-10-12 17:11:30215 gfx::Rect arbitrary_rect1_inside_rect3(10, -40, 6, 3);
216 gfx::Rect arbitrary_rect2_inside_rect3(12, -51, 5, 12);
[email protected]4934d362012-11-22 22:04:53217 gfx::Size arbitrary_size1(15, 19);
218 gfx::Size arbitrary_size2(3, 99);
219 gfx::Size arbitrary_size3(75, 1281);
220 gfx::RectF arbitrary_rectf1(4.2f, -922.1f, 15.6f, 29.5f);
221 gfx::SizeF arbitrary_sizef1(15.2f, 104.6f);
[email protected]61df9d82013-01-30 02:32:42222 gfx::PointF arbitrary_pointf1(31.4f, 15.9f);
223 gfx::PointF arbitrary_pointf2(26.5f, -35.8f);
[email protected]4934d362012-11-22 22:04:53224 float arbitrary_float1 = 0.7f;
225 float arbitrary_float2 = 0.3f;
226 float arbitrary_float3 = 0.9f;
[email protected]61df9d82013-01-30 02:32:42227 float arbitrary_float_array[4] = {3.5f, 6.2f, 9.3f, 12.3f};
[email protected]4934d362012-11-22 22:04:53228 bool arbitrary_bool1 = true;
229 bool arbitrary_bool2 = false;
[email protected]61df9d82013-01-30 02:32:42230 bool arbitrary_bool3 = true;
[email protected]4934d362012-11-22 22:04:53231 int arbitrary_int = 5;
232 SkColor arbitrary_color = SkColorSetARGB(25, 36, 47, 58);
233 IOSurfaceDrawQuad::Orientation arbitrary_orientation =
234 IOSurfaceDrawQuad::UNFLIPPED;
235 RenderPass::Id arbitrary_id(10, 14);
[email protected]b7cfc632013-04-10 04:44:49236 ResourceProvider::ResourceId arbitrary_resourceid1 = 55;
237 ResourceProvider::ResourceId arbitrary_resourceid2 = 47;
238 ResourceProvider::ResourceId arbitrary_resourceid3 = 23;
[email protected]0402b2382013-06-07 21:50:54239 ResourceProvider::ResourceId arbitrary_resourceid4 = 16;
[email protected]a1765672013-08-12 23:45:02240 SkScalar arbitrary_sigma = SkFloatToScalar(2.0f);
[email protected]4934d362012-11-22 22:04:53241
[email protected]ae6b1a72013-06-25 18:49:29242 FilterOperations arbitrary_filters1;
243 arbitrary_filters1.Append(FilterOperation::CreateGrayscaleFilter(
[email protected]4934d362012-11-22 22:04:53244 arbitrary_float1));
[email protected]1dc7943e2013-09-26 04:41:48245 skia::RefPtr<SkImageFilter> arbitrary_filter = skia::AdoptRef(
246 new SkBlurImageFilter(arbitrary_sigma, arbitrary_sigma));
247 arbitrary_filters1.Append(
248 cc::FilterOperation::CreateReferenceFilter(arbitrary_filter));
[email protected]4934d362012-11-22 22:04:53249
[email protected]ae6b1a72013-06-25 18:49:29250 FilterOperations arbitrary_filters2;
251 arbitrary_filters2.Append(FilterOperation::CreateBrightnessFilter(
[email protected]4934d362012-11-22 22:04:53252 arbitrary_float2));
253
254 scoped_ptr<SharedQuadState> shared_state1_in = SharedQuadState::Create();
255 shared_state1_in->SetAll(arbitrary_matrix,
[email protected]f902bf92013-03-04 18:33:27256 arbitrary_size1,
[email protected]4934d362012-11-22 22:04:53257 arbitrary_rect1,
258 arbitrary_rect2,
[email protected]4934d362012-11-22 22:04:53259 arbitrary_bool1,
260 arbitrary_float1);
261 scoped_ptr<SharedQuadState> shared_state1_cmp = shared_state1_in->Copy();
262
263 scoped_ptr<CheckerboardDrawQuad> checkerboard_in =
264 CheckerboardDrawQuad::Create();
265 checkerboard_in->SetAll(shared_state1_in.get(),
266 arbitrary_rect1,
[email protected]8e1da692013-10-12 17:11:30267 arbitrary_rect2_inside_rect1,
268 arbitrary_rect1_inside_rect1,
[email protected]4934d362012-11-22 22:04:53269 arbitrary_bool1,
270 arbitrary_color);
271 scoped_ptr<DrawQuad> checkerboard_cmp = checkerboard_in->Copy(
272 checkerboard_in->shared_quad_state);
273
274 scoped_ptr<DebugBorderDrawQuad> debugborder_in =
275 DebugBorderDrawQuad::Create();
276 debugborder_in->SetAll(shared_state1_in.get(),
277 arbitrary_rect3,
[email protected]8e1da692013-10-12 17:11:30278 arbitrary_rect1_inside_rect3,
279 arbitrary_rect2_inside_rect3,
[email protected]4934d362012-11-22 22:04:53280 arbitrary_bool1,
281 arbitrary_color,
282 arbitrary_int);
283 scoped_ptr<DrawQuad> debugborder_cmp = debugborder_in->Copy(
284 debugborder_in->shared_quad_state);
285
286 scoped_ptr<IOSurfaceDrawQuad> iosurface_in =
287 IOSurfaceDrawQuad::Create();
288 iosurface_in->SetAll(shared_state1_in.get(),
289 arbitrary_rect2,
[email protected]8e1da692013-10-12 17:11:30290 arbitrary_rect2_inside_rect2,
291 arbitrary_rect1_inside_rect2,
[email protected]4934d362012-11-22 22:04:53292 arbitrary_bool1,
293 arbitrary_size1,
[email protected]b7cfc632013-04-10 04:44:49294 arbitrary_resourceid3,
[email protected]4934d362012-11-22 22:04:53295 arbitrary_orientation);
296 scoped_ptr<DrawQuad> iosurface_cmp = iosurface_in->Copy(
297 iosurface_in->shared_quad_state);
298
[email protected]cbe94b7a2013-11-13 11:03:37299 scoped_ptr<SharedQuadState> shared_state2_in = SharedQuadState::Create();
300 shared_state2_in->SetAll(arbitrary_matrix,
301 arbitrary_size2,
302 arbitrary_rect2,
303 arbitrary_rect3,
304 arbitrary_bool1,
305 arbitrary_float2);
306 scoped_ptr<SharedQuadState> shared_state2_cmp = shared_state2_in->Copy();
307
[email protected]4934d362012-11-22 22:04:53308 scoped_ptr<RenderPassDrawQuad> renderpass_in =
309 RenderPassDrawQuad::Create();
[email protected]cbe94b7a2013-11-13 11:03:37310 renderpass_in->SetAll(shared_state2_in.get(),
[email protected]4934d362012-11-22 22:04:53311 arbitrary_rect1,
[email protected]8e1da692013-10-12 17:11:30312 arbitrary_rect2_inside_rect1,
313 arbitrary_rect1_inside_rect1,
[email protected]4934d362012-11-22 22:04:53314 arbitrary_bool1,
315 arbitrary_id,
316 arbitrary_bool2,
[email protected]b7cfc632013-04-10 04:44:49317 arbitrary_resourceid2,
[email protected]4934d362012-11-22 22:04:53318 arbitrary_rect1,
[email protected]20062042012-12-21 22:16:36319 arbitrary_rectf1,
320 arbitrary_filters1,
[email protected]20062042012-12-21 22:16:36321 arbitrary_filters2);
[email protected]4934d362012-11-22 22:04:53322 scoped_ptr<RenderPassDrawQuad> renderpass_cmp = renderpass_in->Copy(
323 renderpass_in->shared_quad_state, renderpass_in->render_pass_id);
324
[email protected]4934d362012-11-22 22:04:53325 scoped_ptr<SharedQuadState> shared_state3_in = SharedQuadState::Create();
326 shared_state3_in->SetAll(arbitrary_matrix,
[email protected]f902bf92013-03-04 18:33:27327 arbitrary_size3,
[email protected]4934d362012-11-22 22:04:53328 arbitrary_rect3,
329 arbitrary_rect1,
[email protected]4934d362012-11-22 22:04:53330 arbitrary_bool1,
331 arbitrary_float3);
332 scoped_ptr<SharedQuadState> shared_state3_cmp = shared_state3_in->Copy();
333
334 scoped_ptr<SolidColorDrawQuad> solidcolor_in =
335 SolidColorDrawQuad::Create();
[email protected]cbe94b7a2013-11-13 11:03:37336 solidcolor_in->SetAll(shared_state3_in.get(),
[email protected]4934d362012-11-22 22:04:53337 arbitrary_rect3,
[email protected]8e1da692013-10-12 17:11:30338 arbitrary_rect1_inside_rect3,
339 arbitrary_rect2_inside_rect3,
[email protected]4934d362012-11-22 22:04:53340 arbitrary_bool1,
[email protected]10a30b12013-05-02 16:42:11341 arbitrary_color,
342 arbitrary_bool2);
[email protected]4934d362012-11-22 22:04:53343 scoped_ptr<DrawQuad> solidcolor_cmp = solidcolor_in->Copy(
344 solidcolor_in->shared_quad_state);
345
346 scoped_ptr<StreamVideoDrawQuad> streamvideo_in =
347 StreamVideoDrawQuad::Create();
[email protected]cbe94b7a2013-11-13 11:03:37348 streamvideo_in->SetAll(shared_state3_in.get(),
[email protected]4934d362012-11-22 22:04:53349 arbitrary_rect2,
[email protected]8e1da692013-10-12 17:11:30350 arbitrary_rect2_inside_rect2,
351 arbitrary_rect1_inside_rect2,
[email protected]4934d362012-11-22 22:04:53352 arbitrary_bool1,
[email protected]b7cfc632013-04-10 04:44:49353 arbitrary_resourceid2,
[email protected]4934d362012-11-22 22:04:53354 arbitrary_matrix);
355 scoped_ptr<DrawQuad> streamvideo_cmp = streamvideo_in->Copy(
356 streamvideo_in->shared_quad_state);
357
[email protected]61df9d82013-01-30 02:32:42358 scoped_ptr<TextureDrawQuad> texture_in = TextureDrawQuad::Create();
[email protected]cbe94b7a2013-11-13 11:03:37359 texture_in->SetAll(shared_state3_in.get(),
[email protected]61df9d82013-01-30 02:32:42360 arbitrary_rect2,
[email protected]8e1da692013-10-12 17:11:30361 arbitrary_rect2_inside_rect2,
362 arbitrary_rect1_inside_rect2,
[email protected]61df9d82013-01-30 02:32:42363 arbitrary_bool1,
[email protected]b7cfc632013-04-10 04:44:49364 arbitrary_resourceid1,
[email protected]61df9d82013-01-30 02:32:42365 arbitrary_bool2,
366 arbitrary_pointf1,
367 arbitrary_pointf2,
[email protected]d18b4d62013-07-12 05:33:49368 arbitrary_color,
[email protected]61df9d82013-01-30 02:32:42369 arbitrary_float_array,
370 arbitrary_bool3);
371 scoped_ptr<DrawQuad> texture_cmp = texture_in->Copy(
372 texture_in->shared_quad_state);
373
374 scoped_ptr<TileDrawQuad> tile_in = TileDrawQuad::Create();
[email protected]cbe94b7a2013-11-13 11:03:37375 tile_in->SetAll(shared_state3_in.get(),
[email protected]61df9d82013-01-30 02:32:42376 arbitrary_rect2,
[email protected]8e1da692013-10-12 17:11:30377 arbitrary_rect2_inside_rect2,
378 arbitrary_rect1_inside_rect2,
[email protected]61df9d82013-01-30 02:32:42379 arbitrary_bool1,
[email protected]b7cfc632013-04-10 04:44:49380 arbitrary_resourceid3,
[email protected]61df9d82013-01-30 02:32:42381 arbitrary_rectf1,
382 arbitrary_size1,
[email protected]f902bf92013-03-04 18:33:27383 arbitrary_bool2);
[email protected]61df9d82013-01-30 02:32:42384 scoped_ptr<DrawQuad> tile_cmp = tile_in->Copy(
385 tile_in->shared_quad_state);
386
[email protected]4934d362012-11-22 22:04:53387 scoped_ptr<YUVVideoDrawQuad> yuvvideo_in =
388 YUVVideoDrawQuad::Create();
[email protected]cbe94b7a2013-11-13 11:03:37389 yuvvideo_in->SetAll(shared_state3_in.get(),
[email protected]4934d362012-11-22 22:04:53390 arbitrary_rect1,
[email protected]8e1da692013-10-12 17:11:30391 arbitrary_rect2_inside_rect1,
392 arbitrary_rect1_inside_rect1,
[email protected]4934d362012-11-22 22:04:53393 arbitrary_bool1,
394 arbitrary_sizef1,
[email protected]b7cfc632013-04-10 04:44:49395 arbitrary_resourceid1,
396 arbitrary_resourceid2,
[email protected]0402b2382013-06-07 21:50:54397 arbitrary_resourceid3,
398 arbitrary_resourceid4);
[email protected]4934d362012-11-22 22:04:53399 scoped_ptr<DrawQuad> yuvvideo_cmp = yuvvideo_in->Copy(
400 yuvvideo_in->shared_quad_state);
401
402 scoped_ptr<RenderPass> pass_in = RenderPass::Create();
403 pass_in->SetAll(arbitrary_id,
404 arbitrary_rect1,
405 arbitrary_rectf1,
406 arbitrary_matrix,
[email protected]fbc293322013-10-01 05:07:15407 arbitrary_bool1);
[email protected]4934d362012-11-22 22:04:53408
[email protected]ead39c52013-01-09 07:22:45409 pass_in->shared_quad_state_list.push_back(shared_state1_in.Pass());
410 pass_in->quad_list.push_back(checkerboard_in.PassAs<DrawQuad>());
411 pass_in->quad_list.push_back(debugborder_in.PassAs<DrawQuad>());
412 pass_in->quad_list.push_back(iosurface_in.PassAs<DrawQuad>());
413 pass_in->quad_list.push_back(renderpass_in.PassAs<DrawQuad>());
414 pass_in->shared_quad_state_list.push_back(shared_state2_in.Pass());
415 pass_in->shared_quad_state_list.push_back(shared_state3_in.Pass());
416 pass_in->quad_list.push_back(solidcolor_in.PassAs<DrawQuad>());
417 pass_in->quad_list.push_back(streamvideo_in.PassAs<DrawQuad>());
[email protected]61df9d82013-01-30 02:32:42418 pass_in->quad_list.push_back(texture_in.PassAs<DrawQuad>());
419 pass_in->quad_list.push_back(tile_in.PassAs<DrawQuad>());
[email protected]ead39c52013-01-09 07:22:45420 pass_in->quad_list.push_back(yuvvideo_in.PassAs<DrawQuad>());
[email protected]4934d362012-11-22 22:04:53421
422 scoped_ptr<RenderPass> pass_cmp = RenderPass::Create();
423 pass_cmp->SetAll(arbitrary_id,
424 arbitrary_rect1,
425 arbitrary_rectf1,
426 arbitrary_matrix,
[email protected]fbc293322013-10-01 05:07:15427 arbitrary_bool1);
[email protected]4934d362012-11-22 22:04:53428
[email protected]ead39c52013-01-09 07:22:45429 pass_cmp->shared_quad_state_list.push_back(shared_state1_cmp.Pass());
430 pass_cmp->quad_list.push_back(checkerboard_cmp.PassAs<DrawQuad>());
431 pass_cmp->quad_list.push_back(debugborder_cmp.PassAs<DrawQuad>());
432 pass_cmp->quad_list.push_back(iosurface_cmp.PassAs<DrawQuad>());
433 pass_cmp->quad_list.push_back(renderpass_cmp.PassAs<DrawQuad>());
434 pass_cmp->shared_quad_state_list.push_back(shared_state2_cmp.Pass());
435 pass_cmp->shared_quad_state_list.push_back(shared_state3_cmp.Pass());
436 pass_cmp->quad_list.push_back(solidcolor_cmp.PassAs<DrawQuad>());
437 pass_cmp->quad_list.push_back(streamvideo_cmp.PassAs<DrawQuad>());
[email protected]61df9d82013-01-30 02:32:42438 pass_cmp->quad_list.push_back(texture_cmp.PassAs<DrawQuad>());
439 pass_cmp->quad_list.push_back(tile_cmp.PassAs<DrawQuad>());
[email protected]ead39c52013-01-09 07:22:45440 pass_cmp->quad_list.push_back(yuvvideo_cmp.PassAs<DrawQuad>());
[email protected]4934d362012-11-22 22:04:53441
442 // Make sure the in and cmp RenderPasses match.
443 Compare(pass_cmp.get(), pass_in.get());
444 ASSERT_EQ(3u, pass_in->shared_quad_state_list.size());
[email protected]61df9d82013-01-30 02:32:42445 ASSERT_EQ(9u, pass_in->quad_list.size());
[email protected]4934d362012-11-22 22:04:53446 for (size_t i = 0; i < 3; ++i) {
447 Compare(pass_cmp->shared_quad_state_list[i],
448 pass_in->shared_quad_state_list[i]);
449 }
[email protected]61df9d82013-01-30 02:32:42450 for (size_t i = 0; i < pass_in->quad_list.size(); ++i)
[email protected]4934d362012-11-22 22:04:53451 Compare(pass_cmp->quad_list[i], pass_in->quad_list[i]);
[email protected]61df9d82013-01-30 02:32:42452 for (size_t i = 1; i < pass_in->quad_list.size(); ++i) {
[email protected]4934d362012-11-22 22:04:53453 bool same_shared_quad_state_cmp =
454 pass_cmp->quad_list[i]->shared_quad_state ==
455 pass_cmp->quad_list[i - 1]->shared_quad_state;
456 bool same_shared_quad_state_in =
457 pass_in->quad_list[i]->shared_quad_state ==
458 pass_in->quad_list[i - 1]->shared_quad_state;
459 EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_in);
460 }
461
[email protected]bf189f62012-12-18 03:42:11462 DelegatedFrameData frame_in;
[email protected]ead39c52013-01-09 07:22:45463 frame_in.render_pass_list.push_back(pass_in.Pass());
[email protected]4934d362012-11-22 22:04:53464
[email protected]bf189f62012-12-18 03:42:11465 IPC::ParamTraits<DelegatedFrameData>::Write(&msg, frame_in);
[email protected]bca159072012-12-04 00:52:44466
[email protected]bf189f62012-12-18 03:42:11467 DelegatedFrameData frame_out;
[email protected]4934d362012-11-22 22:04:53468 PickleIterator iter(msg);
[email protected]bf189f62012-12-18 03:42:11469 EXPECT_TRUE(IPC::ParamTraits<DelegatedFrameData>::Read(&msg,
470 &iter, &frame_out));
[email protected]bca159072012-12-04 00:52:44471
[email protected]4934d362012-11-22 22:04:53472 // Make sure the out and cmp RenderPasses match.
[email protected]ead39c52013-01-09 07:22:45473 scoped_ptr<RenderPass> pass_out = frame_out.render_pass_list.take(
474 frame_out.render_pass_list.begin());
[email protected]4934d362012-11-22 22:04:53475 Compare(pass_cmp.get(), pass_out.get());
476 ASSERT_EQ(3u, pass_out->shared_quad_state_list.size());
[email protected]61df9d82013-01-30 02:32:42477 ASSERT_EQ(9u, pass_out->quad_list.size());
[email protected]4934d362012-11-22 22:04:53478 for (size_t i = 0; i < 3; ++i) {
479 Compare(pass_cmp->shared_quad_state_list[i],
480 pass_out->shared_quad_state_list[i]);
481 }
[email protected]61df9d82013-01-30 02:32:42482 for (size_t i = 0; i < pass_out->quad_list.size(); ++i)
[email protected]4934d362012-11-22 22:04:53483 Compare(pass_cmp->quad_list[i], pass_out->quad_list[i]);
[email protected]61df9d82013-01-30 02:32:42484 for (size_t i = 1; i < pass_out->quad_list.size(); ++i) {
[email protected]4934d362012-11-22 22:04:53485 bool same_shared_quad_state_cmp =
486 pass_cmp->quad_list[i]->shared_quad_state ==
487 pass_cmp->quad_list[i - 1]->shared_quad_state;
488 bool same_shared_quad_state_out =
489 pass_out->quad_list[i]->shared_quad_state ==
490 pass_out->quad_list[i - 1]->shared_quad_state;
491 EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_out);
492 }
493}
[email protected]bca159072012-12-04 00:52:44494
[email protected]cbe94b7a2013-11-13 11:03:37495TEST_F(CCMessagesTest, UnusedSharedQuadStates) {
496 scoped_ptr<CheckerboardDrawQuad> quad;
497
498 scoped_ptr<RenderPass> pass_in = RenderPass::Create();
499 pass_in->SetAll(RenderPass::Id(1, 1),
500 gfx::Rect(100, 100),
501 gfx::RectF(),
502 gfx::Transform(),
503 false);
504
505 // The first SharedQuadState is used.
506 scoped_ptr<SharedQuadState> shared_state1_in = SharedQuadState::Create();
507 shared_state1_in->SetAll(
508 gfx::Transform(), gfx::Size(1, 1), gfx::Rect(), gfx::Rect(), false, 1.f);
509
510 quad = CheckerboardDrawQuad::Create();
511 quad->SetAll(shared_state1_in.get(),
512 gfx::Rect(10, 10),
513 gfx::Rect(10, 10),
514 gfx::Rect(10, 10),
515 false,
516 SK_ColorRED);
517 pass_in->quad_list.push_back(quad.PassAs<DrawQuad>());
518
519 // The second and third SharedQuadStates are not used.
520 scoped_ptr<SharedQuadState> shared_state2_in = SharedQuadState::Create();
521 shared_state2_in->SetAll(
522 gfx::Transform(), gfx::Size(2, 2), gfx::Rect(), gfx::Rect(), false, 1.f);
523
524 scoped_ptr<SharedQuadState> shared_state3_in = SharedQuadState::Create();
525 shared_state3_in->SetAll(
526 gfx::Transform(), gfx::Size(3, 3), gfx::Rect(), gfx::Rect(), false, 1.f);
527
528 // The fourth SharedQuadState is used.
529 scoped_ptr<SharedQuadState> shared_state4_in = SharedQuadState::Create();
530 shared_state4_in->SetAll(
531 gfx::Transform(), gfx::Size(4, 4), gfx::Rect(), gfx::Rect(), false, 1.f);
532
533 quad = CheckerboardDrawQuad::Create();
534 quad->SetAll(shared_state4_in.get(),
535 gfx::Rect(10, 10),
536 gfx::Rect(10, 10),
537 gfx::Rect(10, 10),
538 false,
539 SK_ColorRED);
540 pass_in->quad_list.push_back(quad.PassAs<DrawQuad>());
541
542 // The fifth is not used again.
543 scoped_ptr<SharedQuadState> shared_state5_in = SharedQuadState::Create();
544 shared_state5_in->SetAll(
545 gfx::Transform(), gfx::Size(5, 5), gfx::Rect(), gfx::Rect(), false, 1.f);
546
547 pass_in->shared_quad_state_list.push_back(shared_state1_in.Pass());
548 pass_in->shared_quad_state_list.push_back(shared_state2_in.Pass());
549 pass_in->shared_quad_state_list.push_back(shared_state3_in.Pass());
550 pass_in->shared_quad_state_list.push_back(shared_state4_in.Pass());
551 pass_in->shared_quad_state_list.push_back(shared_state5_in.Pass());
552
553 // 5 SharedQuadStates go in.
554 ASSERT_EQ(5u, pass_in->shared_quad_state_list.size());
555 ASSERT_EQ(2u, pass_in->quad_list.size());
556
557 DelegatedFrameData frame_in;
558 frame_in.render_pass_list.push_back(pass_in.Pass());
559
560 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
561 IPC::ParamTraits<DelegatedFrameData>::Write(&msg, frame_in);
562
563 DelegatedFrameData frame_out;
564 PickleIterator iter(msg);
565 EXPECT_TRUE(
566 IPC::ParamTraits<DelegatedFrameData>::Read(&msg, &iter, &frame_out));
567
568 scoped_ptr<RenderPass> pass_out =
569 frame_out.render_pass_list.take(frame_out.render_pass_list.begin());
570
571 // 2 SharedQuadStates come out. The first and fourth SharedQuadStates were
572 // used by quads, and so serialized. Others were not.
573 ASSERT_EQ(2u, pass_out->shared_quad_state_list.size());
574 ASSERT_EQ(2u, pass_out->quad_list.size());
575
576 EXPECT_EQ(gfx::Size(1, 1).ToString(),
577 pass_out->shared_quad_state_list[0]->content_bounds.ToString());
578 EXPECT_EQ(gfx::Size(4, 4).ToString(),
579 pass_out->shared_quad_state_list[1]->content_bounds.ToString());
580}
581
[email protected]bca159072012-12-04 00:52:44582TEST_F(CCMessagesTest, Resources) {
[email protected]753bb252013-11-04 22:28:12583 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
[email protected]bca159072012-12-04 00:52:44584 gfx::Size arbitrary_size(757, 1281);
[email protected]09831f7f2013-02-27 03:32:15585 unsigned int arbitrary_uint1 = 71234838;
586 unsigned int arbitrary_uint2 = 53589793;
[email protected]bca159072012-12-04 00:52:44587
588 GLbyte arbitrary_mailbox1[64] = {
589 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
590 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
591 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
592 1, 2, 3, 4
593 };
594
595 GLbyte arbitrary_mailbox2[64] = {
596 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0,
597 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0,
598 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0,
599 0, 9, 8, 7
600 };
601
602 TransferableResource arbitrary_resource1;
603 arbitrary_resource1.id = 2178312;
[email protected]09831f7f2013-02-27 03:32:15604 arbitrary_resource1.sync_point = arbitrary_uint1;
[email protected]27a41fe2013-09-19 05:05:14605 arbitrary_resource1.format = cc::RGBA_8888;
[email protected]645a47f22013-09-26 05:42:32606 arbitrary_resource1.target = GL_TEXTURE_2D;
[email protected]80189292013-02-28 01:59:36607 arbitrary_resource1.filter = 53;
[email protected]bca159072012-12-04 00:52:44608 arbitrary_resource1.size = gfx::Size(37189, 123123);
[email protected]1aca0092013-03-04 22:46:03609 arbitrary_resource1.mailbox.SetName(arbitrary_mailbox1);
[email protected]bca159072012-12-04 00:52:44610
611 TransferableResource arbitrary_resource2;
612 arbitrary_resource2.id = 789132;
[email protected]645a47f22013-09-26 05:42:32613 arbitrary_resource2.sync_point = arbitrary_uint2;
[email protected]27a41fe2013-09-19 05:05:14614 arbitrary_resource2.format = cc::RGBA_4444;
[email protected]645a47f22013-09-26 05:42:32615 arbitrary_resource2.target = GL_TEXTURE_EXTERNAL_OES;
616 arbitrary_resource2.filter = 47;
[email protected]bca159072012-12-04 00:52:44617 arbitrary_resource2.size = gfx::Size(89123, 23789);
[email protected]1aca0092013-03-04 22:46:03618 arbitrary_resource2.mailbox.SetName(arbitrary_mailbox2);
[email protected]bca159072012-12-04 00:52:44619
[email protected]cb7d6492013-10-03 02:40:04620 scoped_ptr<RenderPass> renderpass_in = RenderPass::Create();
621 renderpass_in->SetNew(
622 RenderPass::Id(1, 1), gfx::Rect(), gfx::Rect(), gfx::Transform());
623
[email protected]bf189f62012-12-18 03:42:11624 DelegatedFrameData frame_in;
[email protected]09831f7f2013-02-27 03:32:15625 frame_in.resource_list.push_back(arbitrary_resource1);
626 frame_in.resource_list.push_back(arbitrary_resource2);
[email protected]cb7d6492013-10-03 02:40:04627 frame_in.render_pass_list.push_back(renderpass_in.Pass());
[email protected]bca159072012-12-04 00:52:44628
[email protected]bf189f62012-12-18 03:42:11629 IPC::ParamTraits<DelegatedFrameData>::Write(&msg, frame_in);
[email protected]bca159072012-12-04 00:52:44630
[email protected]bf189f62012-12-18 03:42:11631 DelegatedFrameData frame_out;
[email protected]bca159072012-12-04 00:52:44632 PickleIterator iter(msg);
[email protected]bf189f62012-12-18 03:42:11633 EXPECT_TRUE(IPC::ParamTraits<DelegatedFrameData>::Read(&msg,
634 &iter, &frame_out));
[email protected]bca159072012-12-04 00:52:44635
[email protected]09831f7f2013-02-27 03:32:15636 ASSERT_EQ(2u, frame_out.resource_list.size());
637 Compare(arbitrary_resource1, frame_out.resource_list[0]);
638 Compare(arbitrary_resource2, frame_out.resource_list[1]);
[email protected]bca159072012-12-04 00:52:44639}
640
[email protected]032bfc42013-10-29 22:23:52641TEST_F(CCMessagesTest, LargestQuadType) {
642 size_t largest = 0;
643
644 bool done = false;
645 for (int i = 0; !done; ++i) {
646 switch (static_cast<DrawQuad::Material>(i)) {
647 case cc::DrawQuad::CHECKERBOARD:
648 largest = std::max(largest, sizeof(cc::CheckerboardDrawQuad));
649 break;
650 case cc::DrawQuad::DEBUG_BORDER:
651 largest = std::max(largest, sizeof(cc::DebugBorderDrawQuad));
652 break;
653 case cc::DrawQuad::IO_SURFACE_CONTENT:
654 largest = std::max(largest, sizeof(cc::IOSurfaceDrawQuad));
655 break;
656 case cc::DrawQuad::PICTURE_CONTENT:
657 largest = std::max(largest, sizeof(cc::PictureDrawQuad));
658 break;
659 case cc::DrawQuad::TEXTURE_CONTENT:
660 largest = std::max(largest, sizeof(cc::TextureDrawQuad));
661 break;
662 case cc::DrawQuad::RENDER_PASS:
663 largest = std::max(largest, sizeof(cc::RenderPassDrawQuad));
664 break;
665 case cc::DrawQuad::SOLID_COLOR:
666 largest = std::max(largest, sizeof(cc::SolidColorDrawQuad));
667 break;
668 case cc::DrawQuad::TILED_CONTENT:
669 largest = std::max(largest, sizeof(cc::TileDrawQuad));
670 break;
671 case cc::DrawQuad::STREAM_VIDEO_CONTENT:
672 largest = std::max(largest, sizeof(cc::StreamVideoDrawQuad));
673 break;
674 case cc::DrawQuad::YUV_VIDEO_CONTENT:
675 largest = std::max(largest, sizeof(cc::YUVVideoDrawQuad));
676 break;
677 case cc::DrawQuad::INVALID:
678 break;
679 default:
680 done = true;
681 }
682 }
683
684 // Verify the largest DrawQuad type is RenderPassDrawQuad. If this ever
685 // changes, then the ReserveSizeForRenderPassWrite() method needs to be
686 // updated as well to use the new largest quad.
687 EXPECT_EQ(sizeof(RenderPassDrawQuad), largest);
688}
689
[email protected]bca159072012-12-04 00:52:44690} // namespace
691} // namespace content