blob: 7225b68f3f0065fc26aac804d686770139ab6afe [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
9#include "ipc/ipc_message.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12using cc::CheckerboardDrawQuad;
13using cc::DebugBorderDrawQuad;
14using cc::DrawQuad;
15using cc::IOSurfaceDrawQuad;
16using cc::RenderPass;
17using cc::RenderPassDrawQuad;
18using cc::ResourceProvider;
19using cc::SharedQuadState;
20using cc::SolidColorDrawQuad;
21using cc::TextureDrawQuad;
22using cc::TileDrawQuad;
23using cc::StreamVideoDrawQuad;
24using cc::VideoLayerImpl;
25using cc::YUVVideoDrawQuad;
26using WebKit::WebFilterOperation;
27using WebKit::WebFilterOperations;
28using WebKit::WebTransformationMatrix;
29
30class CCMessagesTest : public testing::Test {
31 protected:
32 void Compare(const RenderPass* a, const RenderPass* b) {
33 EXPECT_EQ(a->id, b->id);
34 EXPECT_EQ(a->output_rect.ToString(), b->output_rect.ToString());
35 EXPECT_EQ(a->damage_rect.ToString(), b->damage_rect.ToString());
36 EXPECT_EQ(a->transform_to_root_target, b->transform_to_root_target);
37 EXPECT_EQ(a->has_transparent_background, b->has_transparent_background);
38 EXPECT_EQ(a->has_occlusion_from_outside_target_surface,
39 b->has_occlusion_from_outside_target_surface);
40 EXPECT_EQ(a->filters, b->filters);
41 EXPECT_EQ(a->filter, b->filter);
42 EXPECT_EQ(a->background_filters, b->background_filters);
43 }
44
45 void Compare(const SharedQuadState* a, const SharedQuadState* b) {
46 EXPECT_EQ(a->content_to_target_transform, b->content_to_target_transform);
47 EXPECT_EQ(a->visible_content_rect, b->visible_content_rect);
48 EXPECT_EQ(a->clipped_rect_in_target, b->clipped_rect_in_target);
49 EXPECT_EQ(a->clip_rect, b->clip_rect);
50 EXPECT_EQ(a->is_clipped, b->is_clipped);
51 EXPECT_EQ(a->opacity, b->opacity);
52 }
53
54 void Compare(const DrawQuad* a, const DrawQuad* b) {
55 ASSERT_NE(DrawQuad::INVALID, a->material);
56 ASSERT_EQ(a->material, b->material);
57 EXPECT_EQ(a->rect.ToString(), b->rect.ToString());
58 EXPECT_EQ(a->opaque_rect.ToString(), b->opaque_rect.ToString());
59 EXPECT_EQ(a->visible_rect.ToString(), b->visible_rect.ToString());
60 EXPECT_EQ(a->needs_blending, b->needs_blending);
61
62 Compare(a->shared_quad_state, b->shared_quad_state);
63
64 switch (a->material) {
65 case DrawQuad::CHECKERBOARD:
66 Compare(CheckerboardDrawQuad::MaterialCast(a),
67 CheckerboardDrawQuad::MaterialCast(b));
68 break;
69 case DrawQuad::DEBUG_BORDER:
70 Compare(DebugBorderDrawQuad::MaterialCast(a),
71 DebugBorderDrawQuad::MaterialCast(b));
72 break;
73 case DrawQuad::IO_SURFACE_CONTENT:
74 Compare(IOSurfaceDrawQuad::MaterialCast(a),
75 IOSurfaceDrawQuad::MaterialCast(b));
76 break;
77 case DrawQuad::RENDER_PASS:
78 Compare(RenderPassDrawQuad::MaterialCast(a),
79 RenderPassDrawQuad::MaterialCast(b));
80 break;
81 case DrawQuad::TEXTURE_CONTENT:
82 Compare(TextureDrawQuad::MaterialCast(a),
83 TextureDrawQuad::MaterialCast(b));
84 break;
85 case DrawQuad::TILED_CONTENT:
86 Compare(TileDrawQuad::MaterialCast(a),
87 TileDrawQuad::MaterialCast(b));
88 break;
89 case DrawQuad::SOLID_COLOR:
90 Compare(SolidColorDrawQuad::MaterialCast(a),
91 SolidColorDrawQuad::MaterialCast(b));
92 break;
93 case DrawQuad::STREAM_VIDEO_CONTENT:
94 Compare(StreamVideoDrawQuad::MaterialCast(a),
95 StreamVideoDrawQuad::MaterialCast(b));
96 break;
97 case DrawQuad::YUV_VIDEO_CONTENT:
98 Compare(YUVVideoDrawQuad::MaterialCast(a),
99 YUVVideoDrawQuad::MaterialCast(b));
100 break;
101 case DrawQuad::INVALID:
102 break;
103 }
104 }
105
106 void Compare(const CheckerboardDrawQuad* a, const CheckerboardDrawQuad* b) {
107 EXPECT_EQ(a->color, b->color);
108 }
109
110 void Compare(const DebugBorderDrawQuad* a, const DebugBorderDrawQuad* b) {
111 EXPECT_EQ(a->color, b->color);
112 EXPECT_EQ(a->width, b->width);
113 }
114
115 void Compare(const IOSurfaceDrawQuad* a, const IOSurfaceDrawQuad* b) {
116 EXPECT_EQ(a->io_surface_size.ToString(), b->io_surface_size.ToString());
117 EXPECT_EQ(a->io_surface_texture_id, b->io_surface_texture_id);
118 EXPECT_EQ(a->orientation, b->orientation);
119 }
120
121 void Compare(const RenderPassDrawQuad* a, const RenderPassDrawQuad* b) {
122 EXPECT_EQ(a->is_replica, b->is_replica);
123 EXPECT_EQ(a->mask_resource_id, b->mask_resource_id);
124 EXPECT_EQ(a->contents_changed_since_last_frame,
125 b->contents_changed_since_last_frame);
126 EXPECT_EQ(a->mask_tex_coord_scale_x, b->mask_tex_coord_scale_x);
127 EXPECT_EQ(a->mask_tex_coord_scale_y, b->mask_tex_coord_scale_y);
128 EXPECT_EQ(a->mask_tex_coord_offset_x, b->mask_tex_coord_offset_x);
129 EXPECT_EQ(a->mask_tex_coord_offset_y, b->mask_tex_coord_offset_y);
130 }
131
132 void Compare(const SolidColorDrawQuad* a, const SolidColorDrawQuad* b) {
133 EXPECT_EQ(a->color, b->color);
134 }
135
136 void Compare(const StreamVideoDrawQuad* a, const StreamVideoDrawQuad* b) {
137 EXPECT_EQ(a->texture_id, b->texture_id);
138 EXPECT_EQ(a->matrix, b->matrix);
139 }
140
141 void Compare(const TextureDrawQuad* a, const TextureDrawQuad* b) {
142 EXPECT_EQ(a->resource_id, b->resource_id);
143 EXPECT_EQ(a->premultiplied_alpha, b->premultiplied_alpha);
144 EXPECT_EQ(a->uv_rect, b->uv_rect);
145 EXPECT_EQ(a->flipped, b->flipped);
146 }
147
148 void Compare(const TileDrawQuad* a, const TileDrawQuad* b) {
149 EXPECT_EQ(a->resource_id, b->resource_id);
150 EXPECT_EQ(a->tex_coord_rect, b->tex_coord_rect);
151 EXPECT_EQ(a->texture_size, b->texture_size);
152 EXPECT_EQ(a->swizzle_contents, b->swizzle_contents);
153 EXPECT_EQ(a->left_edge_aa, b->left_edge_aa);
154 EXPECT_EQ(a->top_edge_aa, b->top_edge_aa);
155 EXPECT_EQ(a->right_edge_aa, b->right_edge_aa);
156 EXPECT_EQ(a->bottom_edge_aa, b->bottom_edge_aa);
157 }
158
159 void Compare(const YUVVideoDrawQuad* a, const YUVVideoDrawQuad* b) {
160 EXPECT_EQ(a->tex_scale, b->tex_scale);
161 EXPECT_EQ(a->y_plane.resourceId, b->y_plane.resourceId);
162 EXPECT_EQ(a->y_plane.size.ToString(), b->y_plane.size.ToString());
163 EXPECT_EQ(a->y_plane.format, b->y_plane.format);
164 EXPECT_EQ(a->u_plane.resourceId, b->u_plane.resourceId);
165 EXPECT_EQ(a->u_plane.size.ToString(), b->u_plane.size.ToString());
166 EXPECT_EQ(a->u_plane.format, b->u_plane.format);
167 EXPECT_EQ(a->v_plane.resourceId, b->v_plane.resourceId);
168 EXPECT_EQ(a->v_plane.size.ToString(), b->v_plane.size.ToString());
169 EXPECT_EQ(a->v_plane.format, b->v_plane.format);
170 }
171};
172
173TEST_F(CCMessagesTest, AllQuads) {
174 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
175
176 WebTransformationMatrix arbitrary_matrix;
177 arbitrary_matrix.scale(3);
178 arbitrary_matrix.translate(-5, 20);
179 arbitrary_matrix.rotate(15);
180 gfx::Rect arbitrary_rect1(-5, 9, 3, 15);
181 gfx::Rect arbitrary_rect2(40, 23, 11, 7);
182 gfx::Rect arbitrary_rect3(7, -53, 22, 19);
183 gfx::Size arbitrary_size1(15, 19);
184 gfx::Size arbitrary_size2(3, 99);
185 gfx::Size arbitrary_size3(75, 1281);
186 gfx::RectF arbitrary_rectf1(4.2f, -922.1f, 15.6f, 29.5f);
187 gfx::SizeF arbitrary_sizef1(15.2f, 104.6f);
188 float arbitrary_float1 = 0.7f;
189 float arbitrary_float2 = 0.3f;
190 float arbitrary_float3 = 0.9f;
191 float arbitrary_float4 = 0.1f;
192 bool arbitrary_bool1 = true;
193 bool arbitrary_bool2 = false;
194 int arbitrary_int = 5;
195 SkColor arbitrary_color = SkColorSetARGB(25, 36, 47, 58);
196 IOSurfaceDrawQuad::Orientation arbitrary_orientation =
197 IOSurfaceDrawQuad::UNFLIPPED;
198 RenderPass::Id arbitrary_id(10, 14);
199 ResourceProvider::ResourceId arbitrary_resourceid = 55;
200
201 VideoLayerImpl::FramePlane arbitrary_plane1;
202 arbitrary_plane1.resourceId = arbitrary_resourceid;
203 arbitrary_plane1.size = arbitrary_size1;
204 arbitrary_plane1.format = arbitrary_int;
205
206 VideoLayerImpl::FramePlane arbitrary_plane2;
207 arbitrary_plane2.resourceId = arbitrary_resourceid;
208 arbitrary_plane2.size = arbitrary_size2;
209 arbitrary_plane2.format = arbitrary_int;
210
211 VideoLayerImpl::FramePlane arbitrary_plane3;
212 arbitrary_plane3.resourceId = arbitrary_resourceid;
213 arbitrary_plane3.size = arbitrary_size3;
214 arbitrary_plane3.format = arbitrary_int;
215
216 WebFilterOperations arbitrary_filters1;
217 arbitrary_filters1.append(WebFilterOperation::createGrayscaleFilter(
218 arbitrary_float1));
219
220 WebFilterOperations arbitrary_filters2;
221 arbitrary_filters2.append(WebFilterOperation::createBrightnessFilter(
222 arbitrary_float2));
223
224 scoped_ptr<SharedQuadState> shared_state1_in = SharedQuadState::Create();
225 shared_state1_in->SetAll(arbitrary_matrix,
226 arbitrary_rect1,
227 arbitrary_rect2,
228 arbitrary_rect3,
229 arbitrary_bool1,
230 arbitrary_float1);
231 scoped_ptr<SharedQuadState> shared_state1_cmp = shared_state1_in->Copy();
232
233 scoped_ptr<CheckerboardDrawQuad> checkerboard_in =
234 CheckerboardDrawQuad::Create();
235 checkerboard_in->SetAll(shared_state1_in.get(),
236 arbitrary_rect1,
237 arbitrary_rect2,
238 arbitrary_rect3,
239 arbitrary_bool1,
240 arbitrary_color);
241 scoped_ptr<DrawQuad> checkerboard_cmp = checkerboard_in->Copy(
242 checkerboard_in->shared_quad_state);
243
244 scoped_ptr<DebugBorderDrawQuad> debugborder_in =
245 DebugBorderDrawQuad::Create();
246 debugborder_in->SetAll(shared_state1_in.get(),
247 arbitrary_rect3,
248 arbitrary_rect1,
249 arbitrary_rect2,
250 arbitrary_bool1,
251 arbitrary_color,
252 arbitrary_int);
253 scoped_ptr<DrawQuad> debugborder_cmp = debugborder_in->Copy(
254 debugborder_in->shared_quad_state);
255
256 scoped_ptr<IOSurfaceDrawQuad> iosurface_in =
257 IOSurfaceDrawQuad::Create();
258 iosurface_in->SetAll(shared_state1_in.get(),
259 arbitrary_rect2,
260 arbitrary_rect3,
261 arbitrary_rect1,
262 arbitrary_bool1,
263 arbitrary_size1,
264 arbitrary_int,
265 arbitrary_orientation);
266 scoped_ptr<DrawQuad> iosurface_cmp = iosurface_in->Copy(
267 iosurface_in->shared_quad_state);
268
269 scoped_ptr<RenderPassDrawQuad> renderpass_in =
270 RenderPassDrawQuad::Create();
271 renderpass_in->SetAll(shared_state1_in.get(),
272 arbitrary_rect1,
273 arbitrary_rect2,
274 arbitrary_rect3,
275 arbitrary_bool1,
276 arbitrary_id,
277 arbitrary_bool2,
278 arbitrary_resourceid,
279 arbitrary_rect1,
280 arbitrary_float1,
281 arbitrary_float2,
282 arbitrary_float3,
283 arbitrary_float4);
284 scoped_ptr<RenderPassDrawQuad> renderpass_cmp = renderpass_in->Copy(
285 renderpass_in->shared_quad_state, renderpass_in->render_pass_id);
286
287 scoped_ptr<SharedQuadState> shared_state2_in = SharedQuadState::Create();
288 shared_state2_in->SetAll(arbitrary_matrix,
289 arbitrary_rect2,
290 arbitrary_rect3,
291 arbitrary_rect1,
292 arbitrary_bool1,
293 arbitrary_float2);
294 scoped_ptr<SharedQuadState> shared_state2_cmp = shared_state2_in->Copy();
295
296 scoped_ptr<SharedQuadState> shared_state3_in = SharedQuadState::Create();
297 shared_state3_in->SetAll(arbitrary_matrix,
298 arbitrary_rect3,
299 arbitrary_rect1,
300 arbitrary_rect2,
301 arbitrary_bool1,
302 arbitrary_float3);
303 scoped_ptr<SharedQuadState> shared_state3_cmp = shared_state3_in->Copy();
304
305 scoped_ptr<SolidColorDrawQuad> solidcolor_in =
306 SolidColorDrawQuad::Create();
307 solidcolor_in->SetAll(shared_state1_in.get(),
308 arbitrary_rect3,
309 arbitrary_rect1,
310 arbitrary_rect2,
311 arbitrary_bool1,
312 arbitrary_color);
313 scoped_ptr<DrawQuad> solidcolor_cmp = solidcolor_in->Copy(
314 solidcolor_in->shared_quad_state);
315
316 scoped_ptr<StreamVideoDrawQuad> streamvideo_in =
317 StreamVideoDrawQuad::Create();
318 streamvideo_in->SetAll(shared_state1_in.get(),
319 arbitrary_rect2,
320 arbitrary_rect3,
321 arbitrary_rect1,
322 arbitrary_bool1,
323 arbitrary_int,
324 arbitrary_matrix);
325 scoped_ptr<DrawQuad> streamvideo_cmp = streamvideo_in->Copy(
326 streamvideo_in->shared_quad_state);
327
328 scoped_ptr<YUVVideoDrawQuad> yuvvideo_in =
329 YUVVideoDrawQuad::Create();
330 yuvvideo_in->SetAll(shared_state1_in.get(),
331 arbitrary_rect1,
332 arbitrary_rect2,
333 arbitrary_rect3,
334 arbitrary_bool1,
335 arbitrary_sizef1,
336 arbitrary_plane1,
337 arbitrary_plane2,
338 arbitrary_plane3);
339 scoped_ptr<DrawQuad> yuvvideo_cmp = yuvvideo_in->Copy(
340 yuvvideo_in->shared_quad_state);
341
342 scoped_ptr<RenderPass> pass_in = RenderPass::Create();
343 pass_in->SetAll(arbitrary_id,
344 arbitrary_rect1,
345 arbitrary_rectf1,
346 arbitrary_matrix,
347 arbitrary_bool1,
348 arbitrary_bool2,
349 arbitrary_filters1,
350 NULL, // TODO(danakj): filter is not serialized.
351 arbitrary_filters2);
352
353 pass_in->shared_quad_state_list.append(shared_state1_in.Pass());
354 pass_in->quad_list.append(checkerboard_in.PassAs<DrawQuad>());
355 pass_in->quad_list.append(debugborder_in.PassAs<DrawQuad>());
356 pass_in->quad_list.append(iosurface_in.PassAs<DrawQuad>());
357 pass_in->quad_list.append(renderpass_in.PassAs<DrawQuad>());
358 pass_in->shared_quad_state_list.append(shared_state2_in.Pass());
359 pass_in->shared_quad_state_list.append(shared_state3_in.Pass());
360 pass_in->quad_list.append(solidcolor_in.PassAs<DrawQuad>());
361 pass_in->quad_list.append(streamvideo_in.PassAs<DrawQuad>());
362 pass_in->quad_list.append(yuvvideo_in.PassAs<DrawQuad>());
363
364 scoped_ptr<RenderPass> pass_cmp = RenderPass::Create();
365 pass_cmp->SetAll(arbitrary_id,
366 arbitrary_rect1,
367 arbitrary_rectf1,
368 arbitrary_matrix,
369 arbitrary_bool1,
370 arbitrary_bool2,
371 arbitrary_filters1,
372 NULL, // TODO(danakj): filter is not serialized.
373 arbitrary_filters2);
374
375 pass_cmp->shared_quad_state_list.append(shared_state1_cmp.Pass());
376 pass_cmp->quad_list.append(checkerboard_cmp.PassAs<DrawQuad>());
377 pass_cmp->quad_list.append(debugborder_cmp.PassAs<DrawQuad>());
378 pass_cmp->quad_list.append(iosurface_cmp.PassAs<DrawQuad>());
379 pass_cmp->quad_list.append(renderpass_cmp.PassAs<DrawQuad>());
380 pass_cmp->shared_quad_state_list.append(shared_state2_cmp.Pass());
381 pass_cmp->shared_quad_state_list.append(shared_state3_cmp.Pass());
382 pass_cmp->quad_list.append(solidcolor_cmp.PassAs<DrawQuad>());
383 pass_cmp->quad_list.append(streamvideo_cmp.PassAs<DrawQuad>());
384 pass_cmp->quad_list.append(yuvvideo_cmp.PassAs<DrawQuad>());
385
386 // Make sure the in and cmp RenderPasses match.
387 Compare(pass_cmp.get(), pass_in.get());
388 ASSERT_EQ(3u, pass_in->shared_quad_state_list.size());
389 ASSERT_EQ(7u, pass_in->quad_list.size());
390 for (size_t i = 0; i < 3; ++i) {
391 Compare(pass_cmp->shared_quad_state_list[i],
392 pass_in->shared_quad_state_list[i]);
393 }
394 for (size_t i = 0; i < 7; ++i)
395 Compare(pass_cmp->quad_list[i], pass_in->quad_list[i]);
396 for (size_t i = 1; i < 7; ++i) {
397 bool same_shared_quad_state_cmp =
398 pass_cmp->quad_list[i]->shared_quad_state ==
399 pass_cmp->quad_list[i - 1]->shared_quad_state;
400 bool same_shared_quad_state_in =
401 pass_in->quad_list[i]->shared_quad_state ==
402 pass_in->quad_list[i - 1]->shared_quad_state;
403 EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_in);
404 }
405
406 IPC::ParamTraits<RenderPass>::Write(&msg, *pass_in);
407
408 scoped_ptr<RenderPass> pass_out = RenderPass::Create();
409 PickleIterator iter(msg);
410 EXPECT_TRUE(IPC::ParamTraits<RenderPass>::Read(&msg, &iter, pass_out.get()));
411
412 // Make sure the out and cmp RenderPasses match.
413 Compare(pass_cmp.get(), pass_out.get());
414 ASSERT_EQ(3u, pass_out->shared_quad_state_list.size());
415 ASSERT_EQ(7u, pass_out->quad_list.size());
416 for (size_t i = 0; i < 3; ++i) {
417 Compare(pass_cmp->shared_quad_state_list[i],
418 pass_out->shared_quad_state_list[i]);
419 }
420 for (size_t i = 0; i < 7; ++i)
421 Compare(pass_cmp->quad_list[i], pass_out->quad_list[i]);
422 for (size_t i = 1; i < 7; ++i) {
423 bool same_shared_quad_state_cmp =
424 pass_cmp->quad_list[i]->shared_quad_state ==
425 pass_cmp->quad_list[i - 1]->shared_quad_state;
426 bool same_shared_quad_state_out =
427 pass_out->quad_list[i]->shared_quad_state ==
428 pass_out->quad_list[i - 1]->shared_quad_state;
429 EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_out);
430 }
431}