1 // 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.
5 #include "content/common/cc_messages.h"
11 #include "cc/output/compositor_frame.h"
12 #include "ipc/ipc_message.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "third_party/khronos/GLES2/gl2ext.h"
15 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
17 using cc::CheckerboardDrawQuad;
18 using cc::DelegatedFrameData;
19 using cc::DebugBorderDrawQuad;
21 using cc::FilterOperation;
22 using cc::FilterOperations;
23 using cc::IOSurfaceDrawQuad;
24 using cc::PictureDrawQuad;
26 using cc::RenderPassDrawQuad;
27 using cc::ResourceProvider;
28 using cc::SharedQuadState;
29 using cc::SolidColorDrawQuad;
30 using cc::SurfaceDrawQuad;
31 using cc::TextureDrawQuad;
32 using cc::TileDrawQuad;
33 using cc::TransferableResource;
34 using cc::StreamVideoDrawQuad;
35 using cc::VideoLayerImpl;
36 using cc::YUVVideoDrawQuad;
42 class CCMessagesTest : public testing::Test {
44 void Compare(const RenderPass* a, const RenderPass* b) {
45 EXPECT_EQ(a->id, b->id);
46 EXPECT_EQ(a->output_rect.ToString(), b->output_rect.ToString());
47 EXPECT_EQ(a->damage_rect.ToString(), b->damage_rect.ToString());
48 EXPECT_EQ(a->transform_to_root_target, b->transform_to_root_target);
49 EXPECT_EQ(a->has_transparent_background, b->has_transparent_background);
52 void Compare(const SharedQuadState* a, const SharedQuadState* b) {
53 EXPECT_EQ(a->content_to_target_transform, b->content_to_target_transform);
54 EXPECT_EQ(a->content_bounds, b->content_bounds);
55 EXPECT_EQ(a->visible_content_rect, b->visible_content_rect);
56 EXPECT_EQ(a->clip_rect, b->clip_rect);
57 EXPECT_EQ(a->is_clipped, b->is_clipped);
58 EXPECT_EQ(a->opacity, b->opacity);
59 EXPECT_EQ(a->blend_mode, b->blend_mode);
62 void Compare(const DrawQuad* a, const DrawQuad* b) {
63 ASSERT_NE(DrawQuad::INVALID, a->material);
64 ASSERT_EQ(a->material, b->material);
65 EXPECT_EQ(a->rect.ToString(), b->rect.ToString());
66 EXPECT_EQ(a->opaque_rect.ToString(), b->opaque_rect.ToString());
67 EXPECT_EQ(a->visible_rect.ToString(), b->visible_rect.ToString());
68 EXPECT_EQ(a->needs_blending, b->needs_blending);
70 Compare(a->shared_quad_state, b->shared_quad_state);
72 switch (a->material) {
73 case DrawQuad::CHECKERBOARD:
74 Compare(CheckerboardDrawQuad::MaterialCast(a),
75 CheckerboardDrawQuad::MaterialCast(b));
77 case DrawQuad::DEBUG_BORDER:
78 Compare(DebugBorderDrawQuad::MaterialCast(a),
79 DebugBorderDrawQuad::MaterialCast(b));
81 case DrawQuad::IO_SURFACE_CONTENT:
82 Compare(IOSurfaceDrawQuad::MaterialCast(a),
83 IOSurfaceDrawQuad::MaterialCast(b));
85 case DrawQuad::PICTURE_CONTENT:
86 Compare(PictureDrawQuad::MaterialCast(a),
87 PictureDrawQuad::MaterialCast(b));
89 case DrawQuad::RENDER_PASS:
90 Compare(RenderPassDrawQuad::MaterialCast(a),
91 RenderPassDrawQuad::MaterialCast(b));
93 case DrawQuad::TEXTURE_CONTENT:
94 Compare(TextureDrawQuad::MaterialCast(a),
95 TextureDrawQuad::MaterialCast(b));
97 case DrawQuad::TILED_CONTENT:
98 Compare(TileDrawQuad::MaterialCast(a),
99 TileDrawQuad::MaterialCast(b));
101 case DrawQuad::SOLID_COLOR:
102 Compare(SolidColorDrawQuad::MaterialCast(a),
103 SolidColorDrawQuad::MaterialCast(b));
105 case DrawQuad::STREAM_VIDEO_CONTENT:
106 Compare(StreamVideoDrawQuad::MaterialCast(a),
107 StreamVideoDrawQuad::MaterialCast(b));
109 case DrawQuad::SURFACE_CONTENT:
110 Compare(SurfaceDrawQuad::MaterialCast(a),
111 SurfaceDrawQuad::MaterialCast(b));
113 case DrawQuad::YUV_VIDEO_CONTENT:
114 Compare(YUVVideoDrawQuad::MaterialCast(a),
115 YUVVideoDrawQuad::MaterialCast(b));
117 case DrawQuad::INVALID:
122 void Compare(const CheckerboardDrawQuad* a, const CheckerboardDrawQuad* b) {
123 EXPECT_EQ(a->color, b->color);
126 void Compare(const DebugBorderDrawQuad* a, const DebugBorderDrawQuad* b) {
127 EXPECT_EQ(a->color, b->color);
128 EXPECT_EQ(a->width, b->width);
131 void Compare(const IOSurfaceDrawQuad* a, const IOSurfaceDrawQuad* b) {
132 EXPECT_EQ(a->io_surface_size.ToString(), b->io_surface_size.ToString());
133 EXPECT_EQ(a->io_surface_resource_id, b->io_surface_resource_id);
134 EXPECT_EQ(a->orientation, b->orientation);
137 void Compare(const RenderPassDrawQuad* a, const RenderPassDrawQuad* b) {
138 EXPECT_EQ(a->render_pass_id, b->render_pass_id);
139 EXPECT_EQ(a->is_replica, b->is_replica);
140 EXPECT_EQ(a->mask_resource_id, b->mask_resource_id);
141 EXPECT_EQ(a->contents_changed_since_last_frame,
142 b->contents_changed_since_last_frame);
143 EXPECT_EQ(a->mask_uv_rect.ToString(), b->mask_uv_rect.ToString());
144 EXPECT_EQ(a->filters.size(), b->filters.size());
145 for (size_t i = 0; i < a->filters.size(); ++i) {
146 if (a->filters.at(i).type() != cc::FilterOperation::REFERENCE) {
147 EXPECT_EQ(a->filters.at(i), b->filters.at(i));
149 EXPECT_EQ(b->filters.at(i).type(), cc::FilterOperation::REFERENCE);
150 EXPECT_EQ(a->filters.at(i).image_filter()->countInputs(),
151 b->filters.at(i).image_filter()->countInputs());
154 EXPECT_EQ(a->background_filters, b->background_filters);
157 void Compare(const SolidColorDrawQuad* a, const SolidColorDrawQuad* b) {
158 EXPECT_EQ(a->color, b->color);
159 EXPECT_EQ(a->force_anti_aliasing_off, b->force_anti_aliasing_off);
162 void Compare(const StreamVideoDrawQuad* a, const StreamVideoDrawQuad* b) {
163 EXPECT_EQ(a->resource_id, b->resource_id);
164 EXPECT_EQ(a->matrix, b->matrix);
167 void Compare(const SurfaceDrawQuad* a, const SurfaceDrawQuad* b) {
168 EXPECT_EQ(a->surface_id, b->surface_id);
171 void Compare(const TextureDrawQuad* a, const TextureDrawQuad* b) {
172 EXPECT_EQ(a->resource_id, b->resource_id);
173 EXPECT_EQ(a->premultiplied_alpha, b->premultiplied_alpha);
174 EXPECT_EQ(a->uv_top_left, b->uv_top_left);
175 EXPECT_EQ(a->uv_bottom_right, b->uv_bottom_right);
176 EXPECT_EQ(a->background_color, b->background_color);
177 EXPECT_EQ(a->vertex_opacity[0], b->vertex_opacity[0]);
178 EXPECT_EQ(a->vertex_opacity[1], b->vertex_opacity[1]);
179 EXPECT_EQ(a->vertex_opacity[2], b->vertex_opacity[2]);
180 EXPECT_EQ(a->vertex_opacity[3], b->vertex_opacity[3]);
181 EXPECT_EQ(a->flipped, b->flipped);
184 void Compare(const TileDrawQuad* a, const TileDrawQuad* b) {
185 EXPECT_EQ(a->resource_id, b->resource_id);
186 EXPECT_EQ(a->tex_coord_rect, b->tex_coord_rect);
187 EXPECT_EQ(a->texture_size, b->texture_size);
188 EXPECT_EQ(a->swizzle_contents, b->swizzle_contents);
191 void Compare(const YUVVideoDrawQuad* a, const YUVVideoDrawQuad* b) {
192 EXPECT_EQ(a->tex_scale, b->tex_scale);
193 EXPECT_EQ(a->y_plane_resource_id, b->y_plane_resource_id);
194 EXPECT_EQ(a->u_plane_resource_id, b->u_plane_resource_id);
195 EXPECT_EQ(a->v_plane_resource_id, b->v_plane_resource_id);
196 EXPECT_EQ(a->a_plane_resource_id, b->a_plane_resource_id);
199 void Compare(const TransferableResource& a, const TransferableResource& b) {
200 EXPECT_EQ(a.id, b.id);
201 EXPECT_EQ(a.format, b.format);
202 EXPECT_EQ(a.filter, b.filter);
203 EXPECT_EQ(a.size.ToString(), b.size.ToString());
204 for (size_t i = 0; i < arraysize(a.mailbox_holder.mailbox.name); ++i) {
205 EXPECT_EQ(a.mailbox_holder.mailbox.name[i],
206 b.mailbox_holder.mailbox.name[i]);
208 EXPECT_EQ(a.mailbox_holder.texture_target, b.mailbox_holder.texture_target);
209 EXPECT_EQ(a.mailbox_holder.sync_point, b.mailbox_holder.sync_point);
213 TEST_F(CCMessagesTest, AllQuads) {
214 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
216 Transform arbitrary_matrix;
217 arbitrary_matrix.Scale(3, 3);
218 arbitrary_matrix.Translate(-5, 20);
219 arbitrary_matrix.Rotate(15);
220 gfx::Rect arbitrary_rect1(-5, 9, 3, 15);
221 gfx::Rect arbitrary_rect1_inside_rect1(-4, 12, 2, 8);
222 gfx::Rect arbitrary_rect2_inside_rect1(-5, 11, 1, 2);
223 gfx::Rect arbitrary_rect2(40, 23, 11, 7);
224 gfx::Rect arbitrary_rect1_inside_rect2(44, 23, 4, 2);
225 gfx::Rect arbitrary_rect2_inside_rect2(41, 25, 3, 5);
226 gfx::Rect arbitrary_rect3(7, -53, 22, 19);
227 gfx::Rect arbitrary_rect1_inside_rect3(10, -40, 6, 3);
228 gfx::Rect arbitrary_rect2_inside_rect3(12, -51, 5, 12);
229 gfx::Size arbitrary_size1(15, 19);
230 gfx::Size arbitrary_size2(3, 99);
231 gfx::Size arbitrary_size3(75, 1281);
232 gfx::RectF arbitrary_rectf1(4.2f, -922.1f, 15.6f, 29.5f);
233 gfx::SizeF arbitrary_sizef1(15.2f, 104.6f);
234 gfx::PointF arbitrary_pointf1(31.4f, 15.9f);
235 gfx::PointF arbitrary_pointf2(26.5f, -35.8f);
236 float arbitrary_float1 = 0.7f;
237 float arbitrary_float2 = 0.3f;
238 float arbitrary_float3 = 0.9f;
239 float arbitrary_float_array[4] = {3.5f, 6.2f, 9.3f, 12.3f};
240 bool arbitrary_bool1 = true;
241 bool arbitrary_bool2 = false;
242 bool arbitrary_bool3 = true;
243 int arbitrary_int = 5;
244 SkColor arbitrary_color = SkColorSetARGB(25, 36, 47, 58);
245 SkXfermode::Mode arbitrary_blend_mode1 = SkXfermode::kScreen_Mode;
246 SkXfermode::Mode arbitrary_blend_mode2 = SkXfermode::kLighten_Mode;
247 SkXfermode::Mode arbitrary_blend_mode3 = SkXfermode::kOverlay_Mode;
248 IOSurfaceDrawQuad::Orientation arbitrary_orientation =
249 IOSurfaceDrawQuad::UNFLIPPED;
250 RenderPass::Id arbitrary_id(10, 14);
251 ResourceProvider::ResourceId arbitrary_resourceid1 = 55;
252 ResourceProvider::ResourceId arbitrary_resourceid2 = 47;
253 ResourceProvider::ResourceId arbitrary_resourceid3 = 23;
254 ResourceProvider::ResourceId arbitrary_resourceid4 = 16;
255 SkScalar arbitrary_sigma = SkFloatToScalar(2.0f);
257 FilterOperations arbitrary_filters1;
258 arbitrary_filters1.Append(FilterOperation::CreateGrayscaleFilter(
260 skia::RefPtr<SkImageFilter> arbitrary_filter = skia::AdoptRef(
261 new SkBlurImageFilter(arbitrary_sigma, arbitrary_sigma));
262 arbitrary_filters1.Append(
263 cc::FilterOperation::CreateReferenceFilter(arbitrary_filter));
265 FilterOperations arbitrary_filters2;
266 arbitrary_filters2.Append(FilterOperation::CreateBrightnessFilter(
269 scoped_ptr<SharedQuadState> shared_state1_in = SharedQuadState::Create();
270 shared_state1_in->SetAll(arbitrary_matrix,
276 arbitrary_blend_mode1);
277 scoped_ptr<SharedQuadState> shared_state1_cmp = shared_state1_in->Copy();
279 scoped_ptr<CheckerboardDrawQuad> checkerboard_in =
280 CheckerboardDrawQuad::Create();
281 checkerboard_in->SetAll(shared_state1_in.get(),
283 arbitrary_rect2_inside_rect1,
284 arbitrary_rect1_inside_rect1,
287 scoped_ptr<DrawQuad> checkerboard_cmp = checkerboard_in->Copy(
288 checkerboard_in->shared_quad_state);
290 scoped_ptr<DebugBorderDrawQuad> debugborder_in =
291 DebugBorderDrawQuad::Create();
292 debugborder_in->SetAll(shared_state1_in.get(),
294 arbitrary_rect1_inside_rect3,
295 arbitrary_rect2_inside_rect3,
299 scoped_ptr<DrawQuad> debugborder_cmp = debugborder_in->Copy(
300 debugborder_in->shared_quad_state);
302 scoped_ptr<IOSurfaceDrawQuad> iosurface_in =
303 IOSurfaceDrawQuad::Create();
304 iosurface_in->SetAll(shared_state1_in.get(),
306 arbitrary_rect2_inside_rect2,
307 arbitrary_rect1_inside_rect2,
310 arbitrary_resourceid3,
311 arbitrary_orientation);
312 scoped_ptr<DrawQuad> iosurface_cmp = iosurface_in->Copy(
313 iosurface_in->shared_quad_state);
315 scoped_ptr<SharedQuadState> shared_state2_in = SharedQuadState::Create();
316 shared_state2_in->SetAll(arbitrary_matrix,
322 arbitrary_blend_mode2);
323 scoped_ptr<SharedQuadState> shared_state2_cmp = shared_state2_in->Copy();
325 scoped_ptr<RenderPassDrawQuad> renderpass_in =
326 RenderPassDrawQuad::Create();
327 renderpass_in->SetAll(shared_state2_in.get(),
329 arbitrary_rect2_inside_rect1,
330 arbitrary_rect1_inside_rect1,
334 arbitrary_resourceid2,
339 scoped_ptr<RenderPassDrawQuad> renderpass_cmp = renderpass_in->Copy(
340 renderpass_in->shared_quad_state, renderpass_in->render_pass_id);
342 scoped_ptr<SharedQuadState> shared_state3_in = SharedQuadState::Create();
343 shared_state3_in->SetAll(arbitrary_matrix,
349 arbitrary_blend_mode3);
350 scoped_ptr<SharedQuadState> shared_state3_cmp = shared_state3_in->Copy();
352 scoped_ptr<SolidColorDrawQuad> solidcolor_in =
353 SolidColorDrawQuad::Create();
354 solidcolor_in->SetAll(shared_state3_in.get(),
356 arbitrary_rect1_inside_rect3,
357 arbitrary_rect2_inside_rect3,
361 scoped_ptr<DrawQuad> solidcolor_cmp = solidcolor_in->Copy(
362 solidcolor_in->shared_quad_state);
364 scoped_ptr<StreamVideoDrawQuad> streamvideo_in =
365 StreamVideoDrawQuad::Create();
366 streamvideo_in->SetAll(shared_state3_in.get(),
368 arbitrary_rect2_inside_rect2,
369 arbitrary_rect1_inside_rect2,
371 arbitrary_resourceid2,
373 scoped_ptr<DrawQuad> streamvideo_cmp = streamvideo_in->Copy(
374 streamvideo_in->shared_quad_state);
376 int arbitrary_surface_id = 3;
377 scoped_ptr<SurfaceDrawQuad> surface_in = SurfaceDrawQuad::Create();
378 surface_in->SetAll(shared_state3_in.get(),
380 arbitrary_rect2_inside_rect2,
381 arbitrary_rect1_inside_rect2,
383 arbitrary_surface_id);
384 scoped_ptr<DrawQuad> surface_cmp = surface_in->Copy(
385 surface_in->shared_quad_state);
387 scoped_ptr<TextureDrawQuad> texture_in = TextureDrawQuad::Create();
388 texture_in->SetAll(shared_state3_in.get(),
390 arbitrary_rect2_inside_rect2,
391 arbitrary_rect1_inside_rect2,
393 arbitrary_resourceid1,
398 arbitrary_float_array,
400 scoped_ptr<DrawQuad> texture_cmp = texture_in->Copy(
401 texture_in->shared_quad_state);
403 scoped_ptr<TileDrawQuad> tile_in = TileDrawQuad::Create();
404 tile_in->SetAll(shared_state3_in.get(),
406 arbitrary_rect2_inside_rect2,
407 arbitrary_rect1_inside_rect2,
409 arbitrary_resourceid3,
413 scoped_ptr<DrawQuad> tile_cmp = tile_in->Copy(
414 tile_in->shared_quad_state);
416 scoped_ptr<YUVVideoDrawQuad> yuvvideo_in =
417 YUVVideoDrawQuad::Create();
418 yuvvideo_in->SetAll(shared_state3_in.get(),
420 arbitrary_rect2_inside_rect1,
421 arbitrary_rect1_inside_rect1,
424 arbitrary_resourceid1,
425 arbitrary_resourceid2,
426 arbitrary_resourceid3,
427 arbitrary_resourceid4);
428 scoped_ptr<DrawQuad> yuvvideo_cmp = yuvvideo_in->Copy(
429 yuvvideo_in->shared_quad_state);
431 scoped_ptr<RenderPass> pass_in = RenderPass::Create();
432 pass_in->SetAll(arbitrary_id,
438 pass_in->shared_quad_state_list.push_back(shared_state1_in.Pass());
439 pass_in->quad_list.push_back(checkerboard_in.PassAs<DrawQuad>());
440 pass_in->quad_list.push_back(debugborder_in.PassAs<DrawQuad>());
441 pass_in->quad_list.push_back(iosurface_in.PassAs<DrawQuad>());
442 pass_in->quad_list.push_back(renderpass_in.PassAs<DrawQuad>());
443 pass_in->shared_quad_state_list.push_back(shared_state2_in.Pass());
444 pass_in->shared_quad_state_list.push_back(shared_state3_in.Pass());
445 pass_in->quad_list.push_back(solidcolor_in.PassAs<DrawQuad>());
446 pass_in->quad_list.push_back(streamvideo_in.PassAs<DrawQuad>());
447 pass_in->quad_list.push_back(surface_in.PassAs<DrawQuad>());
448 pass_in->quad_list.push_back(texture_in.PassAs<DrawQuad>());
449 pass_in->quad_list.push_back(tile_in.PassAs<DrawQuad>());
450 pass_in->quad_list.push_back(yuvvideo_in.PassAs<DrawQuad>());
452 scoped_ptr<RenderPass> pass_cmp = RenderPass::Create();
453 pass_cmp->SetAll(arbitrary_id,
459 pass_cmp->shared_quad_state_list.push_back(shared_state1_cmp.Pass());
460 pass_cmp->quad_list.push_back(checkerboard_cmp.PassAs<DrawQuad>());
461 pass_cmp->quad_list.push_back(debugborder_cmp.PassAs<DrawQuad>());
462 pass_cmp->quad_list.push_back(iosurface_cmp.PassAs<DrawQuad>());
463 pass_cmp->quad_list.push_back(renderpass_cmp.PassAs<DrawQuad>());
464 pass_cmp->shared_quad_state_list.push_back(shared_state2_cmp.Pass());
465 pass_cmp->shared_quad_state_list.push_back(shared_state3_cmp.Pass());
466 pass_cmp->quad_list.push_back(solidcolor_cmp.PassAs<DrawQuad>());
467 pass_cmp->quad_list.push_back(streamvideo_cmp.PassAs<DrawQuad>());
468 pass_cmp->quad_list.push_back(surface_cmp.PassAs<DrawQuad>());
469 pass_cmp->quad_list.push_back(texture_cmp.PassAs<DrawQuad>());
470 pass_cmp->quad_list.push_back(tile_cmp.PassAs<DrawQuad>());
471 pass_cmp->quad_list.push_back(yuvvideo_cmp.PassAs<DrawQuad>());
473 // Make sure the in and cmp RenderPasses match.
474 Compare(pass_cmp.get(), pass_in.get());
475 ASSERT_EQ(3u, pass_in->shared_quad_state_list.size());
476 ASSERT_EQ(10u, pass_in->quad_list.size());
477 for (size_t i = 0; i < 3; ++i) {
478 Compare(pass_cmp->shared_quad_state_list[i],
479 pass_in->shared_quad_state_list[i]);
481 for (size_t i = 0; i < pass_in->quad_list.size(); ++i)
482 Compare(pass_cmp->quad_list[i], pass_in->quad_list[i]);
483 for (size_t i = 1; i < pass_in->quad_list.size(); ++i) {
484 bool same_shared_quad_state_cmp =
485 pass_cmp->quad_list[i]->shared_quad_state ==
486 pass_cmp->quad_list[i - 1]->shared_quad_state;
487 bool same_shared_quad_state_in =
488 pass_in->quad_list[i]->shared_quad_state ==
489 pass_in->quad_list[i - 1]->shared_quad_state;
490 EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_in);
493 DelegatedFrameData frame_in;
494 frame_in.render_pass_list.push_back(pass_in.Pass());
496 IPC::ParamTraits<DelegatedFrameData>::Write(&msg, frame_in);
498 DelegatedFrameData frame_out;
499 PickleIterator iter(msg);
500 EXPECT_TRUE(IPC::ParamTraits<DelegatedFrameData>::Read(&msg,
503 // Make sure the out and cmp RenderPasses match.
504 scoped_ptr<RenderPass> pass_out = frame_out.render_pass_list.take(
505 frame_out.render_pass_list.begin());
506 Compare(pass_cmp.get(), pass_out.get());
507 ASSERT_EQ(3u, pass_out->shared_quad_state_list.size());
508 ASSERT_EQ(10u, pass_out->quad_list.size());
509 for (size_t i = 0; i < 3; ++i) {
510 Compare(pass_cmp->shared_quad_state_list[i],
511 pass_out->shared_quad_state_list[i]);
513 for (size_t i = 0; i < pass_out->quad_list.size(); ++i)
514 Compare(pass_cmp->quad_list[i], pass_out->quad_list[i]);
515 for (size_t i = 1; i < pass_out->quad_list.size(); ++i) {
516 bool same_shared_quad_state_cmp =
517 pass_cmp->quad_list[i]->shared_quad_state ==
518 pass_cmp->quad_list[i - 1]->shared_quad_state;
519 bool same_shared_quad_state_out =
520 pass_out->quad_list[i]->shared_quad_state ==
521 pass_out->quad_list[i - 1]->shared_quad_state;
522 EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_out);
526 TEST_F(CCMessagesTest, UnusedSharedQuadStates) {
527 scoped_ptr<CheckerboardDrawQuad> quad;
529 scoped_ptr<RenderPass> pass_in = RenderPass::Create();
530 pass_in->SetAll(RenderPass::Id(1, 1),
536 // The first SharedQuadState is used.
537 scoped_ptr<SharedQuadState> shared_state1_in = SharedQuadState::Create();
538 shared_state1_in->SetAll(gfx::Transform(),
544 SkXfermode::kSrcOver_Mode);
546 quad = CheckerboardDrawQuad::Create();
547 quad->SetAll(shared_state1_in.get(),
553 pass_in->quad_list.push_back(quad.PassAs<DrawQuad>());
555 // The second and third SharedQuadStates are not used.
556 scoped_ptr<SharedQuadState> shared_state2_in = SharedQuadState::Create();
557 shared_state2_in->SetAll(gfx::Transform(),
563 SkXfermode::kSrcOver_Mode);
565 scoped_ptr<SharedQuadState> shared_state3_in = SharedQuadState::Create();
566 shared_state3_in->SetAll(gfx::Transform(),
572 SkXfermode::kSrcOver_Mode);
574 // The fourth SharedQuadState is used.
575 scoped_ptr<SharedQuadState> shared_state4_in = SharedQuadState::Create();
576 shared_state4_in->SetAll(gfx::Transform(),
582 SkXfermode::kSrcOver_Mode);
584 quad = CheckerboardDrawQuad::Create();
585 quad->SetAll(shared_state4_in.get(),
591 pass_in->quad_list.push_back(quad.PassAs<DrawQuad>());
593 // The fifth is not used again.
594 scoped_ptr<SharedQuadState> shared_state5_in = SharedQuadState::Create();
595 shared_state5_in->SetAll(gfx::Transform(),
601 SkXfermode::kSrcOver_Mode);
603 pass_in->shared_quad_state_list.push_back(shared_state1_in.Pass());
604 pass_in->shared_quad_state_list.push_back(shared_state2_in.Pass());
605 pass_in->shared_quad_state_list.push_back(shared_state3_in.Pass());
606 pass_in->shared_quad_state_list.push_back(shared_state4_in.Pass());
607 pass_in->shared_quad_state_list.push_back(shared_state5_in.Pass());
609 // 5 SharedQuadStates go in.
610 ASSERT_EQ(5u, pass_in->shared_quad_state_list.size());
611 ASSERT_EQ(2u, pass_in->quad_list.size());
613 DelegatedFrameData frame_in;
614 frame_in.render_pass_list.push_back(pass_in.Pass());
616 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
617 IPC::ParamTraits<DelegatedFrameData>::Write(&msg, frame_in);
619 DelegatedFrameData frame_out;
620 PickleIterator iter(msg);
622 IPC::ParamTraits<DelegatedFrameData>::Read(&msg, &iter, &frame_out));
624 scoped_ptr<RenderPass> pass_out =
625 frame_out.render_pass_list.take(frame_out.render_pass_list.begin());
627 // 2 SharedQuadStates come out. The first and fourth SharedQuadStates were
628 // used by quads, and so serialized. Others were not.
629 ASSERT_EQ(2u, pass_out->shared_quad_state_list.size());
630 ASSERT_EQ(2u, pass_out->quad_list.size());
632 EXPECT_EQ(gfx::Size(1, 1).ToString(),
633 pass_out->shared_quad_state_list[0]->content_bounds.ToString());
634 EXPECT_EQ(gfx::Size(4, 4).ToString(),
635 pass_out->shared_quad_state_list[1]->content_bounds.ToString());
638 TEST_F(CCMessagesTest, Resources) {
639 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
640 gfx::Size arbitrary_size(757, 1281);
641 unsigned int arbitrary_uint1 = 71234838;
642 unsigned int arbitrary_uint2 = 53589793;
644 GLbyte arbitrary_mailbox1[GL_MAILBOX_SIZE_CHROMIUM] = {
645 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
646 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4,
647 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4};
649 GLbyte arbitrary_mailbox2[GL_MAILBOX_SIZE_CHROMIUM] = {
650 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0, 0, 9,
651 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0, 0, 9, 8, 7,
652 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0, 0, 9, 8, 7};
654 TransferableResource arbitrary_resource1;
655 arbitrary_resource1.id = 2178312;
656 arbitrary_resource1.format = cc::RGBA_8888;
657 arbitrary_resource1.filter = 53;
658 arbitrary_resource1.size = gfx::Size(37189, 123123);
659 arbitrary_resource1.mailbox_holder.mailbox.SetName(arbitrary_mailbox1);
660 arbitrary_resource1.mailbox_holder.texture_target = GL_TEXTURE_2D;
661 arbitrary_resource1.mailbox_holder.sync_point = arbitrary_uint1;
663 TransferableResource arbitrary_resource2;
664 arbitrary_resource2.id = 789132;
665 arbitrary_resource2.format = cc::RGBA_4444;
666 arbitrary_resource2.filter = 47;
667 arbitrary_resource2.size = gfx::Size(89123, 23789);
668 arbitrary_resource2.mailbox_holder.mailbox.SetName(arbitrary_mailbox2);
669 arbitrary_resource2.mailbox_holder.texture_target = GL_TEXTURE_EXTERNAL_OES;
670 arbitrary_resource2.mailbox_holder.sync_point = arbitrary_uint2;
672 scoped_ptr<RenderPass> renderpass_in = RenderPass::Create();
673 renderpass_in->SetNew(
674 RenderPass::Id(1, 1), gfx::Rect(), gfx::Rect(), gfx::Transform());
676 DelegatedFrameData frame_in;
677 frame_in.resource_list.push_back(arbitrary_resource1);
678 frame_in.resource_list.push_back(arbitrary_resource2);
679 frame_in.render_pass_list.push_back(renderpass_in.Pass());
681 IPC::ParamTraits<DelegatedFrameData>::Write(&msg, frame_in);
683 DelegatedFrameData frame_out;
684 PickleIterator iter(msg);
685 EXPECT_TRUE(IPC::ParamTraits<DelegatedFrameData>::Read(&msg,
688 ASSERT_EQ(2u, frame_out.resource_list.size());
689 Compare(arbitrary_resource1, frame_out.resource_list[0]);
690 Compare(arbitrary_resource2, frame_out.resource_list[1]);
693 TEST_F(CCMessagesTest, LargestQuadType) {
697 for (int i = 0; !done; ++i) {
698 switch (static_cast<DrawQuad::Material>(i)) {
699 case cc::DrawQuad::CHECKERBOARD:
700 largest = std::max(largest, sizeof(cc::CheckerboardDrawQuad));
702 case cc::DrawQuad::DEBUG_BORDER:
703 largest = std::max(largest, sizeof(cc::DebugBorderDrawQuad));
705 case cc::DrawQuad::IO_SURFACE_CONTENT:
706 largest = std::max(largest, sizeof(cc::IOSurfaceDrawQuad));
708 case cc::DrawQuad::PICTURE_CONTENT:
709 largest = std::max(largest, sizeof(cc::PictureDrawQuad));
711 case cc::DrawQuad::TEXTURE_CONTENT:
712 largest = std::max(largest, sizeof(cc::TextureDrawQuad));
714 case cc::DrawQuad::RENDER_PASS:
715 largest = std::max(largest, sizeof(cc::RenderPassDrawQuad));
717 case cc::DrawQuad::SOLID_COLOR:
718 largest = std::max(largest, sizeof(cc::SolidColorDrawQuad));
720 case cc::DrawQuad::SURFACE_CONTENT:
721 largest = std::max(largest, sizeof(cc::SurfaceDrawQuad));
723 case cc::DrawQuad::TILED_CONTENT:
724 largest = std::max(largest, sizeof(cc::TileDrawQuad));
726 case cc::DrawQuad::STREAM_VIDEO_CONTENT:
727 largest = std::max(largest, sizeof(cc::StreamVideoDrawQuad));
729 case cc::DrawQuad::YUV_VIDEO_CONTENT:
730 largest = std::max(largest, sizeof(cc::YUVVideoDrawQuad));
732 case cc::DrawQuad::INVALID:
739 // Verify the largest DrawQuad type is RenderPassDrawQuad. If this ever
740 // changes, then the ReserveSizeForRenderPassWrite() method needs to be
741 // updated as well to use the new largest quad.
742 EXPECT_EQ(sizeof(RenderPassDrawQuad), largest);
746 } // namespace content