Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: cc/output/renderer_pixeltest.cc

Issue 1001833005: Update from https://crrev.com/320343 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Supress Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/output/overlay_unittest.cc ('k') | cc/output/software_renderer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop/message_loop.h" 5 #include "base/message_loop/message_loop.h"
6 #include "cc/layers/append_quads_data.h" 6 #include "cc/layers/append_quads_data.h"
7 #include "cc/output/gl_renderer.h" 7 #include "cc/output/gl_renderer.h"
8 #include "cc/quads/draw_quad.h" 8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/picture_draw_quad.h" 9 #include "cc/quads/picture_draw_quad.h"
10 #include "cc/quads/texture_draw_quad.h" 10 #include "cc/quads/texture_draw_quad.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 rect, 103 rect,
104 pass_id, 104 pass_id,
105 0, // mask_resource_id 105 0, // mask_resource_id
106 gfx::Vector2dF(), // mask_uv_scale 106 gfx::Vector2dF(), // mask_uv_scale
107 gfx::Size(), // mask_texture_size 107 gfx::Size(), // mask_texture_size
108 FilterOperations(), // foreground filters 108 FilterOperations(), // foreground filters
109 gfx::Vector2dF(), // filters scale 109 gfx::Vector2dF(), // filters scale
110 FilterOperations()); // background filters 110 FilterOperations()); // background filters
111 } 111 }
112 112
113 void CreateTestTwoColoredTextureDrawQuad(const gfx::Rect& rect,
114 SkColor texel_color,
115 SkColor texel_stripe_color,
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 SkPMColor pixel_stripe_color =
128 premultiplied_alpha
129 ? SkPreMultiplyColor(texel_stripe_color)
130 : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color),
131 SkColorGetR(texel_stripe_color),
132 SkColorGetG(texel_stripe_color),
133 SkColorGetB(texel_stripe_color));
134 std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
135 for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) {
136 for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) {
137 pixels[i * rect.width() + k] = pixel_stripe_color;
138 }
139 }
140 ResourceProvider::ResourceId resource = resource_provider->CreateResource(
141 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
142 RGBA_8888);
143 resource_provider->SetPixels(resource,
144 reinterpret_cast<uint8_t*>(&pixels.front()),
145 rect, rect, gfx::Vector2d());
146
147 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
148 const gfx::PointF uv_top_left(0.0f, 0.0f);
149 const gfx::PointF uv_bottom_right(1.0f, 1.0f);
150 const bool flipped = false;
151 const bool nearest_neighbor = false;
152 TextureDrawQuad* quad =
153 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
154 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource,
155 premultiplied_alpha, uv_top_left, uv_bottom_right,
156 background_color, vertex_opacity, flipped, nearest_neighbor);
157 }
158
113 void CreateTestTextureDrawQuad(const gfx::Rect& rect, 159 void CreateTestTextureDrawQuad(const gfx::Rect& rect,
114 SkColor texel_color, 160 SkColor texel_color,
115 SkColor background_color, 161 SkColor background_color,
116 bool premultiplied_alpha, 162 bool premultiplied_alpha,
117 const SharedQuadState* shared_state, 163 const SharedQuadState* shared_state,
118 ResourceProvider* resource_provider, 164 ResourceProvider* resource_provider,
119 RenderPass* render_pass) { 165 RenderPass* render_pass) {
120 SkPMColor pixel_color = premultiplied_alpha ? 166 SkPMColor pixel_color = premultiplied_alpha ?
121 SkPreMultiplyColor(texel_color) : 167 SkPreMultiplyColor(texel_color) :
122 SkPackARGB32NoCheck(SkColorGetA(texel_color), 168 SkPackARGB32NoCheck(SkColorGetA(texel_color),
123 SkColorGetR(texel_color), 169 SkColorGetR(texel_color),
124 SkColorGetG(texel_color), 170 SkColorGetG(texel_color),
125 SkColorGetB(texel_color)); 171 SkColorGetB(texel_color));
126 size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height(); 172 size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height();
127 std::vector<uint32_t> pixels(num_pixels, pixel_color); 173 std::vector<uint32_t> pixels(num_pixels, pixel_color);
128 174
129 ResourceProvider::ResourceId resource = resource_provider->CreateResource( 175 ResourceProvider::ResourceId resource = resource_provider->CreateResource(
130 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, 176 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
131 RGBA_8888); 177 RGBA_8888);
132 resource_provider->CopyToResource( 178 resource_provider->CopyToResource(
133 resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); 179 resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size());
134 180
135 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; 181 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
136 182
183 const gfx::PointF uv_top_left(0.0f, 0.0f);
184 const gfx::PointF uv_bottom_right(1.0f, 1.0f);
185 const bool flipped = false;
186 const bool nearest_neighbor = false;
137 TextureDrawQuad* quad = 187 TextureDrawQuad* quad =
138 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 188 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
139 quad->SetNew(shared_state, 189 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource,
140 rect, 190 premultiplied_alpha, uv_top_left, uv_bottom_right,
141 gfx::Rect(), 191 background_color, vertex_opacity, flipped, nearest_neighbor);
142 rect, 192 }
143 resource, 193
144 premultiplied_alpha, 194 void CreateTestYUVVideoDrawQuad_FromVideoFrame(
145 gfx::PointF(0.0f, 0.0f), // uv_top_left 195 const SharedQuadState* shared_state,
146 gfx::PointF(1.0f, 1.0f), // uv_bottom_right 196 scoped_refptr<media::VideoFrame> video_frame,
147 background_color, 197 uint8 alpha_value,
148 vertex_opacity, 198 const gfx::RectF& tex_coord_rect,
149 false, // flipped 199 RenderPass* render_pass,
150 false); // nearest_neighbor 200 VideoResourceUpdater* video_resource_updater,
201 const gfx::Rect& rect,
202 ResourceProvider* resource_provider) {
203 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
204 const YUVVideoDrawQuad::ColorSpace color_space =
205 (video_frame->format() == media::VideoFrame::YV12J
206 ? YUVVideoDrawQuad::JPEG
207 : YUVVideoDrawQuad::REC_601);
208 const gfx::Rect opaque_rect(0, 0, 0, 0);
209
210 if (with_alpha) {
211 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value,
212 video_frame->stride(media::VideoFrame::kAPlane) *
213 video_frame->rows(media::VideoFrame::kAPlane));
214 }
215
216 VideoFrameExternalResources resources =
217 video_resource_updater->CreateExternalResourcesFromVideoFrame(
218 video_frame);
219
220 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
221 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
222 resources.mailboxes.size());
223 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
224 resources.release_callbacks.size());
225
226 ResourceProvider::ResourceId y_resource =
227 resource_provider->CreateResourceFromTextureMailbox(
228 resources.mailboxes[media::VideoFrame::kYPlane],
229 SingleReleaseCallbackImpl::Create(
230 resources.release_callbacks[media::VideoFrame::kYPlane]));
231 ResourceProvider::ResourceId u_resource =
232 resource_provider->CreateResourceFromTextureMailbox(
233 resources.mailboxes[media::VideoFrame::kUPlane],
234 SingleReleaseCallbackImpl::Create(
235 resources.release_callbacks[media::VideoFrame::kUPlane]));
236 ResourceProvider::ResourceId v_resource =
237 resource_provider->CreateResourceFromTextureMailbox(
238 resources.mailboxes[media::VideoFrame::kVPlane],
239 SingleReleaseCallbackImpl::Create(
240 resources.release_callbacks[media::VideoFrame::kVPlane]));
241 ResourceProvider::ResourceId a_resource = 0;
242 if (with_alpha) {
243 a_resource = resource_provider->CreateResourceFromTextureMailbox(
244 resources.mailboxes[media::VideoFrame::kAPlane],
245 SingleReleaseCallbackImpl::Create(
246 resources.release_callbacks[media::VideoFrame::kAPlane]));
247 }
248
249 YUVVideoDrawQuad* yuv_quad =
250 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
251 yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
252 video_frame->coded_size(), y_resource, u_resource,
253 v_resource, a_resource, color_space);
254 }
255
256 void CreateTestYUVVideoDrawQuad_Striped(
257 const SharedQuadState* shared_state,
258 media::VideoFrame::Format format,
259 bool is_transparent,
260 const gfx::RectF& tex_coord_rect,
261 RenderPass* render_pass,
262 VideoResourceUpdater* video_resource_updater,
263 const gfx::Rect& rect,
264 ResourceProvider* resource_provider) {
265 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
266 format, rect.size(), rect, rect.size(), base::TimeDelta());
267
268 // YUV values representing a striped pattern, for validating texture
269 // coordinates for sampling.
270 uint8_t y_value = 0;
271 uint8_t u_value = 0;
272 uint8_t v_value = 0;
273 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
274 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
275 video_frame->stride(media::VideoFrame::kYPlane) * i;
276 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
277 ++j) {
278 y_row[j] = (y_value += 1);
279 }
280 }
281 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
282 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
283 video_frame->stride(media::VideoFrame::kUPlane) * i;
284 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
285 video_frame->stride(media::VideoFrame::kVPlane) * i;
286 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
287 ++j) {
288 u_row[j] = (u_value += 3);
289 v_row[j] = (v_value += 5);
290 }
291 }
292 uint8 alpha_value = is_transparent ? 0 : 128;
293 CreateTestYUVVideoDrawQuad_FromVideoFrame(
294 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
295 video_resource_updater, rect, resource_provider);
296 }
297
298 // Creates a video frame of size background_size filled with yuv_background,
299 // and then draws a foreground rectangle in a different color on top of
300 // that. The foreground rectangle must have coordinates that are divisible
301 // by 2 because YUV is a block format.
302 void CreateTestYUVVideoDrawQuad_TwoColor(
303 const SharedQuadState* shared_state,
304 media::VideoFrame::Format format,
305 bool is_transparent,
306 const gfx::RectF& tex_coord_rect,
307 const gfx::Size& background_size,
308 uint8 y_background,
309 uint8 u_background,
310 uint8 v_background,
311 const gfx::Rect& foreground_rect,
312 uint8 y_foreground,
313 uint8 u_foreground,
314 uint8 v_foreground,
315 RenderPass* render_pass,
316 VideoResourceUpdater* video_resource_updater,
317 ResourceProvider* resource_provider) {
318 const gfx::Rect rect(background_size);
319
320 scoped_refptr<media::VideoFrame> video_frame =
321 media::VideoFrame::CreateFrame(format, background_size, foreground_rect,
322 foreground_rect.size(), base::TimeDelta());
323
324 int planes[] = {media::VideoFrame::kYPlane,
325 media::VideoFrame::kUPlane,
326 media::VideoFrame::kVPlane};
327 uint8 yuv_background[] = {y_background, u_background, v_background};
328 uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground};
329 int sample_size[] = {1, 2, 2};
330
331 for (int i = 0; i < 3; ++i) {
332 memset(video_frame->data(planes[i]), yuv_background[i],
333 video_frame->stride(planes[i]) * video_frame->rows(planes[i]));
334 }
335
336 for (int i = 0; i < 3; ++i) {
337 // Since yuv encoding uses block encoding, widths have to be divisible
338 // by the sample size in order for this function to behave properly.
339 DCHECK_EQ(foreground_rect.x() % sample_size[i], 0);
340 DCHECK_EQ(foreground_rect.y() % sample_size[i], 0);
341 DCHECK_EQ(foreground_rect.width() % sample_size[i], 0);
342 DCHECK_EQ(foreground_rect.height() % sample_size[i], 0);
343
344 gfx::Rect sample_rect(foreground_rect.x() / sample_size[i],
345 foreground_rect.y() / sample_size[i],
346 foreground_rect.width() / sample_size[i],
347 foreground_rect.height() / sample_size[i]);
348 for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) {
349 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) {
350 size_t offset = y * video_frame->stride(planes[i]) + x;
351 video_frame->data(planes[i])[offset] = yuv_foreground[i];
352 }
353 }
354 }
355
356 uint8 alpha_value = 255;
357 CreateTestYUVVideoDrawQuad_FromVideoFrame(
358 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
359 video_resource_updater, rect, resource_provider);
360 }
361
362 void CreateTestYUVVideoDrawQuad_Solid(
363 const SharedQuadState* shared_state,
364 media::VideoFrame::Format format,
365 bool is_transparent,
366 const gfx::RectF& tex_coord_rect,
367 uint8 y,
368 uint8 u,
369 uint8 v,
370 RenderPass* render_pass,
371 VideoResourceUpdater* video_resource_updater,
372 const gfx::Rect& rect,
373 ResourceProvider* resource_provider) {
374 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
375 format, rect.size(), rect, rect.size(), base::TimeDelta());
376
377 // YUV values of a solid, constant, color. Useful for testing that color
378 // space/color range are being handled properly.
379 memset(video_frame->data(media::VideoFrame::kYPlane), y,
380 video_frame->stride(media::VideoFrame::kYPlane) *
381 video_frame->rows(media::VideoFrame::kYPlane));
382 memset(video_frame->data(media::VideoFrame::kUPlane), u,
383 video_frame->stride(media::VideoFrame::kUPlane) *
384 video_frame->rows(media::VideoFrame::kUPlane));
385 memset(video_frame->data(media::VideoFrame::kVPlane), v,
386 video_frame->stride(media::VideoFrame::kVPlane) *
387 video_frame->rows(media::VideoFrame::kVPlane));
388
389 uint8 alpha_value = is_transparent ? 0 : 128;
390 CreateTestYUVVideoDrawQuad_FromVideoFrame(
391 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
392 video_resource_updater, rect, resource_provider);
151 } 393 }
152 394
153 typedef ::testing::Types<GLRenderer, 395 typedef ::testing::Types<GLRenderer,
154 SoftwareRenderer, 396 SoftwareRenderer,
155 GLRendererWithExpandedViewport, 397 GLRendererWithExpandedViewport,
156 SoftwareRendererWithExpandedViewport> RendererTypes; 398 SoftwareRendererWithExpandedViewport> RendererTypes;
157 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); 399 TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
158 400
159 template <typename RendererType> 401 template <typename RendererType>
160 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; 402 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {};
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 557
316 RenderPassList pass_list; 558 RenderPassList pass_list;
317 pass_list.push_back(pass.Pass()); 559 pass_list.push_back(pass.Pass());
318 560
319 EXPECT_TRUE(this->RunPixelTest( 561 EXPECT_TRUE(this->RunPixelTest(
320 &pass_list, 562 &pass_list,
321 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), 563 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
322 FuzzyPixelOffByOneComparator(true))); 564 FuzzyPixelOffByOneComparator(true)));
323 } 565 }
324 566
567 template <typename QuadType>
568 static const base::FilePath::CharType* IntersectingQuadImage() {
569 return FILE_PATH_LITERAL("intersecting_blue_green_squares.png");
570 }
571 template <>
572 const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() {
573 return FILE_PATH_LITERAL("intersecting_blue_green.png");
574 }
575 template <>
576 const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() {
577 return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png");
578 }
579
580 template <typename TypeParam>
581 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
582 protected:
583 void SetupQuadStateAndRenderPass() {
584 // This sets up a pair of draw quads. They are both rotated
585 // relative to the root plane, they are also rotated relative to each other.
586 // The intersect in the middle at a non-perpendicular angle so that any
587 // errors are hopefully magnified.
588 // The quads should intersect correctly, as in the front quad should only
589 // be partially in front of the back quad, and partially behind.
590
591 viewport_rect_ = gfx::Rect(this->device_viewport_size_);
592 quad_rect_ = gfx::Rect(0, 0, this->device_viewport_size_.width(),
593 this->device_viewport_size_.height() / 2.0);
594
595 RenderPassId id(1, 1);
596 render_pass_ = CreateTestRootRenderPass(id, viewport_rect_);
597
598 // Create the front quad rotated on the Z and Y axis.
599 gfx::Transform trans;
600 trans.Translate3d(0, 0, 0.707 * this->device_viewport_size_.width() / 2.0);
601 trans.RotateAboutZAxis(45.0);
602 trans.RotateAboutYAxis(45.0);
603 front_quad_state_ =
604 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
605 front_quad_state_->clip_rect = quad_rect_;
606 // Make sure they end up in a 3d sorting context.
607 front_quad_state_->sorting_context_id = 1;
608
609 // Create the back quad, and rotate on just the y axis. This will intersect
610 // the first quad partially.
611 trans = gfx::Transform();
612 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0);
613 trans.RotateAboutYAxis(-45.0);
614 back_quad_state_ =
615 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
616 back_quad_state_->sorting_context_id = 1;
617 back_quad_state_->clip_rect = quad_rect_;
618 }
619 template <typename T>
620 void AppendBackgroundAndRunTest(const PixelComparator& comparator) {
621 SharedQuadState* background_quad_state = CreateTestSharedQuadState(
622 gfx::Transform(), viewport_rect_, render_pass_.get());
623 SolidColorDrawQuad* background_quad =
624 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
625 background_quad->SetNew(background_quad_state, viewport_rect_,
626 viewport_rect_, SK_ColorWHITE, false);
627 pass_list_.push_back(render_pass_.Pass());
628 const base::FilePath::CharType* fileName = IntersectingQuadImage<T>();
629 EXPECT_TRUE(
630 this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator));
631 }
632 template <typename T>
633 T* CreateAndAppendDrawQuad() {
634 return render_pass_->CreateAndAppendDrawQuad<T>();
635 }
636
637 scoped_ptr<RenderPass> render_pass_;
638 gfx::Rect viewport_rect_;
639 SharedQuadState* front_quad_state_;
640 SharedQuadState* back_quad_state_;
641 gfx::Rect quad_rect_;
642 RenderPassList pass_list_;
643 };
644
645 template <typename TypeParam>
646 class IntersectingQuadGLPixelTest
647 : public IntersectingQuadPixelTest<TypeParam> {
648 public:
649 void SetUp() override {
650 IntersectingQuadPixelTest<TypeParam>::SetUp();
651 video_resource_updater_.reset(
652 new VideoResourceUpdater(this->output_surface_->context_provider(),
653 this->resource_provider_.get()));
654 video_resource_updater2_.reset(
655 new VideoResourceUpdater(this->output_surface_->context_provider(),
656 this->resource_provider_.get()));
657 }
658
659 protected:
660 scoped_ptr<VideoResourceUpdater> video_resource_updater_;
661 scoped_ptr<VideoResourceUpdater> video_resource_updater2_;
662 };
663
664 template <typename TypeParam>
665 class IntersectingQuadSoftwareTest
666 : public IntersectingQuadPixelTest<TypeParam> {};
667
668 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport>
669 SoftwareRendererTypes;
670 typedef ::testing::Types<GLRenderer, GLRendererWithExpandedViewport>
671 GLRendererTypes;
672
673 TYPED_TEST_CASE(IntersectingQuadPixelTest, RendererTypes);
674 TYPED_TEST_CASE(IntersectingQuadGLPixelTest, GLRendererTypes);
675 TYPED_TEST_CASE(IntersectingQuadSoftwareTest, SoftwareRendererTypes);
676
677 TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) {
678 this->SetupQuadStateAndRenderPass();
679
680 SolidColorDrawQuad* quad =
681 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
682 SolidColorDrawQuad* quad2 =
683 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
684
685 quad->SetNew(this->front_quad_state_, this->quad_rect_, this->quad_rect_,
686 SK_ColorBLUE, false);
687 quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_,
688 SK_ColorGREEN, false);
689 SCOPED_TRACE("IntersectingSolidColorQuads");
690 this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>(
691 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
692 }
693
694 template <typename TypeParam>
695 SkColor GetColor(const SkColor& color) {
696 return color;
697 }
698
699 template <>
700 SkColor GetColor<GLRenderer>(const SkColor& color) {
701 return SkColorSetARGB(SkColorGetA(color), SkColorGetB(color),
702 SkColorGetG(color), SkColorGetR(color));
703 }
704 template <>
705 SkColor GetColor<GLRendererWithExpandedViewport>(const SkColor& color) {
706 return GetColor<GLRenderer>(color);
707 }
708
709 TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) {
710 this->SetupQuadStateAndRenderPass();
711 CreateTestTwoColoredTextureDrawQuad(
712 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)),
713 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT,
714 true, this->front_quad_state_, this->resource_provider_.get(),
715 this->render_pass_.get());
716 CreateTestTwoColoredTextureDrawQuad(
717 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
718 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT,
719 true, this->back_quad_state_, this->resource_provider_.get(),
720 this->render_pass_.get());
721
722 SCOPED_TRACE("IntersectingTexturedQuads");
723 this->template AppendBackgroundAndRunTest<TextureDrawQuad>(
724 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
725 }
726
727 TYPED_TEST(IntersectingQuadSoftwareTest, PictureQuads) {
728 this->SetupQuadStateAndRenderPass();
729 gfx::RectF outer_rect(this->quad_rect_);
730 gfx::RectF inner_rect(this->quad_rect_.x() + (this->quad_rect_.width() / 4),
731 this->quad_rect_.y() + (this->quad_rect_.height() / 4),
732 this->quad_rect_.width() / 2,
733 this->quad_rect_.height() / 2);
734
735 SkPaint black_paint;
736 black_paint.setColor(SK_ColorBLACK);
737 SkPaint blue_paint;
738 blue_paint.setColor(SK_ColorBLUE);
739 SkPaint green_paint;
740 green_paint.setColor(SK_ColorGREEN);
741
742 scoped_ptr<FakePicturePile> blue_recording =
743 FakePicturePile::CreateFilledPile(gfx::Size(1000, 1000),
744 this->quad_rect_.size());
745 blue_recording->add_draw_rect_with_paint(outer_rect, black_paint);
746 blue_recording->add_draw_rect_with_paint(inner_rect, blue_paint);
747 blue_recording->RerecordPile();
748 scoped_refptr<FakePicturePileImpl> blue_pile =
749 FakePicturePileImpl::CreateFromPile(blue_recording.get(), nullptr);
750
751 PictureDrawQuad* blue_quad =
752 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
753
754 blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(),
755 this->quad_rect_, this->quad_rect_, this->quad_rect_.size(),
756 false, RGBA_8888, this->quad_rect_, 1.f, blue_pile);
757
758 scoped_ptr<FakePicturePile> green_recording =
759 FakePicturePile::CreateFilledPile(this->quad_rect_.size(),
760 this->quad_rect_.size());
761 green_recording->add_draw_rect_with_paint(outer_rect, green_paint);
762 green_recording->add_draw_rect_with_paint(inner_rect, black_paint);
763 green_recording->RerecordPile();
764 scoped_refptr<FakePicturePileImpl> green_pile =
765 FakePicturePileImpl::CreateFromPile(green_recording.get(), nullptr);
766
767 PictureDrawQuad* green_quad =
768 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
769 green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(),
770 this->quad_rect_, this->quad_rect_,
771 this->quad_rect_.size(), false, RGBA_8888,
772 this->quad_rect_, 1.f, green_pile);
773 SCOPED_TRACE("IntersectingPictureQuadsPass");
774 this->template AppendBackgroundAndRunTest<PictureDrawQuad>(
775 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
776 }
777
778 TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) {
779 this->SetupQuadStateAndRenderPass();
780 RenderPassId child_pass_id1(2, 2);
781 RenderPassId child_pass_id2(2, 3);
782 scoped_ptr<RenderPass> child_pass1 =
783 CreateTestRenderPass(child_pass_id1, this->quad_rect_, gfx::Transform());
784 SharedQuadState* child1_quad_state = CreateTestSharedQuadState(
785 gfx::Transform(), this->quad_rect_, child_pass1.get());
786 scoped_ptr<RenderPass> child_pass2 =
787 CreateTestRenderPass(child_pass_id2, this->quad_rect_, gfx::Transform());
788 SharedQuadState* child2_quad_state = CreateTestSharedQuadState(
789 gfx::Transform(), this->quad_rect_, child_pass2.get());
790
791 CreateTestTwoColoredTextureDrawQuad(
792 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)),
793 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT,
794 true, child1_quad_state, this->resource_provider_.get(),
795 child_pass1.get());
796 CreateTestTwoColoredTextureDrawQuad(
797 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
798 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT,
799 true, child2_quad_state, this->resource_provider_.get(),
800 child_pass2.get());
801
802 CreateTestRenderPassDrawQuad(this->front_quad_state_, this->quad_rect_,
803 child_pass_id1, this->render_pass_.get());
804 CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_,
805 child_pass_id2, this->render_pass_.get());
806
807 this->pass_list_.push_back(child_pass1.Pass());
808 this->pass_list_.push_back(child_pass2.Pass());
809 SCOPED_TRACE("IntersectingRenderQuadsPass");
810 this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>(
811 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
812 }
813
814 TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) {
815 this->SetupQuadStateAndRenderPass();
816 gfx::Rect inner_rect(
817 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF),
818 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF),
819 (this->quad_rect_.width() / 2) & ~0xF,
820 (this->quad_rect_.height() / 2) & ~0xF);
821
822 CreateTestYUVVideoDrawQuad_TwoColor(
823 this->front_quad_state_, media::VideoFrame::YV12J, false,
824 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128,
825 inner_rect, 29, 255, 107, this->render_pass_.get(),
826 this->video_resource_updater_.get(), this->resource_provider_.get());
827
828 CreateTestYUVVideoDrawQuad_TwoColor(
829 this->back_quad_state_, media::VideoFrame::YV12J, false,
830 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21,
831 inner_rect, 0, 128, 128, this->render_pass_.get(),
832 this->video_resource_updater2_.get(), this->resource_provider_.get());
833
834 SCOPED_TRACE("IntersectingVideoQuads");
835 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>(
836 FuzzyPixelOffByOneComparator(false));
837 }
838
325 // TODO(skaslev): The software renderer does not support non-premultplied alpha. 839 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
326 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { 840 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
327 gfx::Rect rect(this->device_viewport_size_); 841 gfx::Rect rect(this->device_viewport_size_);
328 842
329 RenderPassId id(1, 1); 843 RenderPassId id(1, 1);
330 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 844 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
331 845
332 SharedQuadState* shared_state = 846 SharedQuadState* shared_state =
333 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 847 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
334 848
(...skipping 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after
2145 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") 2659 ? FILE_PATH_LITERAL("four_blue_green_checkers.png")
2146 : FILE_PATH_LITERAL("checkers_big.png"); 2660 : FILE_PATH_LITERAL("checkers_big.png");
2147 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), 2661 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path),
2148 ExactPixelComparator(true))); 2662 ExactPixelComparator(true)));
2149 } 2663 }
2150 2664
2151 #endif // !defined(OS_ANDROID) 2665 #endif // !defined(OS_ANDROID)
2152 2666
2153 } // namespace 2667 } // namespace
2154 } // namespace cc 2668 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_unittest.cc ('k') | cc/output/software_renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698