Index: cc/output/renderer_pixeltest.cc |
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc |
index 570b38998a34f32f5505cc852cabc269a0926a4c..743e1cfe59680e2a05d92d6371246879f9d4233c 100644 |
--- a/cc/output/renderer_pixeltest.cc |
+++ b/cc/output/renderer_pixeltest.cc |
@@ -111,52 +111,6 @@ |
FilterOperations()); // background filters |
} |
-void CreateTestTwoColoredTextureDrawQuad(const gfx::Rect& rect, |
- SkColor texel_color, |
- SkColor texel_stripe_color, |
- SkColor background_color, |
- bool premultiplied_alpha, |
- const SharedQuadState* shared_state, |
- ResourceProvider* resource_provider, |
- RenderPass* render_pass) { |
- SkPMColor pixel_color = premultiplied_alpha |
- ? SkPreMultiplyColor(texel_color) |
- : SkPackARGB32NoCheck(SkColorGetA(texel_color), |
- SkColorGetR(texel_color), |
- SkColorGetG(texel_color), |
- SkColorGetB(texel_color)); |
- SkPMColor pixel_stripe_color = |
- premultiplied_alpha |
- ? SkPreMultiplyColor(texel_stripe_color) |
- : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color), |
- SkColorGetR(texel_stripe_color), |
- SkColorGetG(texel_stripe_color), |
- SkColorGetB(texel_stripe_color)); |
- std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color); |
- for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) { |
- for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) { |
- pixels[i * rect.width() + k] = pixel_stripe_color; |
- } |
- } |
- ResourceProvider::ResourceId resource = resource_provider->CreateResource( |
- rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- RGBA_8888); |
- resource_provider->SetPixels(resource, |
- reinterpret_cast<uint8_t*>(&pixels.front()), |
- rect, rect, gfx::Vector2d()); |
- |
- float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
- const gfx::PointF uv_top_left(0.0f, 0.0f); |
- const gfx::PointF uv_bottom_right(1.0f, 1.0f); |
- const bool flipped = false; |
- const bool nearest_neighbor = false; |
- TextureDrawQuad* quad = |
- render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
- quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource, |
- premultiplied_alpha, uv_top_left, uv_bottom_right, |
- background_color, vertex_opacity, flipped, nearest_neighbor); |
-} |
- |
void CreateTestTextureDrawQuad(const gfx::Rect& rect, |
SkColor texel_color, |
SkColor background_color, |
@@ -181,216 +135,20 @@ |
float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
- const gfx::PointF uv_top_left(0.0f, 0.0f); |
- const gfx::PointF uv_bottom_right(1.0f, 1.0f); |
- const bool flipped = false; |
- const bool nearest_neighbor = false; |
TextureDrawQuad* quad = |
render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
- quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource, |
- premultiplied_alpha, uv_top_left, uv_bottom_right, |
- background_color, vertex_opacity, flipped, nearest_neighbor); |
-} |
- |
-void CreateTestYUVVideoDrawQuad_FromVideoFrame( |
- const SharedQuadState* shared_state, |
- scoped_refptr<media::VideoFrame> video_frame, |
- uint8 alpha_value, |
- const gfx::RectF& tex_coord_rect, |
- RenderPass* render_pass, |
- VideoResourceUpdater* video_resource_updater, |
- const gfx::Rect& rect, |
- ResourceProvider* resource_provider) { |
- const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A); |
- const YUVVideoDrawQuad::ColorSpace color_space = |
- (video_frame->format() == media::VideoFrame::YV12J |
- ? YUVVideoDrawQuad::JPEG |
- : YUVVideoDrawQuad::REC_601); |
- const gfx::Rect opaque_rect(0, 0, 0, 0); |
- |
- if (with_alpha) { |
- memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, |
- video_frame->stride(media::VideoFrame::kAPlane) * |
- video_frame->rows(media::VideoFrame::kAPlane)); |
- } |
- |
- VideoFrameExternalResources resources = |
- video_resource_updater->CreateExternalResourcesFromVideoFrame( |
- video_frame); |
- |
- EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
- EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
- resources.mailboxes.size()); |
- EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
- resources.release_callbacks.size()); |
- |
- ResourceProvider::ResourceId y_resource = |
- resource_provider->CreateResourceFromTextureMailbox( |
- resources.mailboxes[media::VideoFrame::kYPlane], |
- SingleReleaseCallbackImpl::Create( |
- resources.release_callbacks[media::VideoFrame::kYPlane])); |
- ResourceProvider::ResourceId u_resource = |
- resource_provider->CreateResourceFromTextureMailbox( |
- resources.mailboxes[media::VideoFrame::kUPlane], |
- SingleReleaseCallbackImpl::Create( |
- resources.release_callbacks[media::VideoFrame::kUPlane])); |
- ResourceProvider::ResourceId v_resource = |
- resource_provider->CreateResourceFromTextureMailbox( |
- resources.mailboxes[media::VideoFrame::kVPlane], |
- SingleReleaseCallbackImpl::Create( |
- resources.release_callbacks[media::VideoFrame::kVPlane])); |
- ResourceProvider::ResourceId a_resource = 0; |
- if (with_alpha) { |
- a_resource = resource_provider->CreateResourceFromTextureMailbox( |
- resources.mailboxes[media::VideoFrame::kAPlane], |
- SingleReleaseCallbackImpl::Create( |
- resources.release_callbacks[media::VideoFrame::kAPlane])); |
- } |
- |
- YUVVideoDrawQuad* yuv_quad = |
- render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
- yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect, |
- video_frame->coded_size(), y_resource, u_resource, |
- v_resource, a_resource, color_space); |
-} |
- |
-void CreateTestYUVVideoDrawQuad_Striped( |
- const SharedQuadState* shared_state, |
- media::VideoFrame::Format format, |
- bool is_transparent, |
- const gfx::RectF& tex_coord_rect, |
- RenderPass* render_pass, |
- VideoResourceUpdater* video_resource_updater, |
- const gfx::Rect& rect, |
- ResourceProvider* resource_provider) { |
- scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
- format, rect.size(), rect, rect.size(), base::TimeDelta()); |
- |
- // YUV values representing a striped pattern, for validating texture |
- // coordinates for sampling. |
- uint8_t y_value = 0; |
- uint8_t u_value = 0; |
- uint8_t v_value = 0; |
- for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { |
- uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) + |
- video_frame->stride(media::VideoFrame::kYPlane) * i; |
- for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane); |
- ++j) { |
- y_row[j] = (y_value += 1); |
- } |
- } |
- for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) { |
- uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) + |
- video_frame->stride(media::VideoFrame::kUPlane) * i; |
- uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) + |
- video_frame->stride(media::VideoFrame::kVPlane) * i; |
- for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); |
- ++j) { |
- u_row[j] = (u_value += 3); |
- v_row[j] = (v_value += 5); |
- } |
- } |
- uint8 alpha_value = is_transparent ? 0 : 128; |
- CreateTestYUVVideoDrawQuad_FromVideoFrame( |
- shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
- video_resource_updater, rect, resource_provider); |
-} |
- |
-// Creates a video frame of size background_size filled with yuv_background, |
-// and then draws a foreground rectangle in a different color on top of |
-// that. The foreground rectangle must have coordinates that are divisible |
-// by 2 because YUV is a block format. |
-void CreateTestYUVVideoDrawQuad_TwoColor( |
- const SharedQuadState* shared_state, |
- media::VideoFrame::Format format, |
- bool is_transparent, |
- const gfx::RectF& tex_coord_rect, |
- const gfx::Size& background_size, |
- uint8 y_background, |
- uint8 u_background, |
- uint8 v_background, |
- const gfx::Rect& foreground_rect, |
- uint8 y_foreground, |
- uint8 u_foreground, |
- uint8 v_foreground, |
- RenderPass* render_pass, |
- VideoResourceUpdater* video_resource_updater, |
- ResourceProvider* resource_provider) { |
- const gfx::Rect rect(background_size); |
- |
- scoped_refptr<media::VideoFrame> video_frame = |
- media::VideoFrame::CreateFrame(format, background_size, foreground_rect, |
- foreground_rect.size(), base::TimeDelta()); |
- |
- int planes[] = {media::VideoFrame::kYPlane, |
- media::VideoFrame::kUPlane, |
- media::VideoFrame::kVPlane}; |
- uint8 yuv_background[] = {y_background, u_background, v_background}; |
- uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground}; |
- int sample_size[] = {1, 2, 2}; |
- |
- for (int i = 0; i < 3; ++i) { |
- memset(video_frame->data(planes[i]), yuv_background[i], |
- video_frame->stride(planes[i]) * video_frame->rows(planes[i])); |
- } |
- |
- for (int i = 0; i < 3; ++i) { |
- // Since yuv encoding uses block encoding, widths have to be divisible |
- // by the sample size in order for this function to behave properly. |
- DCHECK_EQ(foreground_rect.x() % sample_size[i], 0); |
- DCHECK_EQ(foreground_rect.y() % sample_size[i], 0); |
- DCHECK_EQ(foreground_rect.width() % sample_size[i], 0); |
- DCHECK_EQ(foreground_rect.height() % sample_size[i], 0); |
- |
- gfx::Rect sample_rect(foreground_rect.x() / sample_size[i], |
- foreground_rect.y() / sample_size[i], |
- foreground_rect.width() / sample_size[i], |
- foreground_rect.height() / sample_size[i]); |
- for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) { |
- for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { |
- size_t offset = y * video_frame->stride(planes[i]) + x; |
- video_frame->data(planes[i])[offset] = yuv_foreground[i]; |
- } |
- } |
- } |
- |
- uint8 alpha_value = 255; |
- CreateTestYUVVideoDrawQuad_FromVideoFrame( |
- shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
- video_resource_updater, rect, resource_provider); |
-} |
- |
-void CreateTestYUVVideoDrawQuad_Solid( |
- const SharedQuadState* shared_state, |
- media::VideoFrame::Format format, |
- bool is_transparent, |
- const gfx::RectF& tex_coord_rect, |
- uint8 y, |
- uint8 u, |
- uint8 v, |
- RenderPass* render_pass, |
- VideoResourceUpdater* video_resource_updater, |
- const gfx::Rect& rect, |
- ResourceProvider* resource_provider) { |
- scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
- format, rect.size(), rect, rect.size(), base::TimeDelta()); |
- |
- // YUV values of a solid, constant, color. Useful for testing that color |
- // space/color range are being handled properly. |
- memset(video_frame->data(media::VideoFrame::kYPlane), y, |
- video_frame->stride(media::VideoFrame::kYPlane) * |
- video_frame->rows(media::VideoFrame::kYPlane)); |
- memset(video_frame->data(media::VideoFrame::kUPlane), u, |
- video_frame->stride(media::VideoFrame::kUPlane) * |
- video_frame->rows(media::VideoFrame::kUPlane)); |
- memset(video_frame->data(media::VideoFrame::kVPlane), v, |
- video_frame->stride(media::VideoFrame::kVPlane) * |
- video_frame->rows(media::VideoFrame::kVPlane)); |
- |
- uint8 alpha_value = is_transparent ? 0 : 128; |
- CreateTestYUVVideoDrawQuad_FromVideoFrame( |
- shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
- video_resource_updater, rect, resource_provider); |
+ quad->SetNew(shared_state, |
+ rect, |
+ gfx::Rect(), |
+ rect, |
+ resource, |
+ premultiplied_alpha, |
+ gfx::PointF(0.0f, 0.0f), // uv_top_left |
+ gfx::PointF(1.0f, 1.0f), // uv_bottom_right |
+ background_color, |
+ vertex_opacity, |
+ false, // flipped |
+ false); // nearest_neighbor |
} |
typedef ::testing::Types<GLRenderer, |
@@ -565,278 +323,6 @@ |
FuzzyPixelOffByOneComparator(true))); |
} |
-template <typename QuadType> |
-static const base::FilePath::CharType* IntersectingQuadImage() { |
- return FILE_PATH_LITERAL("intersecting_blue_green_squares.png"); |
-} |
-template <> |
-const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() { |
- return FILE_PATH_LITERAL("intersecting_blue_green.png"); |
-} |
-template <> |
-const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() { |
- return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png"); |
-} |
- |
-template <typename TypeParam> |
-class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> { |
- protected: |
- void SetupQuadStateAndRenderPass() { |
- // This sets up a pair of draw quads. They are both rotated |
- // relative to the root plane, they are also rotated relative to each other. |
- // The intersect in the middle at a non-perpendicular angle so that any |
- // errors are hopefully magnified. |
- // The quads should intersect correctly, as in the front quad should only |
- // be partially in front of the back quad, and partially behind. |
- |
- viewport_rect_ = gfx::Rect(this->device_viewport_size_); |
- quad_rect_ = gfx::Rect(0, 0, this->device_viewport_size_.width(), |
- this->device_viewport_size_.height() / 2.0); |
- |
- RenderPassId id(1, 1); |
- render_pass_ = CreateTestRootRenderPass(id, viewport_rect_); |
- |
- // Create the front quad rotated on the Z and Y axis. |
- gfx::Transform trans; |
- trans.Translate3d(0, 0, 0.707 * this->device_viewport_size_.width() / 2.0); |
- trans.RotateAboutZAxis(45.0); |
- trans.RotateAboutYAxis(45.0); |
- front_quad_state_ = |
- CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); |
- front_quad_state_->clip_rect = quad_rect_; |
- // Make sure they end up in a 3d sorting context. |
- front_quad_state_->sorting_context_id = 1; |
- |
- // Create the back quad, and rotate on just the y axis. This will intersect |
- // the first quad partially. |
- trans = gfx::Transform(); |
- trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0); |
- trans.RotateAboutYAxis(-45.0); |
- back_quad_state_ = |
- CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); |
- back_quad_state_->sorting_context_id = 1; |
- back_quad_state_->clip_rect = quad_rect_; |
- } |
- template <typename T> |
- void AppendBackgroundAndRunTest(const PixelComparator& comparator) { |
- SharedQuadState* background_quad_state = CreateTestSharedQuadState( |
- gfx::Transform(), viewport_rect_, render_pass_.get()); |
- SolidColorDrawQuad* background_quad = |
- render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
- background_quad->SetNew(background_quad_state, viewport_rect_, |
- viewport_rect_, SK_ColorWHITE, false); |
- pass_list_.push_back(render_pass_.Pass()); |
- const base::FilePath::CharType* fileName = IntersectingQuadImage<T>(); |
- EXPECT_TRUE( |
- this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator)); |
- } |
- template <typename T> |
- T* CreateAndAppendDrawQuad() { |
- return render_pass_->CreateAndAppendDrawQuad<T>(); |
- } |
- |
- scoped_ptr<RenderPass> render_pass_; |
- gfx::Rect viewport_rect_; |
- SharedQuadState* front_quad_state_; |
- SharedQuadState* back_quad_state_; |
- gfx::Rect quad_rect_; |
- RenderPassList pass_list_; |
-}; |
- |
-template <typename TypeParam> |
-class IntersectingQuadGLPixelTest |
- : public IntersectingQuadPixelTest<TypeParam> { |
- public: |
- void SetUp() override { |
- IntersectingQuadPixelTest<TypeParam>::SetUp(); |
- video_resource_updater_.reset( |
- new VideoResourceUpdater(this->output_surface_->context_provider(), |
- this->resource_provider_.get())); |
- video_resource_updater2_.reset( |
- new VideoResourceUpdater(this->output_surface_->context_provider(), |
- this->resource_provider_.get())); |
- } |
- |
- protected: |
- scoped_ptr<VideoResourceUpdater> video_resource_updater_; |
- scoped_ptr<VideoResourceUpdater> video_resource_updater2_; |
-}; |
- |
-template <typename TypeParam> |
-class IntersectingQuadSoftwareTest |
- : public IntersectingQuadPixelTest<TypeParam> {}; |
- |
-typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> |
- SoftwareRendererTypes; |
-typedef ::testing::Types<GLRenderer, GLRendererWithExpandedViewport> |
- GLRendererTypes; |
- |
-TYPED_TEST_CASE(IntersectingQuadPixelTest, RendererTypes); |
-TYPED_TEST_CASE(IntersectingQuadGLPixelTest, GLRendererTypes); |
-TYPED_TEST_CASE(IntersectingQuadSoftwareTest, SoftwareRendererTypes); |
- |
-TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) { |
- this->SetupQuadStateAndRenderPass(); |
- |
- SolidColorDrawQuad* quad = |
- this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
- SolidColorDrawQuad* quad2 = |
- this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
- |
- quad->SetNew(this->front_quad_state_, this->quad_rect_, this->quad_rect_, |
- SK_ColorBLUE, false); |
- quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_, |
- SK_ColorGREEN, false); |
- SCOPED_TRACE("IntersectingSolidColorQuads"); |
- this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>( |
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
-} |
- |
-template <typename TypeParam> |
-SkColor GetColor(const SkColor& color) { |
- return color; |
-} |
- |
-template <> |
-SkColor GetColor<GLRenderer>(const SkColor& color) { |
- return SkColorSetARGB(SkColorGetA(color), SkColorGetB(color), |
- SkColorGetG(color), SkColorGetR(color)); |
-} |
-template <> |
-SkColor GetColor<GLRendererWithExpandedViewport>(const SkColor& color) { |
- return GetColor<GLRenderer>(color); |
-} |
- |
-TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) { |
- this->SetupQuadStateAndRenderPass(); |
- CreateTestTwoColoredTextureDrawQuad( |
- this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), |
- GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT, |
- true, this->front_quad_state_, this->resource_provider_.get(), |
- this->render_pass_.get()); |
- CreateTestTwoColoredTextureDrawQuad( |
- this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)), |
- GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT, |
- true, this->back_quad_state_, this->resource_provider_.get(), |
- this->render_pass_.get()); |
- |
- SCOPED_TRACE("IntersectingTexturedQuads"); |
- this->template AppendBackgroundAndRunTest<TextureDrawQuad>( |
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
-} |
- |
-TYPED_TEST(IntersectingQuadSoftwareTest, PictureQuads) { |
- this->SetupQuadStateAndRenderPass(); |
- gfx::RectF outer_rect(this->quad_rect_); |
- gfx::RectF inner_rect(this->quad_rect_.x() + (this->quad_rect_.width() / 4), |
- this->quad_rect_.y() + (this->quad_rect_.height() / 4), |
- this->quad_rect_.width() / 2, |
- this->quad_rect_.height() / 2); |
- |
- SkPaint black_paint; |
- black_paint.setColor(SK_ColorBLACK); |
- SkPaint blue_paint; |
- blue_paint.setColor(SK_ColorBLUE); |
- SkPaint green_paint; |
- green_paint.setColor(SK_ColorGREEN); |
- |
- scoped_ptr<FakePicturePile> blue_recording = |
- FakePicturePile::CreateFilledPile(gfx::Size(1000, 1000), |
- this->quad_rect_.size()); |
- blue_recording->add_draw_rect_with_paint(outer_rect, black_paint); |
- blue_recording->add_draw_rect_with_paint(inner_rect, blue_paint); |
- blue_recording->RerecordPile(); |
- scoped_refptr<FakePicturePileImpl> blue_pile = |
- FakePicturePileImpl::CreateFromPile(blue_recording.get(), nullptr); |
- |
- PictureDrawQuad* blue_quad = |
- this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>(); |
- |
- blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(), |
- this->quad_rect_, this->quad_rect_, this->quad_rect_.size(), |
- false, RGBA_8888, this->quad_rect_, 1.f, blue_pile); |
- |
- scoped_ptr<FakePicturePile> green_recording = |
- FakePicturePile::CreateFilledPile(this->quad_rect_.size(), |
- this->quad_rect_.size()); |
- green_recording->add_draw_rect_with_paint(outer_rect, green_paint); |
- green_recording->add_draw_rect_with_paint(inner_rect, black_paint); |
- green_recording->RerecordPile(); |
- scoped_refptr<FakePicturePileImpl> green_pile = |
- FakePicturePileImpl::CreateFromPile(green_recording.get(), nullptr); |
- |
- PictureDrawQuad* green_quad = |
- this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>(); |
- green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(), |
- this->quad_rect_, this->quad_rect_, |
- this->quad_rect_.size(), false, RGBA_8888, |
- this->quad_rect_, 1.f, green_pile); |
- SCOPED_TRACE("IntersectingPictureQuadsPass"); |
- this->template AppendBackgroundAndRunTest<PictureDrawQuad>( |
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
-} |
- |
-TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) { |
- this->SetupQuadStateAndRenderPass(); |
- RenderPassId child_pass_id1(2, 2); |
- RenderPassId child_pass_id2(2, 3); |
- scoped_ptr<RenderPass> child_pass1 = |
- CreateTestRenderPass(child_pass_id1, this->quad_rect_, gfx::Transform()); |
- SharedQuadState* child1_quad_state = CreateTestSharedQuadState( |
- gfx::Transform(), this->quad_rect_, child_pass1.get()); |
- scoped_ptr<RenderPass> child_pass2 = |
- CreateTestRenderPass(child_pass_id2, this->quad_rect_, gfx::Transform()); |
- SharedQuadState* child2_quad_state = CreateTestSharedQuadState( |
- gfx::Transform(), this->quad_rect_, child_pass2.get()); |
- |
- CreateTestTwoColoredTextureDrawQuad( |
- this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), |
- GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT, |
- true, child1_quad_state, this->resource_provider_.get(), |
- child_pass1.get()); |
- CreateTestTwoColoredTextureDrawQuad( |
- this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)), |
- GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT, |
- true, child2_quad_state, this->resource_provider_.get(), |
- child_pass2.get()); |
- |
- CreateTestRenderPassDrawQuad(this->front_quad_state_, this->quad_rect_, |
- child_pass_id1, this->render_pass_.get()); |
- CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_, |
- child_pass_id2, this->render_pass_.get()); |
- |
- this->pass_list_.push_back(child_pass1.Pass()); |
- this->pass_list_.push_back(child_pass2.Pass()); |
- SCOPED_TRACE("IntersectingRenderQuadsPass"); |
- this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>( |
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
-} |
- |
-TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) { |
- this->SetupQuadStateAndRenderPass(); |
- gfx::Rect inner_rect( |
- ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF), |
- ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF), |
- (this->quad_rect_.width() / 2) & ~0xF, |
- (this->quad_rect_.height() / 2) & ~0xF); |
- |
- CreateTestYUVVideoDrawQuad_TwoColor( |
- this->front_quad_state_, media::VideoFrame::YV12J, false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128, |
- inner_rect, 29, 255, 107, this->render_pass_.get(), |
- this->video_resource_updater_.get(), this->resource_provider_.get()); |
- |
- CreateTestYUVVideoDrawQuad_TwoColor( |
- this->back_quad_state_, media::VideoFrame::YV12J, false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21, |
- inner_rect, 0, 128, 128, this->render_pass_.get(), |
- this->video_resource_updater2_.get(), this->resource_provider_.get()); |
- |
- SCOPED_TRACE("IntersectingVideoQuads"); |
- this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( |
- FuzzyPixelOffByOneComparator(false)); |
-} |
- |
// TODO(skaslev): The software renderer does not support non-premultplied alpha. |
TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { |
gfx::Rect rect(this->device_viewport_size_); |
@@ -904,6 +390,80 @@ |
class VideoGLRendererPixelTest : public GLRendererPixelTest { |
protected: |
+ void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState* shared_state, |
+ media::VideoFrame::Format format, |
+ bool is_transparent, |
+ const gfx::RectF& tex_coord_rect, |
+ RenderPass* render_pass) { |
+ const gfx::Rect rect(this->device_viewport_size_); |
+ |
+ scoped_refptr<media::VideoFrame> video_frame = |
+ media::VideoFrame::CreateFrame( |
+ format, rect.size(), rect, rect.size(), base::TimeDelta()); |
+ |
+ // YUV values representing a striped pattern, for validating texture |
+ // coordinates for sampling. |
+ uint8_t y_value = 0; |
+ uint8_t u_value = 0; |
+ uint8_t v_value = 0; |
+ for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { |
+ uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) + |
+ video_frame->stride(media::VideoFrame::kYPlane) * i; |
+ for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane); |
+ ++j) { |
+ y_row[j] = (y_value += 1); |
+ } |
+ } |
+ for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) { |
+ uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) + |
+ video_frame->stride(media::VideoFrame::kUPlane) * i; |
+ uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) + |
+ video_frame->stride(media::VideoFrame::kVPlane) * i; |
+ for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); |
+ ++j) { |
+ u_row[j] = (u_value += 3); |
+ v_row[j] = (v_value += 5); |
+ } |
+ } |
+ uint8 alpha_value = is_transparent ? 0 : 128; |
+ CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ shared_state, video_frame, alpha_value, tex_coord_rect, render_pass); |
+ } |
+ |
+ void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState* shared_state, |
+ media::VideoFrame::Format format, |
+ bool is_transparent, |
+ const gfx::RectF& tex_coord_rect, |
+ uint8 y, |
+ uint8 u, |
+ uint8 v, |
+ RenderPass* render_pass) { |
+ const gfx::Rect rect(this->device_viewport_size_); |
+ |
+ scoped_refptr<media::VideoFrame> video_frame = |
+ media::VideoFrame::CreateFrame( |
+ format, rect.size(), rect, rect.size(), base::TimeDelta()); |
+ |
+ // YUV values of a solid, constant, color. Useful for testing that color |
+ // space/color range are being handled properly. |
+ memset(video_frame->data(media::VideoFrame::kYPlane), |
+ y, |
+ video_frame->stride(media::VideoFrame::kYPlane) * |
+ video_frame->rows(media::VideoFrame::kYPlane)); |
+ memset(video_frame->data(media::VideoFrame::kUPlane), |
+ u, |
+ video_frame->stride(media::VideoFrame::kUPlane) * |
+ video_frame->rows(media::VideoFrame::kUPlane)); |
+ memset(video_frame->data(media::VideoFrame::kVPlane), |
+ v, |
+ video_frame->stride(media::VideoFrame::kVPlane) * |
+ video_frame->rows(media::VideoFrame::kVPlane)); |
+ |
+ uint8 alpha_value = is_transparent ? 0 : 128; |
+ CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ shared_state, video_frame, alpha_value, tex_coord_rect, render_pass); |
+ } |
+ |
void CreateEdgeBleedPass(media::VideoFrame::Format format, |
RenderPassList* pass_list) { |
gfx::Rect rect(200, 200); |
@@ -932,11 +492,130 @@ |
// green sub-rectangle that should be the only thing displayed in |
// the final image. Bleeding will appear on all four sides of the video |
// if the tex coords are not clamped. |
- CreateTestYUVVideoDrawQuad_TwoColor( |
- shared_state, format, false, tex_coord_rect, background_size, 0, 0, 0, |
- green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(), |
- resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_TwoColor(shared_state, format, false, |
+ tex_coord_rect, background_size, 0, 0, |
+ 0, green_rect, 149, 43, 21, pass.get()); |
pass_list->push_back(pass.Pass()); |
+ } |
+ |
+ // Creates a video frame of size background_size filled with yuv_background, |
+ // and then draws a foreground rectangle in a different color on top of |
+ // that. The foreground rectangle must have coordinates that are divisible |
+ // by 2 because YUV is a block format. |
+ void CreateTestYUVVideoDrawQuad_TwoColor(const SharedQuadState* shared_state, |
+ media::VideoFrame::Format format, |
+ bool is_transparent, |
+ const gfx::RectF& tex_coord_rect, |
+ const gfx::Size& background_size, |
+ uint8 y_background, |
+ uint8 u_background, |
+ uint8 v_background, |
+ const gfx::Rect& foreground_rect, |
+ uint8 y_foreground, |
+ uint8 u_foreground, |
+ uint8 v_foreground, |
+ RenderPass* render_pass) { |
+ const gfx::Rect rect(background_size); |
+ |
+ scoped_refptr<media::VideoFrame> video_frame = |
+ media::VideoFrame::CreateFrame(format, background_size, foreground_rect, |
+ foreground_rect.size(), |
+ base::TimeDelta()); |
+ |
+ int planes[] = {media::VideoFrame::kYPlane, |
+ media::VideoFrame::kUPlane, |
+ media::VideoFrame::kVPlane}; |
+ uint8 yuv_background[] = {y_background, u_background, v_background}; |
+ uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground}; |
+ int sample_size[] = {1, 2, 2}; |
+ |
+ for (int i = 0; i < 3; ++i) { |
+ memset(video_frame->data(planes[i]), yuv_background[i], |
+ video_frame->stride(planes[i]) * video_frame->rows(planes[i])); |
+ } |
+ |
+ for (int i = 0; i < 3; ++i) { |
+ // Since yuv encoding uses block encoding, widths have to be divisible |
+ // by the sample size in order for this function to behave properly. |
+ DCHECK_EQ(foreground_rect.x() % sample_size[i], 0); |
+ DCHECK_EQ(foreground_rect.y() % sample_size[i], 0); |
+ DCHECK_EQ(foreground_rect.width() % sample_size[i], 0); |
+ DCHECK_EQ(foreground_rect.height() % sample_size[i], 0); |
+ |
+ gfx::Rect sample_rect(foreground_rect.x() / sample_size[i], |
+ foreground_rect.y() / sample_size[i], |
+ foreground_rect.width() / sample_size[i], |
+ foreground_rect.height() / sample_size[i]); |
+ for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) { |
+ for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { |
+ size_t offset = y * video_frame->stride(planes[i]) + x; |
+ video_frame->data(planes[i])[offset] = yuv_foreground[i]; |
+ } |
+ } |
+ } |
+ |
+ uint8 alpha_value = 255; |
+ CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ shared_state, video_frame, alpha_value, tex_coord_rect, render_pass); |
+ } |
+ |
+ void CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ const SharedQuadState* shared_state, |
+ scoped_refptr<media::VideoFrame> video_frame, |
+ uint8 alpha_value, |
+ const gfx::RectF& tex_coord_rect, |
+ RenderPass* render_pass) { |
+ const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A); |
+ const YUVVideoDrawQuad::ColorSpace color_space = |
+ (video_frame->format() == media::VideoFrame::YV12J |
+ ? YUVVideoDrawQuad::JPEG |
+ : YUVVideoDrawQuad::REC_601); |
+ const gfx::Rect rect(shared_state->content_bounds); |
+ const gfx::Rect opaque_rect(0, 0, 0, 0); |
+ |
+ if (with_alpha) |
+ memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, |
+ video_frame->stride(media::VideoFrame::kAPlane) * |
+ video_frame->rows(media::VideoFrame::kAPlane)); |
+ |
+ VideoFrameExternalResources resources = |
+ video_resource_updater_->CreateExternalResourcesFromVideoFrame( |
+ video_frame); |
+ |
+ EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
+ EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
+ resources.mailboxes.size()); |
+ EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
+ resources.release_callbacks.size()); |
+ |
+ ResourceProvider::ResourceId y_resource = |
+ resource_provider_->CreateResourceFromTextureMailbox( |
+ resources.mailboxes[media::VideoFrame::kYPlane], |
+ SingleReleaseCallbackImpl::Create( |
+ resources.release_callbacks[media::VideoFrame::kYPlane])); |
+ ResourceProvider::ResourceId u_resource = |
+ resource_provider_->CreateResourceFromTextureMailbox( |
+ resources.mailboxes[media::VideoFrame::kUPlane], |
+ SingleReleaseCallbackImpl::Create( |
+ resources.release_callbacks[media::VideoFrame::kUPlane])); |
+ ResourceProvider::ResourceId v_resource = |
+ resource_provider_->CreateResourceFromTextureMailbox( |
+ resources.mailboxes[media::VideoFrame::kVPlane], |
+ SingleReleaseCallbackImpl::Create( |
+ resources.release_callbacks[media::VideoFrame::kVPlane])); |
+ ResourceProvider::ResourceId a_resource = 0; |
+ if (with_alpha) { |
+ a_resource = resource_provider_->CreateResourceFromTextureMailbox( |
+ resources.mailboxes[media::VideoFrame::kAPlane], |
+ SingleReleaseCallbackImpl::Create( |
+ resources.release_callbacks[media::VideoFrame::kAPlane])); |
+ } |
+ |
+ YUVVideoDrawQuad* yuv_quad = |
+ render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
+ yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect, |
+ video_frame->coded_size(), y_resource, u_resource, |
+ v_resource, a_resource, color_space); |
} |
void SetUp() override { |
@@ -945,6 +624,7 @@ |
output_surface_->context_provider(), resource_provider_.get())); |
} |
+ private: |
scoped_ptr<VideoResourceUpdater> video_resource_updater_; |
}; |
@@ -957,10 +637,11 @@ |
SharedQuadState* shared_state = |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
- CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12, |
- false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
- pass.get(), video_resource_updater_.get(), |
- rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state, |
+ media::VideoFrame::YV12, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ pass.get()); |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
@@ -981,10 +662,11 @@ |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
// Intentionally sets frame format to I420 for testing coverage. |
- CreateTestYUVVideoDrawQuad_Striped( |
- shared_state, media::VideoFrame::I420, false, |
- gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(), |
- video_resource_updater_.get(), rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state, |
+ media::VideoFrame::I420, |
+ false, |
+ gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), |
+ pass.get()); |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
@@ -1005,10 +687,14 @@ |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
// In MPEG color range YUV values of (15,128,128) should produce black. |
- CreateTestYUVVideoDrawQuad_Solid( |
- shared_state, media::VideoFrame::YV12, false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(), |
- video_resource_updater_.get(), rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Solid(shared_state, |
+ media::VideoFrame::YV12, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ 15, |
+ 128, |
+ 128, |
+ pass.get()); |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
@@ -1030,10 +716,14 @@ |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
// YUV of (149,43,21) should be green (0,255,0) in RGB. |
- CreateTestYUVVideoDrawQuad_Solid( |
- shared_state, media::VideoFrame::YV12J, false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), |
- video_resource_updater_.get(), rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Solid(shared_state, |
+ media::VideoFrame::YV12J, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ 149, |
+ 43, |
+ 21, |
+ pass.get()); |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
@@ -1071,10 +761,14 @@ |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
// Dark grey in JPEG color range (in MPEG, this is black). |
- CreateTestYUVVideoDrawQuad_Solid( |
- shared_state, media::VideoFrame::YV12J, false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(), |
- video_resource_updater_.get(), rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Solid(shared_state, |
+ media::VideoFrame::YV12J, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ 15, |
+ 128, |
+ 128, |
+ pass.get()); |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
@@ -1094,10 +788,11 @@ |
SharedQuadState* shared_state = |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
- CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A, |
- false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
- pass.get(), video_resource_updater_.get(), |
- rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state, |
+ media::VideoFrame::YV12A, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ pass.get()); |
SolidColorDrawQuad* color_quad = |
pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
@@ -1121,10 +816,11 @@ |
SharedQuadState* shared_state = |
CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
- CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A, |
- true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
- pass.get(), video_resource_updater_.get(), |
- rect, resource_provider_.get()); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state, |
+ media::VideoFrame::YV12A, |
+ true, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ pass.get()); |
SolidColorDrawQuad* color_quad = |
pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |