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 "base/message_loop/message_loop.h"
6 #include "cc/layers/append_quads_data.h"
7 #include "cc/output/gl_renderer.h"
8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/picture_draw_quad.h"
10 #include "cc/quads/texture_draw_quad.h"
11 #include "cc/resources/video_resource_updater.h"
12 #include "cc/test/fake_picture_pile_impl.h"
13 #include "cc/test/pixel_test.h"
14 #include "gpu/command_buffer/client/gles2_interface.h"
15 #include "media/base/video_frame.h"
16 #include "third_party/skia/include/core/SkColorPriv.h"
17 #include "third_party/skia/include/core/SkImageFilter.h"
18 #include "third_party/skia/include/core/SkMatrix.h"
19 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
20 #include "third_party/skia/include/effects/SkColorMatrixFilter.h"
21 #include "ui/gfx/geometry/rect_conversions.h"
23 using gpu::gles2::GLES2Interface
;
28 #if !defined(OS_ANDROID)
29 scoped_ptr
<RenderPass
> CreateTestRootRenderPass(RenderPassId id
,
30 const gfx::Rect
& rect
) {
31 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
32 const gfx::Rect output_rect
= rect
;
33 const gfx::Rect damage_rect
= rect
;
34 const gfx::Transform transform_to_root_target
;
35 pass
->SetNew(id
, output_rect
, damage_rect
, transform_to_root_target
);
39 scoped_ptr
<RenderPass
> CreateTestRenderPass(
41 const gfx::Rect
& rect
,
42 const gfx::Transform
& transform_to_root_target
) {
43 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
44 const gfx::Rect output_rect
= rect
;
45 const gfx::Rect damage_rect
= rect
;
46 pass
->SetNew(id
, output_rect
, damage_rect
, transform_to_root_target
);
50 SharedQuadState
* CreateTestSharedQuadState(
51 gfx::Transform content_to_target_transform
,
52 const gfx::Rect
& rect
,
53 RenderPass
* render_pass
) {
54 const gfx::Size content_bounds
= rect
.size();
55 const gfx::Rect visible_content_rect
= rect
;
56 const gfx::Rect clip_rect
= rect
;
57 const bool is_clipped
= false;
58 const float opacity
= 1.0f
;
59 const SkXfermode::Mode blend_mode
= SkXfermode::kSrcOver_Mode
;
60 int sorting_context_id
= 0;
61 SharedQuadState
* shared_state
= render_pass
->CreateAndAppendSharedQuadState();
62 shared_state
->SetAll(content_to_target_transform
,
73 SharedQuadState
* CreateTestSharedQuadStateClipped(
74 gfx::Transform content_to_target_transform
,
75 const gfx::Rect
& rect
,
76 const gfx::Rect
& clip_rect
,
77 RenderPass
* render_pass
) {
78 const gfx::Size content_bounds
= rect
.size();
79 const gfx::Rect visible_content_rect
= clip_rect
;
80 const bool is_clipped
= true;
81 const float opacity
= 1.0f
;
82 const SkXfermode::Mode blend_mode
= SkXfermode::kSrcOver_Mode
;
83 int sorting_context_id
= 0;
84 SharedQuadState
* shared_state
= render_pass
->CreateAndAppendSharedQuadState();
85 shared_state
->SetAll(content_to_target_transform
,
96 void CreateTestRenderPassDrawQuad(const SharedQuadState
* shared_state
,
97 const gfx::Rect
& rect
,
99 RenderPass
* render_pass
) {
100 RenderPassDrawQuad
* quad
=
101 render_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
102 quad
->SetNew(shared_state
,
106 0, // mask_resource_id
107 gfx::Vector2dF(), // mask_uv_scale
108 gfx::Size(), // mask_texture_size
109 FilterOperations(), // foreground filters
110 gfx::Vector2dF(), // filters scale
111 FilterOperations()); // background filters
114 void CreateTestTextureDrawQuad(const gfx::Rect
& rect
,
116 SkColor background_color
,
117 bool premultiplied_alpha
,
118 const SharedQuadState
* shared_state
,
119 ResourceProvider
* resource_provider
,
120 RenderPass
* render_pass
) {
121 SkPMColor pixel_color
= premultiplied_alpha
?
122 SkPreMultiplyColor(texel_color
) :
123 SkPackARGB32NoCheck(SkColorGetA(texel_color
),
124 SkColorGetR(texel_color
),
125 SkColorGetG(texel_color
),
126 SkColorGetB(texel_color
));
127 std::vector
<uint32_t> pixels(rect
.size().GetArea(), pixel_color
);
129 ResourceProvider::ResourceId resource
=
130 resource_provider
->CreateResource(rect
.size(),
132 ResourceProvider::TextureHintImmutable
,
134 resource_provider
->SetPixels(
136 reinterpret_cast<uint8_t*>(&pixels
.front()),
141 float vertex_opacity
[4] = {1.0f
, 1.0f
, 1.0f
, 1.0f
};
143 TextureDrawQuad
* quad
=
144 render_pass
->CreateAndAppendDrawQuad
<TextureDrawQuad
>();
145 quad
->SetNew(shared_state
,
151 gfx::PointF(0.0f
, 0.0f
), // uv_top_left
152 gfx::PointF(1.0f
, 1.0f
), // uv_bottom_right
156 false); // nearest_neighbor
159 typedef ::testing::Types
<GLRenderer
,
161 GLRendererWithExpandedViewport
,
162 SoftwareRendererWithExpandedViewport
> RendererTypes
;
163 TYPED_TEST_CASE(RendererPixelTest
, RendererTypes
);
165 template <typename RendererType
>
166 class FuzzyForSoftwareOnlyPixelComparator
: public PixelComparator
{
168 explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha
)
169 : fuzzy_(discard_alpha
), exact_(discard_alpha
) {}
171 virtual bool Compare(const SkBitmap
& actual_bmp
,
172 const SkBitmap
& expected_bmp
) const;
175 FuzzyPixelOffByOneComparator fuzzy_
;
176 ExactPixelComparator exact_
;
180 bool FuzzyForSoftwareOnlyPixelComparator
<SoftwareRenderer
>::Compare(
181 const SkBitmap
& actual_bmp
,
182 const SkBitmap
& expected_bmp
) const {
183 return fuzzy_
.Compare(actual_bmp
, expected_bmp
);
187 bool FuzzyForSoftwareOnlyPixelComparator
<
188 SoftwareRendererWithExpandedViewport
>::Compare(
189 const SkBitmap
& actual_bmp
,
190 const SkBitmap
& expected_bmp
) const {
191 return fuzzy_
.Compare(actual_bmp
, expected_bmp
);
194 template<typename RendererType
>
195 bool FuzzyForSoftwareOnlyPixelComparator
<RendererType
>::Compare(
196 const SkBitmap
& actual_bmp
,
197 const SkBitmap
& expected_bmp
) const {
198 return exact_
.Compare(actual_bmp
, expected_bmp
);
201 TYPED_TEST(RendererPixelTest
, SimpleGreenRect
) {
202 gfx::Rect
rect(this->device_viewport_size_
);
204 RenderPassId
id(1, 1);
205 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
207 SharedQuadState
* shared_state
=
208 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
210 SolidColorDrawQuad
* color_quad
=
211 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
212 color_quad
->SetNew(shared_state
, rect
, rect
, SK_ColorGREEN
, false);
214 RenderPassList pass_list
;
215 pass_list
.push_back(pass
.Pass());
217 EXPECT_TRUE(this->RunPixelTest(
219 base::FilePath(FILE_PATH_LITERAL("green.png")),
220 ExactPixelComparator(true)));
223 TYPED_TEST(RendererPixelTest
, SimpleGreenRect_NonRootRenderPass
) {
224 gfx::Rect
rect(this->device_viewport_size_
);
225 gfx::Rect
small_rect(100, 100);
227 RenderPassId
child_id(2, 1);
228 scoped_ptr
<RenderPass
> child_pass
=
229 CreateTestRenderPass(child_id
, small_rect
, gfx::Transform());
231 SharedQuadState
* child_shared_state
=
232 CreateTestSharedQuadState(gfx::Transform(), small_rect
, child_pass
.get());
234 SolidColorDrawQuad
* color_quad
=
235 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
236 color_quad
->SetNew(child_shared_state
, rect
, rect
, SK_ColorGREEN
, false);
238 RenderPassId
root_id(1, 1);
239 scoped_ptr
<RenderPass
> root_pass
=
240 CreateTestRenderPass(root_id
, rect
, gfx::Transform());
242 SharedQuadState
* root_shared_state
=
243 CreateTestSharedQuadState(gfx::Transform(), rect
, root_pass
.get());
245 CreateTestRenderPassDrawQuad(
246 root_shared_state
, small_rect
, child_id
, root_pass
.get());
248 RenderPass
* child_pass_ptr
= child_pass
.get();
250 RenderPassList pass_list
;
251 pass_list
.push_back(child_pass
.Pass());
252 pass_list
.push_back(root_pass
.Pass());
254 EXPECT_TRUE(this->RunPixelTestWithReadbackTarget(
257 base::FilePath(FILE_PATH_LITERAL("green_small.png")),
258 ExactPixelComparator(true)));
261 TYPED_TEST(RendererPixelTest
, PremultipliedTextureWithoutBackground
) {
262 gfx::Rect
rect(this->device_viewport_size_
);
264 RenderPassId
id(1, 1);
265 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
267 SharedQuadState
* shared_state
=
268 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
270 CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_
),
271 SkColorSetARGB(128, 0, 255, 0), // Texel color.
272 SK_ColorTRANSPARENT
, // Background color.
273 true, // Premultiplied alpha.
275 this->resource_provider_
.get(),
278 SolidColorDrawQuad
* color_quad
=
279 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
280 color_quad
->SetNew(shared_state
, rect
, rect
, SK_ColorWHITE
, false);
282 RenderPassList pass_list
;
283 pass_list
.push_back(pass
.Pass());
285 EXPECT_TRUE(this->RunPixelTest(
287 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
288 FuzzyPixelOffByOneComparator(true)));
291 TYPED_TEST(RendererPixelTest
, PremultipliedTextureWithBackground
) {
292 gfx::Rect
rect(this->device_viewport_size_
);
294 RenderPassId
id(1, 1);
295 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
297 SharedQuadState
* texture_quad_state
=
298 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
299 texture_quad_state
->opacity
= 0.8f
;
301 CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_
),
302 SkColorSetARGB(204, 120, 255, 120), // Texel color.
303 SK_ColorGREEN
, // Background color.
304 true, // Premultiplied alpha.
306 this->resource_provider_
.get(),
309 SharedQuadState
* color_quad_state
=
310 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
311 SolidColorDrawQuad
* color_quad
=
312 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
313 color_quad
->SetNew(color_quad_state
, rect
, rect
, SK_ColorWHITE
, false);
315 RenderPassList pass_list
;
316 pass_list
.push_back(pass
.Pass());
318 EXPECT_TRUE(this->RunPixelTest(
320 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
321 FuzzyPixelOffByOneComparator(true)));
324 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
325 TEST_F(GLRendererPixelTest
, NonPremultipliedTextureWithoutBackground
) {
326 gfx::Rect
rect(this->device_viewport_size_
);
328 RenderPassId
id(1, 1);
329 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
331 SharedQuadState
* shared_state
=
332 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
334 CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_
),
335 SkColorSetARGB(128, 0, 255, 0), // Texel color.
336 SK_ColorTRANSPARENT
, // Background color.
337 false, // Premultiplied alpha.
339 this->resource_provider_
.get(),
342 SolidColorDrawQuad
* color_quad
=
343 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
344 color_quad
->SetNew(shared_state
, rect
, rect
, SK_ColorWHITE
, false);
346 RenderPassList pass_list
;
347 pass_list
.push_back(pass
.Pass());
349 EXPECT_TRUE(this->RunPixelTest(
351 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
352 FuzzyPixelOffByOneComparator(true)));
355 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
356 TEST_F(GLRendererPixelTest
, NonPremultipliedTextureWithBackground
) {
357 gfx::Rect
rect(this->device_viewport_size_
);
359 RenderPassId
id(1, 1);
360 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
362 SharedQuadState
* texture_quad_state
=
363 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
364 texture_quad_state
->opacity
= 0.8f
;
366 CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_
),
367 SkColorSetARGB(204, 120, 255, 120), // Texel color.
368 SK_ColorGREEN
, // Background color.
369 false, // Premultiplied alpha.
371 this->resource_provider_
.get(),
374 SharedQuadState
* color_quad_state
=
375 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
376 SolidColorDrawQuad
* color_quad
=
377 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
378 color_quad
->SetNew(color_quad_state
, rect
, rect
, SK_ColorWHITE
, false);
380 RenderPassList pass_list
;
381 pass_list
.push_back(pass
.Pass());
383 EXPECT_TRUE(this->RunPixelTest(
385 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
386 FuzzyPixelOffByOneComparator(true)));
389 class VideoGLRendererPixelTest
: public GLRendererPixelTest
{
391 void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState
* shared_state
,
392 media::VideoFrame::Format format
,
394 const gfx::RectF
& tex_coord_rect
,
395 RenderPass
* render_pass
) {
396 const gfx::Rect
rect(this->device_viewport_size_
);
398 scoped_refptr
<media::VideoFrame
> video_frame
=
399 media::VideoFrame::CreateFrame(
400 format
, rect
.size(), rect
, rect
.size(), base::TimeDelta());
402 // YUV values representing a striped pattern, for validating texture
403 // coordinates for sampling.
407 for (int i
= 0; i
< video_frame
->rows(media::VideoFrame::kYPlane
); ++i
) {
408 uint8_t* y_row
= video_frame
->data(media::VideoFrame::kYPlane
) +
409 video_frame
->stride(media::VideoFrame::kYPlane
) * i
;
410 for (int j
= 0; j
< video_frame
->row_bytes(media::VideoFrame::kYPlane
);
412 y_row
[j
] = (y_value
+= 1);
415 for (int i
= 0; i
< video_frame
->rows(media::VideoFrame::kUPlane
); ++i
) {
416 uint8_t* u_row
= video_frame
->data(media::VideoFrame::kUPlane
) +
417 video_frame
->stride(media::VideoFrame::kUPlane
) * i
;
418 uint8_t* v_row
= video_frame
->data(media::VideoFrame::kVPlane
) +
419 video_frame
->stride(media::VideoFrame::kVPlane
) * i
;
420 for (int j
= 0; j
< video_frame
->row_bytes(media::VideoFrame::kUPlane
);
422 u_row
[j
] = (u_value
+= 3);
423 v_row
[j
] = (v_value
+= 5);
426 CreateTestYUVVideoDrawQuad_FromVideoFrame(
427 shared_state
, video_frame
, is_transparent
, tex_coord_rect
, render_pass
);
430 void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState
* shared_state
,
431 media::VideoFrame::Format format
,
433 const gfx::RectF
& tex_coord_rect
,
437 RenderPass
* render_pass
) {
438 const gfx::Rect
rect(this->device_viewport_size_
);
440 scoped_refptr
<media::VideoFrame
> video_frame
=
441 media::VideoFrame::CreateFrame(
442 format
, rect
.size(), rect
, rect
.size(), base::TimeDelta());
444 // YUV values of a solid, constant, color. Useful for testing that color
445 // space/color range are being handled properly.
446 memset(video_frame
->data(media::VideoFrame::kYPlane
),
448 video_frame
->stride(media::VideoFrame::kYPlane
) *
449 video_frame
->rows(media::VideoFrame::kYPlane
));
450 memset(video_frame
->data(media::VideoFrame::kUPlane
),
452 video_frame
->stride(media::VideoFrame::kUPlane
) *
453 video_frame
->rows(media::VideoFrame::kUPlane
));
454 memset(video_frame
->data(media::VideoFrame::kVPlane
),
456 video_frame
->stride(media::VideoFrame::kVPlane
) *
457 video_frame
->rows(media::VideoFrame::kVPlane
));
459 CreateTestYUVVideoDrawQuad_FromVideoFrame(
460 shared_state
, video_frame
, is_transparent
, tex_coord_rect
, render_pass
);
463 void CreateTestYUVVideoDrawQuad_FromVideoFrame(
464 const SharedQuadState
* shared_state
,
465 scoped_refptr
<media::VideoFrame
> video_frame
,
467 const gfx::RectF
& tex_coord_rect
,
468 RenderPass
* render_pass
) {
469 const bool with_alpha
= (video_frame
->format() == media::VideoFrame::YV12A
);
470 const YUVVideoDrawQuad::ColorSpace color_space
=
471 (video_frame
->format() == media::VideoFrame::YV12J
472 ? YUVVideoDrawQuad::REC_601_JPEG
473 : YUVVideoDrawQuad::REC_601
);
474 const gfx::Rect
rect(this->device_viewport_size_
);
475 const gfx::Rect
opaque_rect(0, 0, 0, 0);
478 memset(video_frame
->data(media::VideoFrame::kAPlane
),
479 is_transparent
? 0 : 128,
480 video_frame
->stride(media::VideoFrame::kAPlane
) *
481 video_frame
->rows(media::VideoFrame::kAPlane
));
483 VideoFrameExternalResources resources
=
484 video_resource_updater_
->CreateExternalResourcesFromVideoFrame(
487 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE
, resources
.type
);
488 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame
->format()),
489 resources
.mailboxes
.size());
490 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame
->format()),
491 resources
.release_callbacks
.size());
493 ResourceProvider::ResourceId y_resource
=
494 resource_provider_
->CreateResourceFromTextureMailbox(
495 resources
.mailboxes
[media::VideoFrame::kYPlane
],
496 SingleReleaseCallbackImpl::Create(
497 resources
.release_callbacks
[media::VideoFrame::kYPlane
]));
498 ResourceProvider::ResourceId u_resource
=
499 resource_provider_
->CreateResourceFromTextureMailbox(
500 resources
.mailboxes
[media::VideoFrame::kUPlane
],
501 SingleReleaseCallbackImpl::Create(
502 resources
.release_callbacks
[media::VideoFrame::kUPlane
]));
503 ResourceProvider::ResourceId v_resource
=
504 resource_provider_
->CreateResourceFromTextureMailbox(
505 resources
.mailboxes
[media::VideoFrame::kVPlane
],
506 SingleReleaseCallbackImpl::Create(
507 resources
.release_callbacks
[media::VideoFrame::kVPlane
]));
508 ResourceProvider::ResourceId a_resource
= 0;
510 a_resource
= resource_provider_
->CreateResourceFromTextureMailbox(
511 resources
.mailboxes
[media::VideoFrame::kAPlane
],
512 SingleReleaseCallbackImpl::Create(
513 resources
.release_callbacks
[media::VideoFrame::kAPlane
]));
516 YUVVideoDrawQuad
* yuv_quad
=
517 render_pass
->CreateAndAppendDrawQuad
<YUVVideoDrawQuad
>();
518 yuv_quad
->SetNew(shared_state
,
530 void SetUp() override
{
531 GLRendererPixelTest::SetUp();
532 video_resource_updater_
.reset(new VideoResourceUpdater(
533 output_surface_
->context_provider(), resource_provider_
.get()));
537 scoped_ptr
<VideoResourceUpdater
> video_resource_updater_
;
540 TEST_F(VideoGLRendererPixelTest
, SimpleYUVRect
) {
541 gfx::Rect
rect(this->device_viewport_size_
);
543 RenderPassId
id(1, 1);
544 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
546 SharedQuadState
* shared_state
=
547 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
549 CreateTestYUVVideoDrawQuad_Striped(shared_state
,
550 media::VideoFrame::YV12
,
552 gfx::RectF(0.0f
, 0.0f
, 1.0f
, 1.0f
),
555 RenderPassList pass_list
;
556 pass_list
.push_back(pass
.Pass());
559 this->RunPixelTest(&pass_list
,
560 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
561 FuzzyPixelOffByOneComparator(true)));
564 TEST_F(VideoGLRendererPixelTest
, OffsetYUVRect
) {
565 gfx::Rect
rect(this->device_viewport_size_
);
567 RenderPassId
id(1, 1);
568 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
570 SharedQuadState
* shared_state
=
571 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
573 // Intentionally sets frame format to I420 for testing coverage.
574 CreateTestYUVVideoDrawQuad_Striped(shared_state
,
575 media::VideoFrame::I420
,
577 gfx::RectF(0.125f
, 0.25f
, 0.75f
, 0.5f
),
580 RenderPassList pass_list
;
581 pass_list
.push_back(pass
.Pass());
583 EXPECT_TRUE(this->RunPixelTest(
585 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
586 FuzzyPixelOffByOneComparator(true)));
589 TEST_F(VideoGLRendererPixelTest
, SimpleYUVRectBlack
) {
590 gfx::Rect
rect(this->device_viewport_size_
);
592 RenderPassId
id(1, 1);
593 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
595 SharedQuadState
* shared_state
=
596 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
598 // In MPEG color range YUV values of (15,128,128) should produce black.
599 CreateTestYUVVideoDrawQuad_Solid(shared_state
,
600 media::VideoFrame::YV12
,
602 gfx::RectF(0.0f
, 0.0f
, 1.0f
, 1.0f
),
608 RenderPassList pass_list
;
609 pass_list
.push_back(pass
.Pass());
611 // If we didn't get black out of the YUV values above, then we probably have a
612 // color range issue.
613 EXPECT_TRUE(this->RunPixelTest(&pass_list
,
614 base::FilePath(FILE_PATH_LITERAL("black.png")),
615 FuzzyPixelOffByOneComparator(true)));
618 TEST_F(VideoGLRendererPixelTest
, SimpleYUVJRect
) {
619 gfx::Rect
rect(this->device_viewport_size_
);
621 RenderPassId
id(1, 1);
622 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
624 SharedQuadState
* shared_state
=
625 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
627 // YUV of (149,43,21) should be green (0,255,0) in RGB.
628 CreateTestYUVVideoDrawQuad_Solid(shared_state
,
629 media::VideoFrame::YV12J
,
631 gfx::RectF(0.0f
, 0.0f
, 1.0f
, 1.0f
),
637 RenderPassList pass_list
;
638 pass_list
.push_back(pass
.Pass());
640 EXPECT_TRUE(this->RunPixelTest(&pass_list
,
641 base::FilePath(FILE_PATH_LITERAL("green.png")),
642 FuzzyPixelOffByOneComparator(true)));
645 TEST_F(VideoGLRendererPixelTest
, SimpleYUVJRectGrey
) {
646 gfx::Rect
rect(this->device_viewport_size_
);
648 RenderPassId
id(1, 1);
649 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
651 SharedQuadState
* shared_state
=
652 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
654 // Dark grey in JPEG color range (in MPEG, this is black).
655 CreateTestYUVVideoDrawQuad_Solid(shared_state
,
656 media::VideoFrame::YV12J
,
658 gfx::RectF(0.0f
, 0.0f
, 1.0f
, 1.0f
),
664 RenderPassList pass_list
;
665 pass_list
.push_back(pass
.Pass());
668 this->RunPixelTest(&pass_list
,
669 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")),
670 FuzzyPixelOffByOneComparator(true)));
673 TEST_F(VideoGLRendererPixelTest
, SimpleYUVARect
) {
674 gfx::Rect
rect(this->device_viewport_size_
);
676 RenderPassId
id(1, 1);
677 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
679 SharedQuadState
* shared_state
=
680 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
682 CreateTestYUVVideoDrawQuad_Striped(shared_state
,
683 media::VideoFrame::YV12A
,
685 gfx::RectF(0.0f
, 0.0f
, 1.0f
, 1.0f
),
688 SolidColorDrawQuad
* color_quad
=
689 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
690 color_quad
->SetNew(shared_state
, rect
, rect
, SK_ColorWHITE
, false);
692 RenderPassList pass_list
;
693 pass_list
.push_back(pass
.Pass());
695 EXPECT_TRUE(this->RunPixelTest(
697 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
698 FuzzyPixelOffByOneComparator(true)));
701 TEST_F(VideoGLRendererPixelTest
, FullyTransparentYUVARect
) {
702 gfx::Rect
rect(this->device_viewport_size_
);
704 RenderPassId
id(1, 1);
705 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
707 SharedQuadState
* shared_state
=
708 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
710 CreateTestYUVVideoDrawQuad_Striped(shared_state
,
711 media::VideoFrame::YV12A
,
713 gfx::RectF(0.0f
, 0.0f
, 1.0f
, 1.0f
),
716 SolidColorDrawQuad
* color_quad
=
717 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
718 color_quad
->SetNew(shared_state
, rect
, rect
, SK_ColorBLACK
, false);
720 RenderPassList pass_list
;
721 pass_list
.push_back(pass
.Pass());
723 EXPECT_TRUE(this->RunPixelTest(
725 base::FilePath(FILE_PATH_LITERAL("black.png")),
726 ExactPixelComparator(true)));
729 TYPED_TEST(RendererPixelTest
, FastPassColorFilterAlpha
) {
730 gfx::Rect
viewport_rect(this->device_viewport_size_
);
732 RenderPassId
root_pass_id(1, 1);
733 scoped_ptr
<RenderPass
> root_pass
=
734 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
736 RenderPassId
child_pass_id(2, 2);
737 gfx::Rect
pass_rect(this->device_viewport_size_
);
738 gfx::Transform transform_to_root
;
739 scoped_ptr
<RenderPass
> child_pass
=
740 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
742 gfx::Transform content_to_target_transform
;
743 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
744 content_to_target_transform
, viewport_rect
, child_pass
.get());
745 shared_state
->opacity
= 0.5f
;
747 gfx::Rect
blue_rect(0,
749 this->device_viewport_size_
.width(),
750 this->device_viewport_size_
.height() / 2);
751 SolidColorDrawQuad
* blue
=
752 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
753 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
754 gfx::Rect
yellow_rect(0,
755 this->device_viewport_size_
.height() / 2,
756 this->device_viewport_size_
.width(),
757 this->device_viewport_size_
.height() / 2);
758 SolidColorDrawQuad
* yellow
=
759 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
760 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
762 SharedQuadState
* blank_state
= CreateTestSharedQuadState(
763 content_to_target_transform
, viewport_rect
, child_pass
.get());
765 SolidColorDrawQuad
* white
=
766 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
768 blank_state
, viewport_rect
, viewport_rect
, SK_ColorWHITE
, false);
770 SharedQuadState
* pass_shared_state
=
771 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
775 matrix
[0] = 0.213f
+ 0.787f
* amount
;
776 matrix
[1] = 0.715f
- 0.715f
* amount
;
777 matrix
[2] = 1.f
- (matrix
[0] + matrix
[1]);
778 matrix
[3] = matrix
[4] = 0;
779 matrix
[5] = 0.213f
- 0.213f
* amount
;
780 matrix
[6] = 0.715f
+ 0.285f
* amount
;
781 matrix
[7] = 1.f
- (matrix
[5] + matrix
[6]);
782 matrix
[8] = matrix
[9] = 0;
783 matrix
[10] = 0.213f
- 0.213f
* amount
;
784 matrix
[11] = 0.715f
- 0.715f
* amount
;
785 matrix
[12] = 1.f
- (matrix
[10] + matrix
[11]);
786 matrix
[13] = matrix
[14] = 0;
787 matrix
[15] = matrix
[16] = matrix
[17] = matrix
[19] = 0;
789 skia::RefPtr
<SkColorFilter
> colorFilter(
790 skia::AdoptRef(SkColorMatrixFilter::Create(matrix
)));
791 skia::RefPtr
<SkImageFilter
> filter
=
792 skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter
.get(), NULL
));
793 FilterOperations filters
;
794 filters
.Append(FilterOperation::CreateReferenceFilter(filter
));
796 RenderPassDrawQuad
* render_pass_quad
=
797 root_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
798 render_pass_quad
->SetNew(pass_shared_state
,
809 RenderPassList pass_list
;
810 pass_list
.push_back(child_pass
.Pass());
811 pass_list
.push_back(root_pass
.Pass());
813 // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
814 // renderer so use a fuzzy comparator.
815 EXPECT_TRUE(this->RunPixelTest(
817 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
818 FuzzyForSoftwareOnlyPixelComparator
<TypeParam
>(false)));
821 TYPED_TEST(RendererPixelTest
, FastPassSaturateFilter
) {
822 gfx::Rect
viewport_rect(this->device_viewport_size_
);
824 RenderPassId
root_pass_id(1, 1);
825 scoped_ptr
<RenderPass
> root_pass
=
826 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
828 RenderPassId
child_pass_id(2, 2);
829 gfx::Rect
pass_rect(this->device_viewport_size_
);
830 gfx::Transform transform_to_root
;
831 scoped_ptr
<RenderPass
> child_pass
=
832 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
834 gfx::Transform content_to_target_transform
;
835 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
836 content_to_target_transform
, viewport_rect
, child_pass
.get());
837 shared_state
->opacity
= 0.5f
;
839 gfx::Rect
blue_rect(0,
841 this->device_viewport_size_
.width(),
842 this->device_viewport_size_
.height() / 2);
843 SolidColorDrawQuad
* blue
=
844 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
845 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
846 gfx::Rect
yellow_rect(0,
847 this->device_viewport_size_
.height() / 2,
848 this->device_viewport_size_
.width(),
849 this->device_viewport_size_
.height() / 2);
850 SolidColorDrawQuad
* yellow
=
851 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
852 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
854 SharedQuadState
* blank_state
= CreateTestSharedQuadState(
855 content_to_target_transform
, viewport_rect
, child_pass
.get());
857 SolidColorDrawQuad
* white
=
858 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
860 blank_state
, viewport_rect
, viewport_rect
, SK_ColorWHITE
, false);
862 SharedQuadState
* pass_shared_state
=
863 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
865 FilterOperations filters
;
866 filters
.Append(FilterOperation::CreateSaturateFilter(0.5f
));
868 RenderPassDrawQuad
* render_pass_quad
=
869 root_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
870 render_pass_quad
->SetNew(pass_shared_state
,
881 RenderPassList pass_list
;
882 pass_list
.push_back(child_pass
.Pass());
883 pass_list
.push_back(root_pass
.Pass());
885 EXPECT_TRUE(this->RunPixelTest(
887 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
888 ExactPixelComparator(true)));
891 TYPED_TEST(RendererPixelTest
, FastPassFilterChain
) {
892 gfx::Rect
viewport_rect(this->device_viewport_size_
);
894 RenderPassId
root_pass_id(1, 1);
895 scoped_ptr
<RenderPass
> root_pass
=
896 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
898 RenderPassId
child_pass_id(2, 2);
899 gfx::Rect
pass_rect(this->device_viewport_size_
);
900 gfx::Transform transform_to_root
;
901 scoped_ptr
<RenderPass
> child_pass
=
902 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
904 gfx::Transform content_to_target_transform
;
905 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
906 content_to_target_transform
, viewport_rect
, child_pass
.get());
907 shared_state
->opacity
= 0.5f
;
909 gfx::Rect
blue_rect(0,
911 this->device_viewport_size_
.width(),
912 this->device_viewport_size_
.height() / 2);
913 SolidColorDrawQuad
* blue
=
914 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
915 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
916 gfx::Rect
yellow_rect(0,
917 this->device_viewport_size_
.height() / 2,
918 this->device_viewport_size_
.width(),
919 this->device_viewport_size_
.height() / 2);
920 SolidColorDrawQuad
* yellow
=
921 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
922 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
924 SharedQuadState
* blank_state
= CreateTestSharedQuadState(
925 content_to_target_transform
, viewport_rect
, child_pass
.get());
927 SolidColorDrawQuad
* white
=
928 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
930 blank_state
, viewport_rect
, viewport_rect
, SK_ColorWHITE
, false);
932 SharedQuadState
* pass_shared_state
=
933 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
935 FilterOperations filters
;
936 filters
.Append(FilterOperation::CreateGrayscaleFilter(1.f
));
937 filters
.Append(FilterOperation::CreateBrightnessFilter(0.5f
));
939 RenderPassDrawQuad
* render_pass_quad
=
940 root_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
941 render_pass_quad
->SetNew(pass_shared_state
,
952 RenderPassList pass_list
;
953 pass_list
.push_back(child_pass
.Pass());
954 pass_list
.push_back(root_pass
.Pass());
956 EXPECT_TRUE(this->RunPixelTest(
958 base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")),
959 ExactPixelComparator(true)));
962 TYPED_TEST(RendererPixelTest
, FastPassColorFilterAlphaTranslation
) {
963 gfx::Rect
viewport_rect(this->device_viewport_size_
);
965 RenderPassId
root_pass_id(1, 1);
966 scoped_ptr
<RenderPass
> root_pass
=
967 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
969 RenderPassId
child_pass_id(2, 2);
970 gfx::Rect
pass_rect(this->device_viewport_size_
);
971 gfx::Transform transform_to_root
;
972 scoped_ptr
<RenderPass
> child_pass
=
973 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
975 gfx::Transform content_to_target_transform
;
976 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
977 content_to_target_transform
, viewport_rect
, child_pass
.get());
978 shared_state
->opacity
= 0.5f
;
980 gfx::Rect
blue_rect(0,
982 this->device_viewport_size_
.width(),
983 this->device_viewport_size_
.height() / 2);
984 SolidColorDrawQuad
* blue
=
985 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
986 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
987 gfx::Rect
yellow_rect(0,
988 this->device_viewport_size_
.height() / 2,
989 this->device_viewport_size_
.width(),
990 this->device_viewport_size_
.height() / 2);
991 SolidColorDrawQuad
* yellow
=
992 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
993 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
995 SharedQuadState
* blank_state
= CreateTestSharedQuadState(
996 content_to_target_transform
, viewport_rect
, child_pass
.get());
998 SolidColorDrawQuad
* white
=
999 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1001 blank_state
, viewport_rect
, viewport_rect
, SK_ColorWHITE
, false);
1003 SharedQuadState
* pass_shared_state
=
1004 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
1006 SkScalar matrix
[20];
1007 float amount
= 0.5f
;
1008 matrix
[0] = 0.213f
+ 0.787f
* amount
;
1009 matrix
[1] = 0.715f
- 0.715f
* amount
;
1010 matrix
[2] = 1.f
- (matrix
[0] + matrix
[1]);
1013 matrix
[5] = 0.213f
- 0.213f
* amount
;
1014 matrix
[6] = 0.715f
+ 0.285f
* amount
;
1015 matrix
[7] = 1.f
- (matrix
[5] + matrix
[6]);
1018 matrix
[10] = 0.213f
- 0.213f
* amount
;
1019 matrix
[11] = 0.715f
- 0.715f
* amount
;
1020 matrix
[12] = 1.f
- (matrix
[10] + matrix
[11]);
1023 matrix
[15] = matrix
[16] = matrix
[17] = matrix
[19] = 0;
1025 skia::RefPtr
<SkColorFilter
> colorFilter(
1026 skia::AdoptRef(SkColorMatrixFilter::Create(matrix
)));
1027 skia::RefPtr
<SkImageFilter
> filter
=
1028 skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter
.get(), NULL
));
1029 FilterOperations filters
;
1030 filters
.Append(FilterOperation::CreateReferenceFilter(filter
));
1032 RenderPassDrawQuad
* render_pass_quad
=
1033 root_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
1034 render_pass_quad
->SetNew(pass_shared_state
,
1043 FilterOperations());
1045 RenderPassList pass_list
;
1047 pass_list
.push_back(child_pass
.Pass());
1048 pass_list
.push_back(root_pass
.Pass());
1050 // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
1051 // renderer so use a fuzzy comparator.
1052 EXPECT_TRUE(this->RunPixelTest(
1054 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")),
1055 FuzzyForSoftwareOnlyPixelComparator
<TypeParam
>(false)));
1058 TYPED_TEST(RendererPixelTest
, EnlargedRenderPassTexture
) {
1059 gfx::Rect
viewport_rect(this->device_viewport_size_
);
1061 RenderPassId
root_pass_id(1, 1);
1062 scoped_ptr
<RenderPass
> root_pass
=
1063 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
1065 RenderPassId
child_pass_id(2, 2);
1066 gfx::Rect
pass_rect(this->device_viewport_size_
);
1067 gfx::Transform transform_to_root
;
1068 scoped_ptr
<RenderPass
> child_pass
=
1069 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
1071 gfx::Transform content_to_target_transform
;
1072 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1073 content_to_target_transform
, viewport_rect
, child_pass
.get());
1075 gfx::Rect
blue_rect(0,
1077 this->device_viewport_size_
.width(),
1078 this->device_viewport_size_
.height() / 2);
1079 SolidColorDrawQuad
* blue
=
1080 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1081 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
1082 gfx::Rect
yellow_rect(0,
1083 this->device_viewport_size_
.height() / 2,
1084 this->device_viewport_size_
.width(),
1085 this->device_viewport_size_
.height() / 2);
1086 SolidColorDrawQuad
* yellow
=
1087 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1088 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
1090 SharedQuadState
* pass_shared_state
=
1091 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
1092 CreateTestRenderPassDrawQuad(
1093 pass_shared_state
, pass_rect
, child_pass_id
, root_pass
.get());
1095 RenderPassList pass_list
;
1096 pass_list
.push_back(child_pass
.Pass());
1097 pass_list
.push_back(root_pass
.Pass());
1099 this->renderer_
->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
1101 EXPECT_TRUE(this->RunPixelTest(
1103 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
1104 ExactPixelComparator(true)));
1107 TYPED_TEST(RendererPixelTest
, EnlargedRenderPassTextureWithAntiAliasing
) {
1108 gfx::Rect
viewport_rect(this->device_viewport_size_
);
1110 RenderPassId
root_pass_id(1, 1);
1111 scoped_ptr
<RenderPass
> root_pass
=
1112 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
1114 RenderPassId
child_pass_id(2, 2);
1115 gfx::Rect
pass_rect(this->device_viewport_size_
);
1116 gfx::Transform transform_to_root
;
1117 scoped_ptr
<RenderPass
> child_pass
=
1118 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
1120 gfx::Transform content_to_target_transform
;
1121 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1122 content_to_target_transform
, viewport_rect
, child_pass
.get());
1124 gfx::Rect
blue_rect(0,
1126 this->device_viewport_size_
.width(),
1127 this->device_viewport_size_
.height() / 2);
1128 SolidColorDrawQuad
* blue
=
1129 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1130 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
1131 gfx::Rect
yellow_rect(0,
1132 this->device_viewport_size_
.height() / 2,
1133 this->device_viewport_size_
.width(),
1134 this->device_viewport_size_
.height() / 2);
1135 SolidColorDrawQuad
* yellow
=
1136 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1137 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
1139 gfx::Transform aa_transform
;
1140 aa_transform
.Translate(0.5, 0.0);
1142 SharedQuadState
* pass_shared_state
=
1143 CreateTestSharedQuadState(aa_transform
, pass_rect
, root_pass
.get());
1144 CreateTestRenderPassDrawQuad(
1145 pass_shared_state
, pass_rect
, child_pass_id
, root_pass
.get());
1147 SharedQuadState
* root_shared_state
= CreateTestSharedQuadState(
1148 gfx::Transform(), viewport_rect
, root_pass
.get());
1149 SolidColorDrawQuad
* background
=
1150 root_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1151 background
->SetNew(root_shared_state
,
1152 gfx::Rect(this->device_viewport_size_
),
1153 gfx::Rect(this->device_viewport_size_
),
1157 RenderPassList pass_list
;
1158 pass_list
.push_back(child_pass
.Pass());
1159 pass_list
.push_back(root_pass
.Pass());
1161 this->renderer_
->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
1163 EXPECT_TRUE(this->RunPixelTest(
1165 base::FilePath(FILE_PATH_LITERAL("blue_yellow_anti_aliasing.png")),
1166 FuzzyPixelOffByOneComparator(true)));
1169 // This tests the case where we have a RenderPass with a mask, but the quad
1170 // for the masked surface does not include the full surface texture.
1171 TYPED_TEST(RendererPixelTest
, RenderPassAndMaskWithPartialQuad
) {
1172 gfx::Rect
viewport_rect(this->device_viewport_size_
);
1174 RenderPassId
root_pass_id(1, 1);
1175 scoped_ptr
<RenderPass
> root_pass
=
1176 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
1177 SharedQuadState
* root_pass_shared_state
= CreateTestSharedQuadState(
1178 gfx::Transform(), viewport_rect
, root_pass
.get());
1180 RenderPassId
child_pass_id(2, 2);
1181 gfx::Transform transform_to_root
;
1182 scoped_ptr
<RenderPass
> child_pass
=
1183 CreateTestRenderPass(child_pass_id
, viewport_rect
, transform_to_root
);
1184 SharedQuadState
* child_pass_shared_state
= CreateTestSharedQuadState(
1185 gfx::Transform(), viewport_rect
, child_pass
.get());
1187 // The child render pass is just a green box.
1188 static const SkColor kCSSGreen
= 0xff008000;
1189 SolidColorDrawQuad
* green
=
1190 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1192 child_pass_shared_state
, viewport_rect
, viewport_rect
, kCSSGreen
, false);
1195 gfx::Rect mask_rect
= viewport_rect
;
1198 SkImageInfo::MakeN32Premul(mask_rect
.width(), mask_rect
.height()));
1199 SkCanvas
canvas(bitmap
);
1201 paint
.setStyle(SkPaint::kStroke_Style
);
1202 paint
.setStrokeWidth(SkIntToScalar(4));
1203 paint
.setColor(SK_ColorWHITE
);
1204 canvas
.clear(SK_ColorTRANSPARENT
);
1205 gfx::Rect rect
= mask_rect
;
1206 while (!rect
.IsEmpty()) {
1207 rect
.Inset(6, 6, 4, 4);
1209 SkRect::MakeXYWH(rect
.x(), rect
.y(), rect
.width(), rect
.height()),
1211 rect
.Inset(6, 6, 4, 4);
1214 ResourceProvider::ResourceId mask_resource_id
=
1215 this->resource_provider_
->CreateResource(
1218 ResourceProvider::TextureHintImmutable
,
1221 SkAutoLockPixels
lock(bitmap
);
1222 this->resource_provider_
->SetPixels(
1224 reinterpret_cast<uint8_t*>(bitmap
.getPixels()),
1230 // This RenderPassDrawQuad does not include the full |viewport_rect| which is
1231 // the size of the child render pass.
1232 gfx::Rect sub_rect
= gfx::Rect(50, 50, 200, 100);
1233 EXPECT_NE(sub_rect
.x(), child_pass
->output_rect
.x());
1234 EXPECT_NE(sub_rect
.y(), child_pass
->output_rect
.y());
1235 EXPECT_NE(sub_rect
.right(), child_pass
->output_rect
.right());
1236 EXPECT_NE(sub_rect
.bottom(), child_pass
->output_rect
.bottom());
1238 // Set up a mask on the RenderPassDrawQuad.
1239 RenderPassDrawQuad
* mask_quad
=
1240 root_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
1241 mask_quad
->SetNew(root_pass_shared_state
,
1246 gfx::Vector2dF(2.f
, 1.f
), // mask_uv_scale
1247 gfx::Size(mask_rect
.size()), // mask_texture_size
1248 FilterOperations(), // foreground filters
1249 gfx::Vector2dF(), // filters scale
1250 FilterOperations()); // background filters
1252 // White background behind the masked render pass.
1253 SolidColorDrawQuad
* white
=
1254 root_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1255 white
->SetNew(root_pass_shared_state
,
1261 RenderPassList pass_list
;
1262 pass_list
.push_back(child_pass
.Pass());
1263 pass_list
.push_back(root_pass
.Pass());
1265 EXPECT_TRUE(this->RunPixelTest(
1267 base::FilePath(FILE_PATH_LITERAL("mask_bottom_right.png")),
1268 ExactPixelComparator(true)));
1271 template <typename RendererType
>
1272 class RendererPixelTestWithBackgroundFilter
1273 : public RendererPixelTest
<RendererType
> {
1275 void SetUpRenderPassList() {
1276 gfx::Rect
device_viewport_rect(this->device_viewport_size_
);
1278 RenderPassId
root_id(1, 1);
1279 scoped_ptr
<RenderPass
> root_pass
=
1280 CreateTestRootRenderPass(root_id
, device_viewport_rect
);
1281 root_pass
->has_transparent_background
= false;
1283 gfx::Transform identity_content_to_target_transform
;
1285 RenderPassId
filter_pass_id(2, 1);
1286 gfx::Transform transform_to_root
;
1287 scoped_ptr
<RenderPass
> filter_pass
=
1288 CreateTestRenderPass(filter_pass_id
,
1289 filter_pass_content_rect_
,
1292 // A non-visible quad in the filtering render pass.
1294 SharedQuadState
* shared_state
=
1295 CreateTestSharedQuadState(identity_content_to_target_transform
,
1296 filter_pass_content_rect_
,
1298 SolidColorDrawQuad
* color_quad
=
1299 filter_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1300 color_quad
->SetNew(shared_state
,
1301 filter_pass_content_rect_
,
1302 filter_pass_content_rect_
,
1303 SK_ColorTRANSPARENT
,
1308 SharedQuadState
* shared_state
=
1309 CreateTestSharedQuadState(filter_pass_to_target_transform_
,
1310 filter_pass_content_rect_
,
1312 RenderPassDrawQuad
* filter_pass_quad
=
1313 root_pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
1314 filter_pass_quad
->SetNew(shared_state
,
1315 filter_pass_content_rect_
,
1316 filter_pass_content_rect_
,
1318 0, // mask_resource_id
1319 gfx::Vector2dF(), // mask_uv_scale
1320 gfx::Size(), // mask_texture_size
1321 FilterOperations(), // filters
1322 gfx::Vector2dF(), // filters_scale
1323 this->background_filters_
);
1326 const int kColumnWidth
= device_viewport_rect
.width() / 3;
1328 gfx::Rect left_rect
= gfx::Rect(0, 0, kColumnWidth
, 20);
1329 for (int i
= 0; left_rect
.y() < device_viewport_rect
.height(); ++i
) {
1330 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1331 identity_content_to_target_transform
, left_rect
, root_pass
.get());
1332 SolidColorDrawQuad
* color_quad
=
1333 root_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1335 shared_state
, left_rect
, left_rect
, SK_ColorGREEN
, false);
1336 left_rect
+= gfx::Vector2d(0, left_rect
.height() + 1);
1339 gfx::Rect middle_rect
= gfx::Rect(kColumnWidth
+1, 0, kColumnWidth
, 20);
1340 for (int i
= 0; middle_rect
.y() < device_viewport_rect
.height(); ++i
) {
1341 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1342 identity_content_to_target_transform
, middle_rect
, root_pass
.get());
1343 SolidColorDrawQuad
* color_quad
=
1344 root_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1346 shared_state
, middle_rect
, middle_rect
, SK_ColorRED
, false);
1347 middle_rect
+= gfx::Vector2d(0, middle_rect
.height() + 1);
1350 gfx::Rect right_rect
= gfx::Rect((kColumnWidth
+1)*2, 0, kColumnWidth
, 20);
1351 for (int i
= 0; right_rect
.y() < device_viewport_rect
.height(); ++i
) {
1352 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1353 identity_content_to_target_transform
, right_rect
, root_pass
.get());
1354 SolidColorDrawQuad
* color_quad
=
1355 root_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1357 shared_state
, right_rect
, right_rect
, SK_ColorBLUE
, false);
1358 right_rect
+= gfx::Vector2d(0, right_rect
.height() + 1);
1361 SharedQuadState
* shared_state
=
1362 CreateTestSharedQuadState(identity_content_to_target_transform
,
1363 device_viewport_rect
,
1365 SolidColorDrawQuad
* background_quad
=
1366 root_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1367 background_quad
->SetNew(shared_state
,
1368 device_viewport_rect
,
1369 device_viewport_rect
,
1373 pass_list_
.push_back(filter_pass
.Pass());
1374 pass_list_
.push_back(root_pass
.Pass());
1377 RenderPassList pass_list_
;
1378 FilterOperations background_filters_
;
1379 gfx::Transform filter_pass_to_target_transform_
;
1380 gfx::Rect filter_pass_content_rect_
;
1383 typedef ::testing::Types
<GLRenderer
, SoftwareRenderer
>
1384 BackgroundFilterRendererTypes
;
1385 TYPED_TEST_CASE(RendererPixelTestWithBackgroundFilter
,
1386 BackgroundFilterRendererTypes
);
1388 typedef RendererPixelTestWithBackgroundFilter
<GLRenderer
>
1389 GLRendererPixelTestWithBackgroundFilter
;
1391 // TODO(skaslev): The software renderer does not support filters yet.
1392 TEST_F(GLRendererPixelTestWithBackgroundFilter
, InvertFilter
) {
1393 this->background_filters_
.Append(
1394 FilterOperation::CreateInvertFilter(1.f
));
1396 this->filter_pass_content_rect_
= gfx::Rect(this->device_viewport_size_
);
1397 this->filter_pass_content_rect_
.Inset(12, 14, 16, 18);
1399 this->SetUpRenderPassList();
1400 EXPECT_TRUE(this->RunPixelTest(
1402 base::FilePath(FILE_PATH_LITERAL("background_filter.png")),
1403 ExactPixelComparator(true)));
1406 class ExternalStencilPixelTest
: public GLRendererPixelTest
{
1408 void ClearBackgroundToGreen() {
1409 GLES2Interface
* gl
= output_surface_
->context_provider()->ContextGL();
1410 output_surface_
->EnsureBackbuffer();
1411 output_surface_
->Reshape(device_viewport_size_
, 1);
1412 gl
->ClearColor(0.f
, 1.f
, 0.f
, 1.f
);
1413 gl
->Clear(GL_COLOR_BUFFER_BIT
);
1416 void PopulateStencilBuffer() {
1417 // Set two quadrants of the stencil buffer to 1.
1418 GLES2Interface
* gl
= output_surface_
->context_provider()->ContextGL();
1419 output_surface_
->EnsureBackbuffer();
1420 output_surface_
->Reshape(device_viewport_size_
, 1);
1421 gl
->ClearStencil(0);
1422 gl
->Clear(GL_STENCIL_BUFFER_BIT
);
1423 gl
->Enable(GL_SCISSOR_TEST
);
1424 gl
->ClearStencil(1);
1427 device_viewport_size_
.width() / 2,
1428 device_viewport_size_
.height() / 2);
1429 gl
->Clear(GL_STENCIL_BUFFER_BIT
);
1430 gl
->Scissor(device_viewport_size_
.width() / 2,
1431 device_viewport_size_
.height() / 2,
1432 device_viewport_size_
.width(),
1433 device_viewport_size_
.height());
1434 gl
->Clear(GL_STENCIL_BUFFER_BIT
);
1438 TEST_F(ExternalStencilPixelTest
, StencilTestEnabled
) {
1439 ClearBackgroundToGreen();
1440 PopulateStencilBuffer();
1441 this->EnableExternalStencilTest();
1443 // Draw a blue quad that covers the entire device viewport. It should be
1444 // clipped to the bottom left and top right corners by the external stencil.
1445 gfx::Rect
rect(this->device_viewport_size_
);
1446 RenderPassId
id(1, 1);
1447 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
1448 SharedQuadState
* blue_shared_state
=
1449 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
1450 SolidColorDrawQuad
* blue
=
1451 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1452 blue
->SetNew(blue_shared_state
, rect
, rect
, SK_ColorBLUE
, false);
1453 pass
->has_transparent_background
= false;
1454 RenderPassList pass_list
;
1455 pass_list
.push_back(pass
.Pass());
1457 EXPECT_TRUE(this->RunPixelTest(
1459 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1460 ExactPixelComparator(true)));
1463 TEST_F(ExternalStencilPixelTest
, StencilTestDisabled
) {
1464 PopulateStencilBuffer();
1466 // Draw a green quad that covers the entire device viewport. The stencil
1467 // buffer should be ignored.
1468 gfx::Rect
rect(this->device_viewport_size_
);
1469 RenderPassId
id(1, 1);
1470 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
1471 SharedQuadState
* green_shared_state
=
1472 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
1473 SolidColorDrawQuad
* green
=
1474 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1475 green
->SetNew(green_shared_state
, rect
, rect
, SK_ColorGREEN
, false);
1476 RenderPassList pass_list
;
1477 pass_list
.push_back(pass
.Pass());
1479 EXPECT_TRUE(this->RunPixelTest(
1481 base::FilePath(FILE_PATH_LITERAL("green.png")),
1482 ExactPixelComparator(true)));
1485 TEST_F(ExternalStencilPixelTest
, RenderSurfacesIgnoreStencil
) {
1486 // The stencil test should apply only to the final render pass.
1487 ClearBackgroundToGreen();
1488 PopulateStencilBuffer();
1489 this->EnableExternalStencilTest();
1491 gfx::Rect
viewport_rect(this->device_viewport_size_
);
1493 RenderPassId
root_pass_id(1, 1);
1494 scoped_ptr
<RenderPass
> root_pass
=
1495 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
1496 root_pass
->has_transparent_background
= false;
1498 RenderPassId
child_pass_id(2, 2);
1499 gfx::Rect
pass_rect(this->device_viewport_size_
);
1500 gfx::Transform transform_to_root
;
1501 scoped_ptr
<RenderPass
> child_pass
=
1502 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
1504 gfx::Transform content_to_target_transform
;
1505 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1506 content_to_target_transform
, viewport_rect
, child_pass
.get());
1508 gfx::Rect
blue_rect(0,
1510 this->device_viewport_size_
.width(),
1511 this->device_viewport_size_
.height());
1512 SolidColorDrawQuad
* blue
=
1513 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1514 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
1516 SharedQuadState
* pass_shared_state
=
1517 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
1518 CreateTestRenderPassDrawQuad(
1519 pass_shared_state
, pass_rect
, child_pass_id
, root_pass
.get());
1520 RenderPassList pass_list
;
1521 pass_list
.push_back(child_pass
.Pass());
1522 pass_list
.push_back(root_pass
.Pass());
1524 EXPECT_TRUE(this->RunPixelTest(
1526 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1527 ExactPixelComparator(true)));
1530 TEST_F(ExternalStencilPixelTest
, DeviceClip
) {
1531 ClearBackgroundToGreen();
1532 gfx::Rect
clip_rect(gfx::Point(150, 150), gfx::Size(50, 50));
1533 this->ForceDeviceClip(clip_rect
);
1535 // Draw a blue quad that covers the entire device viewport. It should be
1536 // clipped to the bottom right corner by the device clip.
1537 gfx::Rect
rect(this->device_viewport_size_
);
1538 RenderPassId
id(1, 1);
1539 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
1540 SharedQuadState
* blue_shared_state
=
1541 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
1542 SolidColorDrawQuad
* blue
=
1543 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1544 blue
->SetNew(blue_shared_state
, rect
, rect
, SK_ColorBLUE
, false);
1545 RenderPassList pass_list
;
1546 pass_list
.push_back(pass
.Pass());
1548 EXPECT_TRUE(this->RunPixelTest(
1550 base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
1551 ExactPixelComparator(true)));
1554 // Software renderer does not support anti-aliased edges.
1555 TEST_F(GLRendererPixelTest
, AntiAliasing
) {
1556 gfx::Rect
rect(this->device_viewport_size_
);
1558 RenderPassId
id(1, 1);
1559 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
1561 gfx::Transform red_content_to_target_transform
;
1562 red_content_to_target_transform
.Rotate(10);
1563 SharedQuadState
* red_shared_state
= CreateTestSharedQuadState(
1564 red_content_to_target_transform
, rect
, pass
.get());
1566 SolidColorDrawQuad
* red
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1567 red
->SetNew(red_shared_state
, rect
, rect
, SK_ColorRED
, false);
1569 gfx::Transform yellow_content_to_target_transform
;
1570 yellow_content_to_target_transform
.Rotate(5);
1571 SharedQuadState
* yellow_shared_state
= CreateTestSharedQuadState(
1572 yellow_content_to_target_transform
, rect
, pass
.get());
1574 SolidColorDrawQuad
* yellow
=
1575 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1576 yellow
->SetNew(yellow_shared_state
, rect
, rect
, SK_ColorYELLOW
, false);
1578 gfx::Transform blue_content_to_target_transform
;
1579 SharedQuadState
* blue_shared_state
= CreateTestSharedQuadState(
1580 blue_content_to_target_transform
, rect
, pass
.get());
1582 SolidColorDrawQuad
* blue
=
1583 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1584 blue
->SetNew(blue_shared_state
, rect
, rect
, SK_ColorBLUE
, false);
1586 RenderPassList pass_list
;
1587 pass_list
.push_back(pass
.Pass());
1589 EXPECT_TRUE(this->RunPixelTest(
1591 base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")),
1592 FuzzyPixelOffByOneComparator(true)));
1595 // This test tests that anti-aliasing works for axis aligned quads.
1596 // Anti-aliasing is only supported in the gl renderer.
1597 TEST_F(GLRendererPixelTest
, AxisAligned
) {
1598 gfx::Rect
rect(this->device_viewport_size_
);
1600 RenderPassId
id(1, 1);
1601 gfx::Transform transform_to_root
;
1602 scoped_ptr
<RenderPass
> pass
=
1603 CreateTestRenderPass(id
, rect
, transform_to_root
);
1605 gfx::Transform red_content_to_target_transform
;
1606 red_content_to_target_transform
.Translate(50, 50);
1607 red_content_to_target_transform
.Scale(
1608 0.5f
+ 1.0f
/ (rect
.width() * 2.0f
),
1609 0.5f
+ 1.0f
/ (rect
.height() * 2.0f
));
1610 SharedQuadState
* red_shared_state
= CreateTestSharedQuadState(
1611 red_content_to_target_transform
, rect
, pass
.get());
1613 SolidColorDrawQuad
* red
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1614 red
->SetNew(red_shared_state
, rect
, rect
, SK_ColorRED
, false);
1616 gfx::Transform yellow_content_to_target_transform
;
1617 yellow_content_to_target_transform
.Translate(25.5f
, 25.5f
);
1618 yellow_content_to_target_transform
.Scale(0.5f
, 0.5f
);
1619 SharedQuadState
* yellow_shared_state
= CreateTestSharedQuadState(
1620 yellow_content_to_target_transform
, rect
, pass
.get());
1622 SolidColorDrawQuad
* yellow
=
1623 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1624 yellow
->SetNew(yellow_shared_state
, rect
, rect
, SK_ColorYELLOW
, false);
1626 gfx::Transform blue_content_to_target_transform
;
1627 SharedQuadState
* blue_shared_state
= CreateTestSharedQuadState(
1628 blue_content_to_target_transform
, rect
, pass
.get());
1630 SolidColorDrawQuad
* blue
=
1631 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1632 blue
->SetNew(blue_shared_state
, rect
, rect
, SK_ColorBLUE
, false);
1634 RenderPassList pass_list
;
1635 pass_list
.push_back(pass
.Pass());
1637 EXPECT_TRUE(this->RunPixelTest(
1639 base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")),
1640 ExactPixelComparator(true)));
1643 // This test tests that forcing anti-aliasing off works as expected.
1644 // Anti-aliasing is only supported in the gl renderer.
1645 TEST_F(GLRendererPixelTest
, ForceAntiAliasingOff
) {
1646 gfx::Rect
rect(this->device_viewport_size_
);
1648 RenderPassId
id(1, 1);
1649 gfx::Transform transform_to_root
;
1650 scoped_ptr
<RenderPass
> pass
=
1651 CreateTestRenderPass(id
, rect
, transform_to_root
);
1653 gfx::Transform hole_content_to_target_transform
;
1654 hole_content_to_target_transform
.Translate(50, 50);
1655 hole_content_to_target_transform
.Scale(
1656 0.5f
+ 1.0f
/ (rect
.width() * 2.0f
),
1657 0.5f
+ 1.0f
/ (rect
.height() * 2.0f
));
1658 SharedQuadState
* hole_shared_state
= CreateTestSharedQuadState(
1659 hole_content_to_target_transform
, rect
, pass
.get());
1661 SolidColorDrawQuad
* hole
=
1662 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1664 hole_shared_state
, rect
, rect
, rect
, false, SK_ColorTRANSPARENT
, true);
1666 gfx::Transform green_content_to_target_transform
;
1667 SharedQuadState
* green_shared_state
= CreateTestSharedQuadState(
1668 green_content_to_target_transform
, rect
, pass
.get());
1670 SolidColorDrawQuad
* green
=
1671 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1672 green
->SetNew(green_shared_state
, rect
, rect
, SK_ColorGREEN
, false);
1674 RenderPassList pass_list
;
1675 pass_list
.push_back(pass
.Pass());
1677 EXPECT_TRUE(this->RunPixelTest(
1679 base::FilePath(FILE_PATH_LITERAL("force_anti_aliasing_off.png")),
1680 ExactPixelComparator(false)));
1683 TEST_F(GLRendererPixelTest
, AntiAliasingPerspective
) {
1684 gfx::Rect
rect(this->device_viewport_size_
);
1686 scoped_ptr
<RenderPass
> pass
=
1687 CreateTestRootRenderPass(RenderPassId(1, 1), rect
);
1689 gfx::Rect
red_rect(0, 0, 180, 500);
1690 gfx::Transform
red_content_to_target_transform(
1691 1.0f
, 2.4520f
, 10.6206f
, 19.0f
,
1692 0.0f
, 0.3528f
, 5.9737f
, 9.5f
,
1693 0.0f
, -0.2250f
, -0.9744f
, 0.0f
,
1694 0.0f
, 0.0225f
, 0.0974f
, 1.0f
);
1695 SharedQuadState
* red_shared_state
= CreateTestSharedQuadState(
1696 red_content_to_target_transform
, red_rect
, pass
.get());
1697 SolidColorDrawQuad
* red
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1698 red
->SetNew(red_shared_state
, red_rect
, red_rect
, SK_ColorRED
, false);
1700 gfx::Rect
green_rect(19, 7, 180, 10);
1701 SharedQuadState
* green_shared_state
=
1702 CreateTestSharedQuadState(gfx::Transform(), green_rect
, pass
.get());
1703 SolidColorDrawQuad
* green
=
1704 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1706 green_shared_state
, green_rect
, green_rect
, SK_ColorGREEN
, false);
1708 SharedQuadState
* blue_shared_state
=
1709 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
1710 SolidColorDrawQuad
* blue
=
1711 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1712 blue
->SetNew(blue_shared_state
, rect
, rect
, SK_ColorBLUE
, false);
1714 RenderPassList pass_list
;
1715 pass_list
.push_back(pass
.Pass());
1717 EXPECT_TRUE(this->RunPixelTest(
1719 base::FilePath(FILE_PATH_LITERAL("anti_aliasing_perspective.png")),
1720 FuzzyPixelOffByOneComparator(true)));
1723 TYPED_TEST(RendererPixelTest
, PictureDrawQuadIdentityScale
) {
1724 gfx::Size
pile_tile_size(1000, 1000);
1725 gfx::Rect
viewport(this->device_viewport_size_
);
1726 // TODO(enne): the renderer should figure this out on its own.
1727 ResourceFormat texture_format
= RGBA_8888
;
1729 RenderPassId
id(1, 1);
1730 gfx::Transform transform_to_root
;
1731 scoped_ptr
<RenderPass
> pass
=
1732 CreateTestRenderPass(id
, viewport
, transform_to_root
);
1734 // One clipped blue quad in the lower right corner. Outside the clip
1735 // is red, which should not appear.
1736 gfx::Rect
blue_rect(gfx::Size(100, 100));
1737 gfx::Rect
blue_clip_rect(gfx::Point(50, 50), gfx::Size(50, 50));
1738 scoped_refptr
<FakePicturePileImpl
> blue_pile
=
1739 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, blue_rect
.size());
1741 red_paint
.setColor(SK_ColorRED
);
1742 blue_pile
->add_draw_rect_with_paint(blue_rect
, red_paint
);
1744 blue_paint
.setColor(SK_ColorBLUE
);
1745 blue_pile
->add_draw_rect_with_paint(blue_clip_rect
, blue_paint
);
1746 blue_pile
->RerecordPile();
1748 gfx::Transform blue_content_to_target_transform
;
1749 gfx::Vector2d
offset(viewport
.bottom_right() - blue_rect
.bottom_right());
1750 blue_content_to_target_transform
.Translate(offset
.x(), offset
.y());
1751 gfx::RectF blue_scissor_rect
= blue_clip_rect
;
1752 blue_content_to_target_transform
.TransformRect(&blue_scissor_rect
);
1753 SharedQuadState
* blue_shared_state
=
1754 CreateTestSharedQuadStateClipped(blue_content_to_target_transform
,
1756 gfx::ToEnclosingRect(blue_scissor_rect
),
1759 PictureDrawQuad
* blue_quad
= pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1761 blue_quad
->SetNew(blue_shared_state
,
1762 viewport
, // Intentionally bigger than clip.
1763 gfx::Rect(), viewport
, gfx::RectF(viewport
),
1764 viewport
.size(), texture_format
, viewport
, 1.f
,
1767 // One viewport-filling green quad.
1768 scoped_refptr
<FakePicturePileImpl
> green_pile
=
1769 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, viewport
.size());
1770 SkPaint green_paint
;
1771 green_paint
.setColor(SK_ColorGREEN
);
1772 green_pile
->add_draw_rect_with_paint(viewport
, green_paint
);
1773 green_pile
->RerecordPile();
1775 gfx::Transform green_content_to_target_transform
;
1776 SharedQuadState
* green_shared_state
= CreateTestSharedQuadState(
1777 green_content_to_target_transform
, viewport
, pass
.get());
1779 PictureDrawQuad
* green_quad
=
1780 pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1781 green_quad
->SetNew(green_shared_state
, viewport
, gfx::Rect(), viewport
,
1782 gfx::RectF(0.f
, 0.f
, 1.f
, 1.f
), viewport
.size(),
1783 texture_format
, viewport
, 1.f
, green_pile
.get());
1785 RenderPassList pass_list
;
1786 pass_list
.push_back(pass
.Pass());
1788 EXPECT_TRUE(this->RunPixelTest(
1790 base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
1791 ExactPixelComparator(true)));
1794 // Not WithSkiaGPUBackend since that path currently requires tiles for opacity.
1795 TYPED_TEST(RendererPixelTest
, PictureDrawQuadOpacity
) {
1796 gfx::Size
pile_tile_size(1000, 1000);
1797 gfx::Rect
viewport(this->device_viewport_size_
);
1798 ResourceFormat texture_format
= RGBA_8888
;
1800 RenderPassId
id(1, 1);
1801 gfx::Transform transform_to_root
;
1802 scoped_ptr
<RenderPass
> pass
=
1803 CreateTestRenderPass(id
, viewport
, transform_to_root
);
1805 // One viewport-filling 0.5-opacity green quad.
1806 scoped_refptr
<FakePicturePileImpl
> green_pile
=
1807 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, viewport
.size());
1808 SkPaint green_paint
;
1809 green_paint
.setColor(SK_ColorGREEN
);
1810 green_pile
->add_draw_rect_with_paint(viewport
, green_paint
);
1811 green_pile
->RerecordPile();
1813 gfx::Transform green_content_to_target_transform
;
1814 SharedQuadState
* green_shared_state
= CreateTestSharedQuadState(
1815 green_content_to_target_transform
, viewport
, pass
.get());
1816 green_shared_state
->opacity
= 0.5f
;
1818 PictureDrawQuad
* green_quad
=
1819 pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1820 green_quad
->SetNew(green_shared_state
, viewport
, gfx::Rect(), viewport
,
1821 gfx::RectF(0, 0, 1, 1), viewport
.size(), texture_format
,
1822 viewport
, 1.f
, green_pile
.get());
1824 // One viewport-filling white quad.
1825 scoped_refptr
<FakePicturePileImpl
> white_pile
=
1826 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, viewport
.size());
1827 SkPaint white_paint
;
1828 white_paint
.setColor(SK_ColorWHITE
);
1829 white_pile
->add_draw_rect_with_paint(viewport
, white_paint
);
1830 white_pile
->RerecordPile();
1832 gfx::Transform white_content_to_target_transform
;
1833 SharedQuadState
* white_shared_state
= CreateTestSharedQuadState(
1834 white_content_to_target_transform
, viewport
, pass
.get());
1836 PictureDrawQuad
* white_quad
=
1837 pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1838 white_quad
->SetNew(white_shared_state
, viewport
, gfx::Rect(), viewport
,
1839 gfx::RectF(0, 0, 1, 1), viewport
.size(), texture_format
,
1840 viewport
, 1.f
, white_pile
.get());
1842 RenderPassList pass_list
;
1843 pass_list
.push_back(pass
.Pass());
1845 EXPECT_TRUE(this->RunPixelTest(
1847 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
1848 FuzzyPixelOffByOneComparator(true)));
1851 template<typename TypeParam
> bool IsSoftwareRenderer() {
1856 bool IsSoftwareRenderer
<SoftwareRenderer
>() {
1861 bool IsSoftwareRenderer
<SoftwareRendererWithExpandedViewport
>() {
1865 // If we disable image filtering, then a 2x2 bitmap should appear as four
1866 // huge sharp squares.
1867 TYPED_TEST(RendererPixelTest
, PictureDrawQuadDisableImageFiltering
) {
1868 // We only care about this in software mode since bilinear filtering is
1869 // cheap in hardware.
1870 if (!IsSoftwareRenderer
<TypeParam
>())
1873 gfx::Size
pile_tile_size(1000, 1000);
1874 gfx::Rect
viewport(this->device_viewport_size_
);
1875 ResourceFormat texture_format
= RGBA_8888
;
1877 RenderPassId
id(1, 1);
1878 gfx::Transform transform_to_root
;
1879 scoped_ptr
<RenderPass
> pass
=
1880 CreateTestRenderPass(id
, viewport
, transform_to_root
);
1883 bitmap
.allocN32Pixels(2, 2);
1885 SkAutoLockPixels
lock(bitmap
);
1886 SkCanvas
canvas(bitmap
);
1887 canvas
.drawPoint(0, 0, SK_ColorGREEN
);
1888 canvas
.drawPoint(0, 1, SK_ColorBLUE
);
1889 canvas
.drawPoint(1, 0, SK_ColorBLUE
);
1890 canvas
.drawPoint(1, 1, SK_ColorGREEN
);
1893 scoped_refptr
<FakePicturePileImpl
> pile
=
1894 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, viewport
.size());
1896 paint
.setFilterLevel(SkPaint::kLow_FilterLevel
);
1897 pile
->add_draw_bitmap_with_paint(bitmap
, gfx::Point(), paint
);
1898 pile
->RerecordPile();
1900 gfx::Transform content_to_target_transform
;
1901 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
1902 content_to_target_transform
, viewport
, pass
.get());
1904 PictureDrawQuad
* quad
= pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1905 quad
->SetNew(shared_state
, viewport
, gfx::Rect(), viewport
,
1906 gfx::RectF(0, 0, 2, 2), viewport
.size(), texture_format
,
1907 viewport
, 1.f
, pile
.get());
1909 RenderPassList pass_list
;
1910 pass_list
.push_back(pass
.Pass());
1912 this->disable_picture_quad_image_filtering_
= true;
1914 EXPECT_TRUE(this->RunPixelTest(
1916 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1917 ExactPixelComparator(true)));
1920 TYPED_TEST(RendererPixelTest
, PictureDrawQuadNonIdentityScale
) {
1921 gfx::Size
pile_tile_size(1000, 1000);
1922 gfx::Rect
viewport(this->device_viewport_size_
);
1923 // TODO(enne): the renderer should figure this out on its own.
1924 ResourceFormat texture_format
= RGBA_8888
;
1926 RenderPassId
id(1, 1);
1927 gfx::Transform transform_to_root
;
1928 scoped_ptr
<RenderPass
> pass
=
1929 CreateTestRenderPass(id
, viewport
, transform_to_root
);
1931 // As scaling up the blue checkerboards will cause sampling on the GPU,
1932 // a few extra "cleanup rects" need to be added to clobber the blending
1933 // to make the output image more clean. This will also test subrects
1935 gfx::Transform green_content_to_target_transform
;
1936 gfx::Rect
green_rect1(gfx::Point(80, 0), gfx::Size(20, 100));
1937 gfx::Rect
green_rect2(gfx::Point(0, 80), gfx::Size(100, 20));
1938 scoped_refptr
<FakePicturePileImpl
> green_pile
=
1939 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, viewport
.size());
1941 red_paint
.setColor(SK_ColorRED
);
1942 green_pile
->add_draw_rect_with_paint(viewport
, red_paint
);
1943 SkPaint green_paint
;
1944 green_paint
.setColor(SK_ColorGREEN
);
1945 green_pile
->add_draw_rect_with_paint(green_rect1
, green_paint
);
1946 green_pile
->add_draw_rect_with_paint(green_rect2
, green_paint
);
1947 green_pile
->RerecordPile();
1949 SharedQuadState
* top_right_green_shared_quad_state
=
1950 CreateTestSharedQuadState(
1951 green_content_to_target_transform
, viewport
, pass
.get());
1953 PictureDrawQuad
* green_quad1
=
1954 pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1955 green_quad1
->SetNew(top_right_green_shared_quad_state
, green_rect1
,
1956 gfx::Rect(), green_rect1
, gfx::RectF(green_rect1
.size()),
1957 green_rect1
.size(), texture_format
, green_rect1
, 1.f
,
1960 PictureDrawQuad
* green_quad2
=
1961 pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
1962 green_quad2
->SetNew(top_right_green_shared_quad_state
, green_rect2
,
1963 gfx::Rect(), green_rect2
, gfx::RectF(green_rect2
.size()),
1964 green_rect2
.size(), texture_format
, green_rect2
, 1.f
,
1967 // Add a green clipped checkerboard in the bottom right to help test
1968 // interleaving picture quad content and solid color content.
1969 gfx::Rect
bottom_right_rect(
1970 gfx::Point(viewport
.width() / 2, viewport
.height() / 2),
1971 gfx::Size(viewport
.width() / 2, viewport
.height() / 2));
1972 SharedQuadState
* bottom_right_green_shared_state
=
1973 CreateTestSharedQuadStateClipped(green_content_to_target_transform
,
1977 SolidColorDrawQuad
* bottom_right_color_quad
=
1978 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1979 bottom_right_color_quad
->SetNew(bottom_right_green_shared_state
,
1985 // Add two blue checkerboards taking up the bottom left and top right,
1986 // but use content scales as content rects to make this happen.
1987 // The content is at a 4x content scale.
1988 gfx::Rect
layer_rect(gfx::Size(20, 30));
1989 float contents_scale
= 4.f
;
1990 // Two rects that touch at their corners, arbitrarily placed in the layer.
1991 gfx::RectF
blue_layer_rect1(gfx::PointF(5.5f
, 9.0f
), gfx::SizeF(2.5f
, 2.5f
));
1992 gfx::RectF
blue_layer_rect2(gfx::PointF(8.0f
, 6.5f
), gfx::SizeF(2.5f
, 2.5f
));
1993 gfx::RectF union_layer_rect
= blue_layer_rect1
;
1994 union_layer_rect
.Union(blue_layer_rect2
);
1996 // Because scaling up will cause sampling outside the rects, add one extra
1997 // pixel of buffer at the final content scale.
1998 float inset
= -1.f
/ contents_scale
;
1999 blue_layer_rect1
.Inset(inset
, inset
, inset
, inset
);
2000 blue_layer_rect2
.Inset(inset
, inset
, inset
, inset
);
2002 scoped_refptr
<FakePicturePileImpl
> pile
=
2003 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, layer_rect
.size());
2005 Region
outside(layer_rect
);
2006 outside
.Subtract(gfx::ToEnclosingRect(union_layer_rect
));
2007 for (Region::Iterator
iter(outside
); iter
.has_rect(); iter
.next()) {
2008 pile
->add_draw_rect_with_paint(iter
.rect(), red_paint
);
2012 blue_paint
.setColor(SK_ColorBLUE
);
2013 pile
->add_draw_rect_with_paint(blue_layer_rect1
, blue_paint
);
2014 pile
->add_draw_rect_with_paint(blue_layer_rect2
, blue_paint
);
2015 pile
->RerecordPile();
2017 gfx::Rect
content_rect(
2018 gfx::ScaleToEnclosingRect(layer_rect
, contents_scale
));
2019 gfx::Rect
content_union_rect(
2020 gfx::ToEnclosingRect(gfx::ScaleRect(union_layer_rect
, contents_scale
)));
2022 // At a scale of 4x the rectangles with a width of 2.5 will take up 10 pixels,
2023 // so scale an additional 10x to make them 100x100.
2024 gfx::Transform content_to_target_transform
;
2025 content_to_target_transform
.Scale(10.0, 10.0);
2026 gfx::Rect
quad_content_rect(gfx::Size(20, 20));
2027 SharedQuadState
* blue_shared_state
= CreateTestSharedQuadState(
2028 content_to_target_transform
, quad_content_rect
, pass
.get());
2030 PictureDrawQuad
* blue_quad
= pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
2031 blue_quad
->SetNew(blue_shared_state
, quad_content_rect
, gfx::Rect(),
2032 quad_content_rect
, gfx::RectF(quad_content_rect
),
2033 content_union_rect
.size(), texture_format
,
2034 content_union_rect
, contents_scale
, pile
.get());
2036 // Fill left half of viewport with green.
2037 gfx::Transform half_green_content_to_target_transform
;
2038 gfx::Rect
half_green_rect(gfx::Size(viewport
.width() / 2, viewport
.height()));
2039 SharedQuadState
* half_green_shared_state
= CreateTestSharedQuadState(
2040 half_green_content_to_target_transform
, half_green_rect
, pass
.get());
2041 SolidColorDrawQuad
* half_color_quad
=
2042 pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2043 half_color_quad
->SetNew(half_green_shared_state
,
2049 RenderPassList pass_list
;
2050 pass_list
.push_back(pass
.Pass());
2052 EXPECT_TRUE(this->RunPixelTest(
2054 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
2055 ExactPixelComparator(true)));
2058 typedef RendererPixelTest
<GLRendererWithFlippedSurface
>
2059 GLRendererPixelTestWithFlippedOutputSurface
;
2061 TEST_F(GLRendererPixelTestWithFlippedOutputSurface
, ExplicitFlipTest
) {
2062 // This draws a blue rect above a yellow rect with an inverted output surface.
2063 gfx::Rect
viewport_rect(this->device_viewport_size_
);
2065 RenderPassId
root_pass_id(1, 1);
2066 scoped_ptr
<RenderPass
> root_pass
=
2067 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
2069 RenderPassId
child_pass_id(2, 2);
2070 gfx::Rect
pass_rect(this->device_viewport_size_
);
2071 gfx::Transform transform_to_root
;
2072 scoped_ptr
<RenderPass
> child_pass
=
2073 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
2075 gfx::Transform content_to_target_transform
;
2076 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
2077 content_to_target_transform
, viewport_rect
, child_pass
.get());
2079 gfx::Rect
blue_rect(0,
2081 this->device_viewport_size_
.width(),
2082 this->device_viewport_size_
.height() / 2);
2083 SolidColorDrawQuad
* blue
=
2084 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2085 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
2086 gfx::Rect
yellow_rect(0,
2087 this->device_viewport_size_
.height() / 2,
2088 this->device_viewport_size_
.width(),
2089 this->device_viewport_size_
.height() / 2);
2090 SolidColorDrawQuad
* yellow
=
2091 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2092 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
2094 SharedQuadState
* pass_shared_state
=
2095 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
2096 CreateTestRenderPassDrawQuad(
2097 pass_shared_state
, pass_rect
, child_pass_id
, root_pass
.get());
2099 RenderPassList pass_list
;
2100 pass_list
.push_back(child_pass
.Pass());
2101 pass_list
.push_back(root_pass
.Pass());
2103 EXPECT_TRUE(this->RunPixelTest(
2105 base::FilePath(FILE_PATH_LITERAL("blue_yellow_flipped.png")),
2106 ExactPixelComparator(true)));
2109 TEST_F(GLRendererPixelTestWithFlippedOutputSurface
, CheckChildPassUnflipped
) {
2110 // This draws a blue rect above a yellow rect with an inverted output surface.
2111 gfx::Rect
viewport_rect(this->device_viewport_size_
);
2113 RenderPassId
root_pass_id(1, 1);
2114 scoped_ptr
<RenderPass
> root_pass
=
2115 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
2117 RenderPassId
child_pass_id(2, 2);
2118 gfx::Rect
pass_rect(this->device_viewport_size_
);
2119 gfx::Transform transform_to_root
;
2120 scoped_ptr
<RenderPass
> child_pass
=
2121 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
2123 gfx::Transform content_to_target_transform
;
2124 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
2125 content_to_target_transform
, viewport_rect
, child_pass
.get());
2127 gfx::Rect
blue_rect(0,
2129 this->device_viewport_size_
.width(),
2130 this->device_viewport_size_
.height() / 2);
2131 SolidColorDrawQuad
* blue
=
2132 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2133 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
2134 gfx::Rect
yellow_rect(0,
2135 this->device_viewport_size_
.height() / 2,
2136 this->device_viewport_size_
.width(),
2137 this->device_viewport_size_
.height() / 2);
2138 SolidColorDrawQuad
* yellow
=
2139 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2140 yellow
->SetNew(shared_state
, yellow_rect
, yellow_rect
, SK_ColorYELLOW
, false);
2142 SharedQuadState
* pass_shared_state
=
2143 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
2144 CreateTestRenderPassDrawQuad(
2145 pass_shared_state
, pass_rect
, child_pass_id
, root_pass
.get());
2147 RenderPassList pass_list
;
2148 pass_list
.push_back(child_pass
.Pass());
2149 pass_list
.push_back(root_pass
.Pass());
2151 // Check that the child pass remains unflipped.
2152 EXPECT_TRUE(this->RunPixelTestWithReadbackTarget(
2155 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
2156 ExactPixelComparator(true)));
2159 TEST_F(GLRendererPixelTest
, CheckReadbackSubset
) {
2160 gfx::Rect
viewport_rect(this->device_viewport_size_
);
2162 RenderPassId
root_pass_id(1, 1);
2163 scoped_ptr
<RenderPass
> root_pass
=
2164 CreateTestRootRenderPass(root_pass_id
, viewport_rect
);
2166 RenderPassId
child_pass_id(2, 2);
2167 gfx::Rect
pass_rect(this->device_viewport_size_
);
2168 gfx::Transform transform_to_root
;
2169 scoped_ptr
<RenderPass
> child_pass
=
2170 CreateTestRenderPass(child_pass_id
, pass_rect
, transform_to_root
);
2172 gfx::Transform content_to_target_transform
;
2173 SharedQuadState
* shared_state
= CreateTestSharedQuadState(
2174 content_to_target_transform
, viewport_rect
, child_pass
.get());
2176 // Draw a green quad full-size with a blue quad in the lower-right corner.
2177 gfx::Rect
blue_rect(this->device_viewport_size_
.width() * 3 / 4,
2178 this->device_viewport_size_
.height() * 3 / 4,
2179 this->device_viewport_size_
.width() * 3 / 4,
2180 this->device_viewport_size_
.height() * 3 / 4);
2181 SolidColorDrawQuad
* blue
=
2182 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2183 blue
->SetNew(shared_state
, blue_rect
, blue_rect
, SK_ColorBLUE
, false);
2184 gfx::Rect
green_rect(0,
2186 this->device_viewport_size_
.width(),
2187 this->device_viewport_size_
.height());
2188 SolidColorDrawQuad
* green
=
2189 child_pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
2190 green
->SetNew(shared_state
, green_rect
, green_rect
, SK_ColorGREEN
, false);
2192 SharedQuadState
* pass_shared_state
=
2193 CreateTestSharedQuadState(gfx::Transform(), pass_rect
, root_pass
.get());
2194 CreateTestRenderPassDrawQuad(
2195 pass_shared_state
, pass_rect
, child_pass_id
, root_pass
.get());
2197 RenderPassList pass_list
;
2198 pass_list
.push_back(child_pass
.Pass());
2199 pass_list
.push_back(root_pass
.Pass());
2201 // Check that the child pass remains unflipped.
2202 gfx::Rect
capture_rect(this->device_viewport_size_
.width() / 2,
2203 this->device_viewport_size_
.height() / 2,
2204 this->device_viewport_size_
.width() / 2,
2205 this->device_viewport_size_
.height() / 2);
2206 EXPECT_TRUE(this->RunPixelTestWithReadbackTargetAndArea(
2209 base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")),
2210 ExactPixelComparator(true),
2214 TEST_F(GLRendererPixelTest
, PictureDrawQuadTexture4444
) {
2215 gfx::Size
pile_tile_size(1000, 1000);
2216 gfx::Rect
viewport(this->device_viewport_size_
);
2217 ResourceFormat texture_format
= RGBA_4444
;
2219 RenderPassId
id(1, 1);
2220 gfx::Transform transform_to_root
;
2221 scoped_ptr
<RenderPass
> pass
=
2222 CreateTestRenderPass(id
, viewport
, transform_to_root
);
2224 // One viewport-filling blue quad
2225 scoped_refptr
<FakePicturePileImpl
> blue_pile
=
2226 FakePicturePileImpl::CreateFilledPile(pile_tile_size
, viewport
.size());
2228 blue_paint
.setColor(SK_ColorBLUE
);
2229 blue_pile
->add_draw_rect_with_paint(viewport
, blue_paint
);
2230 blue_pile
->RerecordPile();
2232 gfx::Transform blue_content_to_target_transform
;
2233 SharedQuadState
* blue_shared_state
= CreateTestSharedQuadState(
2234 blue_content_to_target_transform
, viewport
, pass
.get());
2236 PictureDrawQuad
* blue_quad
= pass
->CreateAndAppendDrawQuad
<PictureDrawQuad
>();
2237 blue_quad
->SetNew(blue_shared_state
, viewport
, gfx::Rect(), viewport
,
2238 gfx::RectF(0.f
, 0.f
, 1.f
, 1.f
), viewport
.size(),
2239 texture_format
, viewport
, 1.f
, blue_pile
.get());
2241 RenderPassList pass_list
;
2242 pass_list
.push_back(pass
.Pass());
2244 EXPECT_TRUE(this->RunPixelTest(&pass_list
,
2245 base::FilePath(FILE_PATH_LITERAL("blue.png")),
2246 ExactPixelComparator(true)));
2249 TYPED_TEST(RendererPixelTest
, WrapModeRepeat
) {
2250 gfx::Rect
rect(this->device_viewport_size_
);
2252 RenderPassId
id(1, 1);
2253 scoped_ptr
<RenderPass
> pass
= CreateTestRootRenderPass(id
, rect
);
2255 SharedQuadState
* shared_state
=
2256 CreateTestSharedQuadState(gfx::Transform(), rect
, pass
.get());
2258 gfx::Rect
texture_rect(4, 4);
2259 SkPMColor colors
[4] = {
2260 SkPreMultiplyColor(SkColorSetARGB(255, 0, 255, 0)),
2261 SkPreMultiplyColor(SkColorSetARGB(255, 0, 128, 0)),
2262 SkPreMultiplyColor(SkColorSetARGB(255, 0, 64, 0)),
2263 SkPreMultiplyColor(SkColorSetARGB(255, 0, 0, 0)),
2265 uint32_t pixels
[16] = {
2266 colors
[0], colors
[0], colors
[1], colors
[1],
2267 colors
[0], colors
[0], colors
[1], colors
[1],
2268 colors
[2], colors
[2], colors
[3], colors
[3],
2269 colors
[2], colors
[2], colors
[3], colors
[3],
2271 ResourceProvider::ResourceId resource
=
2272 this->resource_provider_
->CreateResource(
2273 texture_rect
.size(),
2275 ResourceProvider::TextureHintImmutable
,
2277 this->resource_provider_
->SetPixels(
2279 reinterpret_cast<uint8_t*>(pixels
),
2284 float vertex_opacity
[4] = {1.0f
, 1.0f
, 1.0f
, 1.0f
};
2285 TextureDrawQuad
* texture_quad
=
2286 pass
->CreateAndAppendDrawQuad
<TextureDrawQuad
>();
2287 texture_quad
->SetNew(
2289 gfx::Rect(this->device_viewport_size_
),
2291 gfx::Rect(this->device_viewport_size_
),
2293 true, // premultiplied_alpha
2294 gfx::PointF(0.0f
, 0.0f
), // uv_top_left
2295 gfx::PointF( // uv_bottom_right
2296 this->device_viewport_size_
.width() / texture_rect
.width(),
2297 this->device_viewport_size_
.height() / texture_rect
.height()),
2301 false); // nearest_neighbor
2303 RenderPassList pass_list
;
2304 pass_list
.push_back(pass
.Pass());
2306 EXPECT_TRUE(this->RunPixelTest(
2308 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")),
2309 FuzzyPixelOffByOneComparator(true)));
2312 #endif // !defined(OS_ANDROID)