1 // Copyright 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 "cc/quads/draw_quad.h"
10 #include "base/compiler_specific.h"
11 #include "cc/base/math_util.h"
12 #include "cc/output/filter_operations.h"
13 #include "cc/quads/checkerboard_draw_quad.h"
14 #include "cc/quads/debug_border_draw_quad.h"
15 #include "cc/quads/io_surface_draw_quad.h"
16 #include "cc/quads/largest_draw_quad.h"
17 #include "cc/quads/picture_draw_quad.h"
18 #include "cc/quads/render_pass.h"
19 #include "cc/quads/render_pass_draw_quad.h"
20 #include "cc/quads/solid_color_draw_quad.h"
21 #include "cc/quads/stream_video_draw_quad.h"
22 #include "cc/quads/surface_draw_quad.h"
23 #include "cc/quads/texture_draw_quad.h"
24 #include "cc/quads/tile_draw_quad.h"
25 #include "cc/quads/yuv_video_draw_quad.h"
26 #include "cc/resources/picture_pile_impl.h"
27 #include "cc/test/geometry_test_utils.h"
28 #include "testing/gtest/include/gtest/gtest.h"
29 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
30 #include "ui/gfx/transform.h"
35 TEST(DrawQuadTest, CopySharedQuadState) {
36 gfx::Transform quad_transform = gfx::Transform(1.0, 0.0, 0.5, 1.0, 0.5, 0.0);
37 gfx::Size content_bounds(26, 28);
38 gfx::Rect visible_content_rect(10, 12, 14, 16);
39 gfx::Rect clip_rect(19, 21, 23, 25);
40 bool is_clipped = true;
41 float opacity = 0.25f;
42 SkXfermode::Mode blend_mode = SkXfermode::kMultiply_Mode;
43 int sorting_context_id = 65536;
45 scoped_ptr<SharedQuadState> state(new SharedQuadState);
46 state->SetAll(quad_transform,
55 scoped_ptr<SharedQuadState> copy(new SharedQuadState);
56 copy->CopyFrom(state.get());
57 EXPECT_EQ(quad_transform, copy->content_to_target_transform);
58 EXPECT_RECT_EQ(visible_content_rect, copy->visible_content_rect);
59 EXPECT_EQ(opacity, copy->opacity);
60 EXPECT_RECT_EQ(clip_rect, copy->clip_rect);
61 EXPECT_EQ(is_clipped, copy->is_clipped);
62 EXPECT_EQ(blend_mode, copy->blend_mode);
65 SharedQuadState* CreateSharedQuadState(RenderPass* render_pass) {
66 gfx::Transform quad_transform = gfx::Transform(1.0, 0.0, 0.5, 1.0, 0.5, 0.0);
67 gfx::Size content_bounds(26, 28);
68 gfx::Rect visible_content_rect(10, 12, 14, 16);
69 gfx::Rect clip_rect(19, 21, 23, 25);
70 bool is_clipped = false;
72 int sorting_context_id = 65536;
73 SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
75 SharedQuadState* state = render_pass->CreateAndAppendSharedQuadState();
76 state->SetAll(quad_transform,
87 void CompareDrawQuad(DrawQuad* quad,
89 SharedQuadState* copy_shared_state) {
90 EXPECT_EQ(quad->material, copy->material);
91 EXPECT_RECT_EQ(quad->rect, copy->rect);
92 EXPECT_RECT_EQ(quad->visible_rect, copy->visible_rect);
93 EXPECT_RECT_EQ(quad->opaque_rect, copy->opaque_rect);
94 EXPECT_EQ(quad->needs_blending, copy->needs_blending);
95 EXPECT_EQ(copy_shared_state, copy->shared_quad_state);
98 #define CREATE_SHARED_STATE() \
99 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); \
100 SharedQuadState* shared_state(CreateSharedQuadState(render_pass.get())); \
101 SharedQuadState* copy_shared_state = \
102 render_pass->CreateAndAppendSharedQuadState(); \
103 copy_shared_state->CopyFrom(shared_state);
106 gfx::Rect quad_rect(30, 40, 50, 60); \
107 gfx::Rect quad_visible_rect(40, 50, 30, 20); \
108 gfx::Rect quad_opaque_rect(60, 55, 10, 10); \
109 ALLOW_UNUSED_LOCAL(quad_opaque_rect); \
110 bool needs_blending = true; \
111 ALLOW_UNUSED_LOCAL(needs_blending);
113 #define SETUP_AND_COPY_QUAD_NEW(Type, quad) \
114 DrawQuad* copy_new = \
115 render_pass->CopyFromAndAppendDrawQuad(quad_new, copy_shared_state); \
116 CompareDrawQuad(quad_new, copy_new, copy_shared_state); \
117 const Type* copy_quad = Type::MaterialCast(copy_new); \
118 ALLOW_UNUSED_LOCAL(copy_quad);
120 #define SETUP_AND_COPY_QUAD_ALL(Type, quad) \
121 DrawQuad* copy_all = \
122 render_pass->CopyFromAndAppendDrawQuad(quad_all, copy_shared_state); \
123 CompareDrawQuad(quad_all, copy_all, copy_shared_state); \
124 copy_quad = Type::MaterialCast(copy_all);
126 #define SETUP_AND_COPY_QUAD_NEW_RP(Type, quad, a) \
127 DrawQuad* copy_new = render_pass->CopyFromAndAppendRenderPassDrawQuad( \
128 quad_new, copy_shared_state, a); \
129 CompareDrawQuad(quad_new, copy_new, copy_shared_state); \
130 const Type* copy_quad = Type::MaterialCast(copy_new); \
131 ALLOW_UNUSED_LOCAL(copy_quad);
133 #define SETUP_AND_COPY_QUAD_ALL_RP(Type, quad, a) \
134 DrawQuad* copy_all = render_pass->CopyFromAndAppendRenderPassDrawQuad( \
135 quad_all, copy_shared_state, a); \
136 CompareDrawQuad(quad_all, copy_all, copy_shared_state); \
137 copy_quad = Type::MaterialCast(copy_all);
139 #define CREATE_QUAD_1_NEW(Type, a) \
140 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
141 { QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a); } \
142 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
144 #define CREATE_QUAD_1_ALL(Type, a) \
145 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
147 QUAD_DATA quad_all->SetAll(shared_state, \
154 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
156 #define CREATE_QUAD_2_NEW(Type, a, b) \
157 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
158 { QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b); } \
159 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
161 #define CREATE_QUAD_2_ALL(Type, a, b) \
162 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
164 QUAD_DATA quad_all->SetAll(shared_state, \
172 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
174 #define CREATE_QUAD_3_NEW(Type, a, b, c) \
175 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
176 { QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c); } \
177 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
179 #define CREATE_QUAD_3_ALL(Type, a, b, c) \
180 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
182 QUAD_DATA quad_all->SetAll(shared_state, \
191 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
193 #define CREATE_QUAD_4_NEW(Type, a, b, c, d) \
194 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
195 { QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d); } \
196 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
198 #define CREATE_QUAD_4_ALL(Type, a, b, c, d) \
199 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
201 QUAD_DATA quad_all->SetAll(shared_state, \
211 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
213 #define CREATE_QUAD_5_NEW(Type, a, b, c, d, e) \
214 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
215 { QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d, e); } \
216 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
218 #define CREATE_QUAD_5_ALL(Type, a, b, c, d, e) \
219 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
221 QUAD_DATA quad_all->SetAll(shared_state, \
232 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
234 #define CREATE_QUAD_6_NEW(Type, a, b, c, d, e, f) \
235 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
236 { QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d, e, f); } \
237 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
239 #define CREATE_QUAD_6_ALL(Type, a, b, c, d, e, f) \
240 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
242 QUAD_DATA quad_all->SetAll(shared_state, \
254 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
256 #define CREATE_QUAD_7_NEW(Type, a, b, c, d, e, f, g) \
257 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
259 QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d, e, f, g); \
261 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
263 #define CREATE_QUAD_7_ALL(Type, a, b, c, d, e, f, g) \
264 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
266 QUAD_DATA quad_all->SetAll(shared_state, \
279 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
281 #define CREATE_QUAD_8_NEW(Type, a, b, c, d, e, f, g, h) \
282 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
284 QUAD_DATA quad_new->SetNew( \
285 shared_state, quad_rect, a, b, c, d, e, f, g, h); \
287 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
289 #define CREATE_QUAD_8_ALL(Type, a, b, c, d, e, f, g, h) \
290 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
292 QUAD_DATA quad_all->SetAll(shared_state, \
306 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
308 #define CREATE_QUAD_9_NEW(Type, a, b, c, d, e, f, g, h, i) \
309 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
311 QUAD_DATA quad_new->SetNew( \
312 shared_state, quad_rect, a, b, c, d, e, f, g, h, i); \
314 SETUP_AND_COPY_QUAD_NEW(Type, quad_new);
316 #define CREATE_QUAD_9_ALL(Type, a, b, c, d, e, f, g, h, i) \
318 QUAD_DATA quad_all->SetAll(shared_state, \
333 SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
335 #define CREATE_QUAD_ALL_RP(Type, a, b, c, d, e, f, g, copy_a) \
336 Type* quad_all = render_pass->CreateAndAppendDrawQuad<Type>(); \
338 QUAD_DATA quad_all->SetAll(shared_state, \
351 SETUP_AND_COPY_QUAD_ALL_RP(Type, quad_all, copy_a);
353 #define CREATE_QUAD_NEW_RP(Type, a, b, c, d, e, f, g, h, copy_a) \
354 Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
356 QUAD_DATA quad_new->SetNew( \
357 shared_state, quad_rect, a, b, c, d, e, f, g, h); \
359 SETUP_AND_COPY_QUAD_NEW_RP(Type, quad_new, copy_a);
361 TEST(DrawQuadTest, CopyCheckerboardDrawQuad) {
362 gfx::Rect visible_rect(40, 50, 30, 20);
363 SkColor color = 0xfabb0011;
364 CREATE_SHARED_STATE();
366 CREATE_QUAD_2_NEW(CheckerboardDrawQuad, visible_rect, color);
367 EXPECT_EQ(DrawQuad::CHECKERBOARD, copy_quad->material);
368 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
369 EXPECT_EQ(color, copy_quad->color);
371 CREATE_QUAD_1_ALL(CheckerboardDrawQuad, color);
372 EXPECT_EQ(DrawQuad::CHECKERBOARD, copy_quad->material);
373 EXPECT_EQ(color, copy_quad->color);
376 TEST(DrawQuadTest, CopyDebugBorderDrawQuad) {
377 gfx::Rect visible_rect(40, 50, 30, 20);
378 SkColor color = 0xfabb0011;
380 CREATE_SHARED_STATE();
382 CREATE_QUAD_3_NEW(DebugBorderDrawQuad, visible_rect, color, width);
383 EXPECT_EQ(DrawQuad::DEBUG_BORDER, copy_quad->material);
384 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
385 EXPECT_EQ(color, copy_quad->color);
386 EXPECT_EQ(width, copy_quad->width);
388 CREATE_QUAD_2_ALL(DebugBorderDrawQuad, color, width);
389 EXPECT_EQ(DrawQuad::DEBUG_BORDER, copy_quad->material);
390 EXPECT_EQ(color, copy_quad->color);
391 EXPECT_EQ(width, copy_quad->width);
394 TEST(DrawQuadTest, CopyIOSurfaceDrawQuad) {
395 gfx::Rect opaque_rect(33, 47, 10, 12);
396 gfx::Rect visible_rect(40, 50, 30, 20);
397 gfx::Size size(58, 95);
398 ResourceProvider::ResourceId resource_id = 72;
399 IOSurfaceDrawQuad::Orientation orientation = IOSurfaceDrawQuad::UNFLIPPED;
400 CREATE_SHARED_STATE();
402 CREATE_QUAD_5_NEW(IOSurfaceDrawQuad,
408 EXPECT_EQ(DrawQuad::IO_SURFACE_CONTENT, copy_quad->material);
409 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
410 EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
411 EXPECT_EQ(size, copy_quad->io_surface_size);
412 EXPECT_EQ(resource_id, copy_quad->io_surface_resource_id);
413 EXPECT_EQ(orientation, copy_quad->orientation);
415 CREATE_QUAD_3_ALL(IOSurfaceDrawQuad, size, resource_id, orientation);
416 EXPECT_EQ(DrawQuad::IO_SURFACE_CONTENT, copy_quad->material);
417 EXPECT_EQ(size, copy_quad->io_surface_size);
418 EXPECT_EQ(resource_id, copy_quad->io_surface_resource_id);
419 EXPECT_EQ(orientation, copy_quad->orientation);
422 TEST(DrawQuadTest, CopyRenderPassDrawQuad) {
423 gfx::Rect visible_rect(40, 50, 30, 20);
424 RenderPassId render_pass_id(22, 64);
425 ResourceProvider::ResourceId mask_resource_id = 78;
426 gfx::Vector2dF mask_uv_scale(33.f, 19.f);
427 gfx::Size mask_texture_size(128, 134);
428 FilterOperations filters;
429 filters.Append(FilterOperation::CreateBlurFilter(1.f));
430 gfx::Vector2dF filters_scale;
431 FilterOperations background_filters;
432 background_filters.Append(
433 FilterOperation::CreateGrayscaleFilter(1.f));
435 RenderPassId copied_render_pass_id(235, 11);
436 CREATE_SHARED_STATE();
438 CREATE_QUAD_NEW_RP(RenderPassDrawQuad,
447 copied_render_pass_id);
448 EXPECT_EQ(DrawQuad::RENDER_PASS, copy_quad->material);
449 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
450 EXPECT_EQ(copied_render_pass_id, copy_quad->render_pass_id);
451 EXPECT_EQ(mask_resource_id, copy_quad->mask_resource_id);
452 EXPECT_EQ(mask_uv_scale.ToString(), copy_quad->mask_uv_scale.ToString());
453 EXPECT_EQ(mask_texture_size.ToString(),
454 copy_quad->mask_texture_size.ToString());
455 EXPECT_EQ(filters, copy_quad->filters);
456 EXPECT_EQ(filters_scale, copy_quad->filters_scale);
457 EXPECT_EQ(background_filters, copy_quad->background_filters);
459 CREATE_QUAD_ALL_RP(RenderPassDrawQuad,
467 copied_render_pass_id);
468 EXPECT_EQ(DrawQuad::RENDER_PASS, copy_quad->material);
469 EXPECT_EQ(copied_render_pass_id, copy_quad->render_pass_id);
470 EXPECT_EQ(mask_resource_id, copy_quad->mask_resource_id);
471 EXPECT_EQ(mask_uv_scale.ToString(), copy_quad->mask_uv_scale.ToString());
472 EXPECT_EQ(mask_texture_size.ToString(),
473 copy_quad->mask_texture_size.ToString());
474 EXPECT_EQ(filters, copy_quad->filters);
475 EXPECT_EQ(filters_scale, copy_quad->filters_scale);
476 EXPECT_EQ(background_filters, copy_quad->background_filters);
479 TEST(DrawQuadTest, CopySolidColorDrawQuad) {
480 gfx::Rect visible_rect(40, 50, 30, 20);
481 SkColor color = 0x49494949;
482 bool force_anti_aliasing_off = false;
483 CREATE_SHARED_STATE();
486 SolidColorDrawQuad, visible_rect, color, force_anti_aliasing_off);
487 EXPECT_EQ(DrawQuad::SOLID_COLOR, copy_quad->material);
488 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
489 EXPECT_EQ(color, copy_quad->color);
490 EXPECT_EQ(force_anti_aliasing_off, copy_quad->force_anti_aliasing_off);
492 CREATE_QUAD_2_ALL(SolidColorDrawQuad, color, force_anti_aliasing_off);
493 EXPECT_EQ(DrawQuad::SOLID_COLOR, copy_quad->material);
494 EXPECT_EQ(color, copy_quad->color);
495 EXPECT_EQ(force_anti_aliasing_off, copy_quad->force_anti_aliasing_off);
498 TEST(DrawQuadTest, CopyStreamVideoDrawQuad) {
499 gfx::Rect opaque_rect(33, 47, 10, 12);
500 gfx::Rect visible_rect(40, 50, 30, 20);
501 ResourceProvider::ResourceId resource_id = 64;
502 gfx::Transform matrix = gfx::Transform(0.5, 0.25, 1, 0.75, 0, 1);
503 CREATE_SHARED_STATE();
506 StreamVideoDrawQuad, opaque_rect, visible_rect, resource_id, matrix);
507 EXPECT_EQ(DrawQuad::STREAM_VIDEO_CONTENT, copy_quad->material);
508 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
509 EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
510 EXPECT_EQ(resource_id, copy_quad->resource_id);
511 EXPECT_EQ(matrix, copy_quad->matrix);
513 CREATE_QUAD_2_ALL(StreamVideoDrawQuad, resource_id, matrix);
514 EXPECT_EQ(DrawQuad::STREAM_VIDEO_CONTENT, copy_quad->material);
515 EXPECT_EQ(resource_id, copy_quad->resource_id);
516 EXPECT_EQ(matrix, copy_quad->matrix);
519 TEST(DrawQuadTest, CopySurfaceDrawQuad) {
520 gfx::Rect visible_rect(40, 50, 30, 20);
521 SurfaceId surface_id(1234);
522 CREATE_SHARED_STATE();
524 CREATE_QUAD_2_NEW(SurfaceDrawQuad, visible_rect, surface_id);
525 EXPECT_EQ(DrawQuad::SURFACE_CONTENT, copy_quad->material);
526 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
527 EXPECT_EQ(surface_id, copy_quad->surface_id);
529 CREATE_QUAD_1_ALL(SurfaceDrawQuad, surface_id);
530 EXPECT_EQ(DrawQuad::SURFACE_CONTENT, copy_quad->material);
531 EXPECT_EQ(surface_id, copy_quad->surface_id);
535 TEST(DrawQuadTest, CopyTextureDrawQuad) {
536 gfx::Rect opaque_rect(33, 47, 10, 12);
537 gfx::Rect visible_rect(40, 50, 30, 20);
538 unsigned resource_id = 82;
539 bool premultiplied_alpha = true;
540 gfx::PointF uv_top_left(0.5f, 224.f);
541 gfx::PointF uv_bottom_right(51.5f, 260.f);
542 const float vertex_opacity[] = { 1.0f, 1.0f, 1.0f, 1.0f };
544 CREATE_SHARED_STATE();
546 CREATE_QUAD_9_NEW(TextureDrawQuad,
556 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, copy_quad->material);
557 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
558 EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
559 EXPECT_EQ(resource_id, copy_quad->resource_id);
560 EXPECT_EQ(premultiplied_alpha, copy_quad->premultiplied_alpha);
561 EXPECT_EQ(uv_top_left, copy_quad->uv_top_left);
562 EXPECT_EQ(uv_bottom_right, copy_quad->uv_bottom_right);
563 EXPECT_FLOAT_ARRAY_EQ(vertex_opacity, copy_quad->vertex_opacity, 4);
564 EXPECT_EQ(flipped, copy_quad->flipped);
566 CREATE_QUAD_7_ALL(TextureDrawQuad,
574 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, copy_quad->material);
575 EXPECT_EQ(resource_id, copy_quad->resource_id);
576 EXPECT_EQ(premultiplied_alpha, copy_quad->premultiplied_alpha);
577 EXPECT_EQ(uv_top_left, copy_quad->uv_top_left);
578 EXPECT_EQ(uv_bottom_right, copy_quad->uv_bottom_right);
579 EXPECT_FLOAT_ARRAY_EQ(vertex_opacity, copy_quad->vertex_opacity, 4);
580 EXPECT_EQ(flipped, copy_quad->flipped);
583 TEST(DrawQuadTest, CopyTileDrawQuad) {
584 gfx::Rect opaque_rect(33, 44, 22, 33);
585 gfx::Rect visible_rect(40, 50, 30, 20);
586 unsigned resource_id = 104;
587 gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
588 gfx::Size texture_size(85, 32);
589 bool swizzle_contents = true;
590 CREATE_SHARED_STATE();
592 CREATE_QUAD_6_NEW(TileDrawQuad,
599 EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material);
600 EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
601 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
602 EXPECT_EQ(resource_id, copy_quad->resource_id);
603 EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
604 EXPECT_EQ(texture_size, copy_quad->texture_size);
605 EXPECT_EQ(swizzle_contents, copy_quad->swizzle_contents);
607 CREATE_QUAD_4_ALL(TileDrawQuad,
612 EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material);
613 EXPECT_EQ(resource_id, copy_quad->resource_id);
614 EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
615 EXPECT_EQ(texture_size, copy_quad->texture_size);
616 EXPECT_EQ(swizzle_contents, copy_quad->swizzle_contents);
619 TEST(DrawQuadTest, CopyYUVVideoDrawQuad) {
620 gfx::Rect opaque_rect(33, 47, 10, 12);
621 gfx::Rect visible_rect(40, 50, 30, 20);
622 gfx::RectF tex_coord_rect(0.0f, 0.0f, 0.75f, 0.5f);
623 ResourceProvider::ResourceId y_plane_resource_id = 45;
624 ResourceProvider::ResourceId u_plane_resource_id = 532;
625 ResourceProvider::ResourceId v_plane_resource_id = 4;
626 ResourceProvider::ResourceId a_plane_resource_id = 63;
627 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601_JPEG;
628 CREATE_SHARED_STATE();
630 CREATE_QUAD_8_NEW(YUVVideoDrawQuad,
639 EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material);
640 EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
641 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
642 EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
643 EXPECT_EQ(y_plane_resource_id, copy_quad->y_plane_resource_id);
644 EXPECT_EQ(u_plane_resource_id, copy_quad->u_plane_resource_id);
645 EXPECT_EQ(v_plane_resource_id, copy_quad->v_plane_resource_id);
646 EXPECT_EQ(a_plane_resource_id, copy_quad->a_plane_resource_id);
647 EXPECT_EQ(color_space, copy_quad->color_space);
649 CREATE_QUAD_6_ALL(YUVVideoDrawQuad,
656 EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material);
657 EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
658 EXPECT_EQ(y_plane_resource_id, copy_quad->y_plane_resource_id);
659 EXPECT_EQ(u_plane_resource_id, copy_quad->u_plane_resource_id);
660 EXPECT_EQ(v_plane_resource_id, copy_quad->v_plane_resource_id);
661 EXPECT_EQ(a_plane_resource_id, copy_quad->a_plane_resource_id);
662 EXPECT_EQ(color_space, copy_quad->color_space);
665 TEST(DrawQuadTest, CopyPictureDrawQuad) {
666 gfx::Rect opaque_rect(33, 44, 22, 33);
667 gfx::Rect visible_rect(40, 50, 30, 20);
668 gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
669 gfx::Size texture_size(85, 32);
670 ResourceFormat texture_format = RGBA_8888;
671 gfx::Rect content_rect(30, 40, 20, 30);
672 float contents_scale = 3.141592f;
673 scoped_refptr<PicturePileImpl> picture_pile = PicturePileImpl::Create();
674 CREATE_SHARED_STATE();
676 CREATE_QUAD_8_NEW(PictureDrawQuad,
685 EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material);
686 EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
687 EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
688 EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
689 EXPECT_EQ(texture_size, copy_quad->texture_size);
690 EXPECT_EQ(texture_format, copy_quad->texture_format);
691 EXPECT_RECT_EQ(content_rect, copy_quad->content_rect);
692 EXPECT_EQ(contents_scale, copy_quad->contents_scale);
693 EXPECT_EQ(picture_pile, copy_quad->picture_pile);
695 CREATE_QUAD_6_ALL(PictureDrawQuad,
702 EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material);
703 EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
704 EXPECT_EQ(texture_size, copy_quad->texture_size);
705 EXPECT_EQ(texture_format, copy_quad->texture_format);
706 EXPECT_RECT_EQ(content_rect, copy_quad->content_rect);
707 EXPECT_EQ(contents_scale, copy_quad->contents_scale);
708 EXPECT_EQ(picture_pile, copy_quad->picture_pile);
711 class DrawQuadIteratorTest : public testing::Test {
713 ResourceProvider::ResourceId IncrementResourceId(
714 ResourceProvider::ResourceId id) {
719 int IterateAndCount(DrawQuad* quad) {
721 quad->IterateResources(base::Bind(
722 &DrawQuadIteratorTest::IncrementResourceId, base::Unretained(this)));
723 return num_resources_;
730 TEST_F(DrawQuadIteratorTest, CheckerboardDrawQuad) {
731 gfx::Rect visible_rect(40, 50, 30, 20);
732 SkColor color = 0xfabb0011;
734 CREATE_SHARED_STATE();
735 CREATE_QUAD_2_NEW(CheckerboardDrawQuad, visible_rect, color);
736 EXPECT_EQ(0, IterateAndCount(quad_new));
739 TEST_F(DrawQuadIteratorTest, DebugBorderDrawQuad) {
740 gfx::Rect visible_rect(40, 50, 30, 20);
741 SkColor color = 0xfabb0011;
744 CREATE_SHARED_STATE();
745 CREATE_QUAD_3_NEW(DebugBorderDrawQuad, visible_rect, color, width);
746 EXPECT_EQ(0, IterateAndCount(quad_new));
749 TEST_F(DrawQuadIteratorTest, IOSurfaceDrawQuad) {
750 gfx::Rect opaque_rect(33, 47, 10, 12);
751 gfx::Rect visible_rect(40, 50, 30, 20);
752 gfx::Size size(58, 95);
753 ResourceProvider::ResourceId resource_id = 72;
754 IOSurfaceDrawQuad::Orientation orientation = IOSurfaceDrawQuad::UNFLIPPED;
756 CREATE_SHARED_STATE();
757 CREATE_QUAD_5_NEW(IOSurfaceDrawQuad,
763 EXPECT_EQ(resource_id, quad_new->io_surface_resource_id);
764 EXPECT_EQ(1, IterateAndCount(quad_new));
765 EXPECT_EQ(resource_id + 1, quad_new->io_surface_resource_id);
768 TEST_F(DrawQuadIteratorTest, RenderPassDrawQuad) {
769 gfx::Rect visible_rect(40, 50, 30, 20);
770 RenderPassId render_pass_id(22, 64);
771 ResourceProvider::ResourceId mask_resource_id = 78;
772 gfx::Vector2dF mask_uv_scale(33.f, 19.f);
773 gfx::Size mask_texture_size(128, 134);
774 FilterOperations filters;
775 filters.Append(FilterOperation::CreateBlurFilter(1.f));
776 gfx::Vector2dF filters_scale(2.f, 3.f);
777 FilterOperations background_filters;
778 background_filters.Append(
779 FilterOperation::CreateGrayscaleFilter(1.f));
781 RenderPassId copied_render_pass_id(235, 11);
783 CREATE_SHARED_STATE();
784 CREATE_QUAD_NEW_RP(RenderPassDrawQuad,
793 copied_render_pass_id);
794 EXPECT_EQ(mask_resource_id, quad_new->mask_resource_id);
795 EXPECT_EQ(1, IterateAndCount(quad_new));
796 EXPECT_EQ(mask_resource_id + 1, quad_new->mask_resource_id);
797 quad_new->mask_resource_id = 0;
798 EXPECT_EQ(0, IterateAndCount(quad_new));
799 EXPECT_EQ(0u, quad_new->mask_resource_id);
802 TEST_F(DrawQuadIteratorTest, SolidColorDrawQuad) {
803 gfx::Rect visible_rect(40, 50, 30, 20);
804 SkColor color = 0x49494949;
805 bool force_anti_aliasing_off = false;
807 CREATE_SHARED_STATE();
809 SolidColorDrawQuad, visible_rect, color, force_anti_aliasing_off);
810 EXPECT_EQ(0, IterateAndCount(quad_new));
813 TEST_F(DrawQuadIteratorTest, StreamVideoDrawQuad) {
814 gfx::Rect opaque_rect(33, 47, 10, 12);
815 gfx::Rect visible_rect(40, 50, 30, 20);
816 ResourceProvider::ResourceId resource_id = 64;
817 gfx::Transform matrix = gfx::Transform(0.5, 0.25, 1, 0.75, 0, 1);
819 CREATE_SHARED_STATE();
821 StreamVideoDrawQuad, opaque_rect, visible_rect, resource_id, matrix);
822 EXPECT_EQ(resource_id, quad_new->resource_id);
823 EXPECT_EQ(1, IterateAndCount(quad_new));
824 EXPECT_EQ(resource_id + 1, quad_new->resource_id);
827 TEST_F(DrawQuadIteratorTest, SurfaceDrawQuad) {
828 gfx::Rect visible_rect(40, 50, 30, 20);
829 SurfaceId surface_id(4321);
831 CREATE_SHARED_STATE();
832 CREATE_QUAD_2_NEW(SurfaceDrawQuad, visible_rect, surface_id);
833 EXPECT_EQ(0, IterateAndCount(quad_new));
836 TEST_F(DrawQuadIteratorTest, TextureDrawQuad) {
837 gfx::Rect opaque_rect(33, 47, 10, 12);
838 gfx::Rect visible_rect(40, 50, 30, 20);
839 unsigned resource_id = 82;
840 bool premultiplied_alpha = true;
841 gfx::PointF uv_top_left(0.5f, 224.f);
842 gfx::PointF uv_bottom_right(51.5f, 260.f);
843 const float vertex_opacity[] = { 1.0f, 1.0f, 1.0f, 1.0f };
846 CREATE_SHARED_STATE();
847 CREATE_QUAD_9_NEW(TextureDrawQuad,
857 EXPECT_EQ(resource_id, quad_new->resource_id);
858 EXPECT_EQ(1, IterateAndCount(quad_new));
859 EXPECT_EQ(resource_id + 1, quad_new->resource_id);
862 TEST_F(DrawQuadIteratorTest, TileDrawQuad) {
863 gfx::Rect opaque_rect(33, 44, 22, 33);
864 gfx::Rect visible_rect(40, 50, 30, 20);
865 unsigned resource_id = 104;
866 gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
867 gfx::Size texture_size(85, 32);
868 bool swizzle_contents = true;
870 CREATE_SHARED_STATE();
871 CREATE_QUAD_6_NEW(TileDrawQuad,
878 EXPECT_EQ(resource_id, quad_new->resource_id);
879 EXPECT_EQ(1, IterateAndCount(quad_new));
880 EXPECT_EQ(resource_id + 1, quad_new->resource_id);
883 TEST_F(DrawQuadIteratorTest, YUVVideoDrawQuad) {
884 gfx::Rect opaque_rect(33, 47, 10, 12);
885 gfx::Rect visible_rect(40, 50, 30, 20);
886 gfx::RectF tex_coord_rect(0.0f, 0.0f, 0.75f, 0.5f);
887 ResourceProvider::ResourceId y_plane_resource_id = 45;
888 ResourceProvider::ResourceId u_plane_resource_id = 532;
889 ResourceProvider::ResourceId v_plane_resource_id = 4;
890 ResourceProvider::ResourceId a_plane_resource_id = 63;
891 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601_JPEG;
893 CREATE_SHARED_STATE();
894 CREATE_QUAD_8_NEW(YUVVideoDrawQuad,
903 EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material);
904 EXPECT_EQ(y_plane_resource_id, quad_new->y_plane_resource_id);
905 EXPECT_EQ(u_plane_resource_id, quad_new->u_plane_resource_id);
906 EXPECT_EQ(v_plane_resource_id, quad_new->v_plane_resource_id);
907 EXPECT_EQ(a_plane_resource_id, quad_new->a_plane_resource_id);
908 EXPECT_EQ(color_space, quad_new->color_space);
909 EXPECT_EQ(4, IterateAndCount(quad_new));
910 EXPECT_EQ(y_plane_resource_id + 1, quad_new->y_plane_resource_id);
911 EXPECT_EQ(u_plane_resource_id + 1, quad_new->u_plane_resource_id);
912 EXPECT_EQ(v_plane_resource_id + 1, quad_new->v_plane_resource_id);
913 EXPECT_EQ(a_plane_resource_id + 1, quad_new->a_plane_resource_id);
916 // Disabled until picture draw quad is supported for ubercomp: crbug.com/231715
917 TEST_F(DrawQuadIteratorTest, DISABLED_PictureDrawQuad) {
918 gfx::Rect opaque_rect(33, 44, 22, 33);
919 gfx::Rect visible_rect(40, 50, 30, 20);
920 gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
921 gfx::Size texture_size(85, 32);
922 ResourceFormat texture_format = RGBA_8888;
923 gfx::Rect content_rect(30, 40, 20, 30);
924 float contents_scale = 3.141592f;
925 scoped_refptr<PicturePileImpl> picture_pile = PicturePileImpl::Create();
927 CREATE_SHARED_STATE();
928 CREATE_QUAD_8_NEW(PictureDrawQuad,
937 EXPECT_EQ(0, IterateAndCount(quad_new));
940 TEST(DrawQuadTest, LargestQuadType) {
943 for (int i = 0; i <= DrawQuad::MATERIAL_LAST; ++i) {
944 switch (static_cast<DrawQuad::Material>(i)) {
945 case DrawQuad::CHECKERBOARD:
946 largest = std::max(largest, sizeof(CheckerboardDrawQuad));
948 case DrawQuad::DEBUG_BORDER:
949 largest = std::max(largest, sizeof(DebugBorderDrawQuad));
951 case DrawQuad::IO_SURFACE_CONTENT:
952 largest = std::max(largest, sizeof(IOSurfaceDrawQuad));
954 case DrawQuad::PICTURE_CONTENT:
955 largest = std::max(largest, sizeof(PictureDrawQuad));
957 case DrawQuad::TEXTURE_CONTENT:
958 largest = std::max(largest, sizeof(TextureDrawQuad));
960 case DrawQuad::RENDER_PASS:
961 largest = std::max(largest, sizeof(RenderPassDrawQuad));
963 case DrawQuad::SOLID_COLOR:
964 largest = std::max(largest, sizeof(SolidColorDrawQuad));
966 case DrawQuad::SURFACE_CONTENT:
967 largest = std::max(largest, sizeof(SurfaceDrawQuad));
969 case DrawQuad::TILED_CONTENT:
970 largest = std::max(largest, sizeof(TileDrawQuad));
972 case DrawQuad::STREAM_VIDEO_CONTENT:
973 largest = std::max(largest, sizeof(StreamVideoDrawQuad));
975 case DrawQuad::YUV_VIDEO_CONTENT:
976 largest = std::max(largest, sizeof(YUVVideoDrawQuad));
978 case DrawQuad::INVALID:
982 EXPECT_EQ(LargestDrawQuadSize(), largest);
987 // On failure, output the size of all quads for debugging.
988 LOG(ERROR) << "largest " << largest;
989 LOG(ERROR) << "kLargestDrawQuad " << LargestDrawQuadSize();
990 for (int i = 0; i <= DrawQuad::MATERIAL_LAST; ++i) {
991 switch (static_cast<DrawQuad::Material>(i)) {
992 case DrawQuad::CHECKERBOARD:
993 LOG(ERROR) << "CheckerboardDrawQuad " << sizeof(CheckerboardDrawQuad);
995 case DrawQuad::DEBUG_BORDER:
996 LOG(ERROR) << "DebugBorderDrawQuad " << sizeof(DebugBorderDrawQuad);
998 case DrawQuad::IO_SURFACE_CONTENT:
999 LOG(ERROR) << "IOSurfaceDrawQuad " << sizeof(IOSurfaceDrawQuad);
1001 case DrawQuad::PICTURE_CONTENT:
1002 LOG(ERROR) << "PictureDrawQuad " << sizeof(PictureDrawQuad);
1004 case DrawQuad::TEXTURE_CONTENT:
1005 LOG(ERROR) << "TextureDrawQuad " << sizeof(TextureDrawQuad);
1007 case DrawQuad::RENDER_PASS:
1008 LOG(ERROR) << "RenderPassDrawQuad " << sizeof(RenderPassDrawQuad);
1010 case DrawQuad::SOLID_COLOR:
1011 LOG(ERROR) << "SolidColorDrawQuad " << sizeof(SolidColorDrawQuad);
1013 case DrawQuad::SURFACE_CONTENT:
1014 LOG(ERROR) << "SurfaceDrawQuad " << sizeof(SurfaceDrawQuad);
1016 case DrawQuad::TILED_CONTENT:
1017 LOG(ERROR) << "TileDrawQuad " << sizeof(TileDrawQuad);
1019 case DrawQuad::STREAM_VIDEO_CONTENT:
1020 LOG(ERROR) << "StreamVideoDrawQuad " << sizeof(StreamVideoDrawQuad);
1022 case DrawQuad::YUV_VIDEO_CONTENT:
1023 LOG(ERROR) << "YUVVideoDrawQuad " << sizeof(YUVVideoDrawQuad);
1025 case DrawQuad::INVALID: