diff options
author | achaulk <achaulk@chromium.org> | 2015-02-03 11:43:09 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-03 19:45:34 +0000 |
commit | ae133cc32ae1bdb971b13f531dd50d07430a113b (patch) | |
tree | 96442532a6ba179b7a6f194f587d0809256a33c1 /cc | |
parent | 75be556f6fc83ffdac88fd6ec12f846018aa8d2b (diff) | |
download | chromium_src-ae133cc32ae1bdb971b13f531dd50d07430a113b.zip chromium_src-ae133cc32ae1bdb971b13f531dd50d07430a113b.tar.gz chromium_src-ae133cc32ae1bdb971b13f531dd50d07430a113b.tar.bz2 |
cc: Change the restrictions on overlays for video
- Allow positively scaled transformations. Overlay hardware can handle this
- Allow the STREAM_VIDEO_QUAD type. Tests added for that type
TEST=manual test, video in overlay
Review URL: https://codereview.chromium.org/855403002
Cr-Commit-Position: refs/heads/master@{#314387}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/output/overlay_candidate.cc | 100 | ||||
-rw-r--r-- | cc/output/overlay_candidate.h | 4 | ||||
-rw-r--r-- | cc/output/overlay_strategy_single_on_top.cc | 131 | ||||
-rw-r--r-- | cc/output/overlay_strategy_single_on_top.h | 11 | ||||
-rw-r--r-- | cc/output/overlay_unittest.cc | 145 |
5 files changed, 360 insertions, 31 deletions
diff --git a/cc/output/overlay_candidate.cc b/cc/output/overlay_candidate.cc index 4168253..46c3a7d 100644 --- a/cc/output/overlay_candidate.cc +++ b/cc/output/overlay_candidate.cc @@ -24,7 +24,7 @@ OverlayCandidate::~OverlayCandidate() {} gfx::OverlayTransform OverlayCandidate::GetOverlayTransform( const gfx::Transform& quad_transform, bool flipped) { - if (!quad_transform.IsIdentityOrTranslation()) + if (!quad_transform.IsPositiveScaleOrTranslation()) return gfx::OVERLAY_TRANSFORM_INVALID; return flipped ? gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL @@ -32,9 +32,105 @@ gfx::OverlayTransform OverlayCandidate::GetOverlayTransform( } // static +gfx::OverlayTransform OverlayCandidate::ModifyTransform( + gfx::OverlayTransform in, + gfx::OverlayTransform delta) { + // There are 8 different possible transforms. We can characterize these + // by looking at where the origin moves and the direction the horizontal goes. + // (TL=top-left, BR=bottom-right, H=horizontal, V=vertical). + // NONE: TL, H + // FLIP_VERTICAL: BL, H + // FLIP_HORIZONTAL: TR, H + // ROTATE_90: TR, V + // ROTATE_180: BR, H + // ROTATE_270: BL, V + // Missing transforms: TL, V & BR, V + // Basic combinations: + // Flip X & Y -> Rotate 180 (TL,H -> TR,H -> BR,H or TL,H -> BL,H -> BR,H) + // Flip X or Y + Rotate 180 -> other flip (eg, TL,H -> TR,H -> BL,H) + // Rotate + Rotate simply adds values. + // Rotate 90/270 + flip is invalid because we can only have verticals with + // the origin in TR or BL. + if (delta == gfx::OVERLAY_TRANSFORM_NONE) + return in; + switch (in) { + case gfx::OVERLAY_TRANSFORM_NONE: + return delta; + case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: + switch (delta) { + case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: + return gfx::OVERLAY_TRANSFORM_NONE; + case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: + return gfx::OVERLAY_TRANSFORM_ROTATE_180; + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL; + default: + return gfx::OVERLAY_TRANSFORM_INVALID; + } + break; + case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: + switch (delta) { + case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: + return gfx::OVERLAY_TRANSFORM_NONE; + case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: + return gfx::OVERLAY_TRANSFORM_ROTATE_180; + case gfx::OVERLAY_TRANSFORM_ROTATE_90: + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; + case gfx::OVERLAY_TRANSFORM_ROTATE_270: + default: + return gfx::OVERLAY_TRANSFORM_INVALID; + } + break; + case gfx::OVERLAY_TRANSFORM_ROTATE_90: + switch (delta) { + case gfx::OVERLAY_TRANSFORM_ROTATE_90: + return gfx::OVERLAY_TRANSFORM_ROTATE_180; + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + return gfx::OVERLAY_TRANSFORM_ROTATE_270; + case gfx::OVERLAY_TRANSFORM_ROTATE_270: + return gfx::OVERLAY_TRANSFORM_NONE; + default: + return gfx::OVERLAY_TRANSFORM_INVALID; + } + break; + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + switch (delta) { + case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: + return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; + case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: + return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL; + case gfx::OVERLAY_TRANSFORM_ROTATE_90: + return gfx::OVERLAY_TRANSFORM_ROTATE_270; + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + return gfx::OVERLAY_TRANSFORM_NONE; + case gfx::OVERLAY_TRANSFORM_ROTATE_270: + return gfx::OVERLAY_TRANSFORM_ROTATE_90; + default: + return gfx::OVERLAY_TRANSFORM_INVALID; + } + break; + case gfx::OVERLAY_TRANSFORM_ROTATE_270: + switch (delta) { + case gfx::OVERLAY_TRANSFORM_ROTATE_90: + return gfx::OVERLAY_TRANSFORM_NONE; + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + return gfx::OVERLAY_TRANSFORM_ROTATE_90; + case gfx::OVERLAY_TRANSFORM_ROTATE_270: + return gfx::OVERLAY_TRANSFORM_ROTATE_180; + default: + return gfx::OVERLAY_TRANSFORM_INVALID; + } + break; + default: + return gfx::OVERLAY_TRANSFORM_INVALID; + } +} + +// static gfx::Rect OverlayCandidate::GetOverlayRect(const gfx::Transform& quad_transform, const gfx::Rect& rect) { - DCHECK(quad_transform.IsIdentityOrTranslation()); + DCHECK(quad_transform.IsPositiveScaleOrTranslation()); gfx::RectF float_rect(rect); quad_transform.TransformRect(&float_rect); diff --git a/cc/output/overlay_candidate.h b/cc/output/overlay_candidate.h index 9a1e534..28ae8cb 100644 --- a/cc/output/overlay_candidate.h +++ b/cc/output/overlay_candidate.h @@ -20,6 +20,10 @@ class CC_EXPORT OverlayCandidate { static gfx::OverlayTransform GetOverlayTransform( const gfx::Transform& quad_transform, bool flipped); + // Apply transform |delta| to |in| and return the resulting transform, + // or OVERLAY_TRANSFORM_INVALID. + static gfx::OverlayTransform ModifyTransform(gfx::OverlayTransform in, + gfx::OverlayTransform delta); static gfx::Rect GetOverlayRect(const gfx::Transform& quad_transform, const gfx::Rect& rect); diff --git a/cc/output/overlay_strategy_single_on_top.cc b/cc/output/overlay_strategy_single_on_top.cc index 98d77ad..9a95206 100644 --- a/cc/output/overlay_strategy_single_on_top.cc +++ b/cc/output/overlay_strategy_single_on_top.cc @@ -4,8 +4,13 @@ #include "cc/output/overlay_strategy_single_on_top.h" +#include <limits> + #include "cc/quads/draw_quad.h" +#include "cc/quads/solid_color_draw_quad.h" +#include "cc/quads/stream_video_draw_quad.h" #include "cc/quads/texture_draw_quad.h" +#include "ui/gfx/geometry/point3_f.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/transform.h" @@ -17,6 +22,103 @@ OverlayStrategySingleOnTop::OverlayStrategySingleOnTop( : capability_checker_(capability_checker), resource_provider_(resource_provider) {} +bool OverlayStrategySingleOnTop::IsOverlayQuad(const DrawQuad* draw_quad) { + unsigned int resource_id; + switch (draw_quad->material) { + case DrawQuad::TEXTURE_CONTENT: + resource_id = TextureDrawQuad::MaterialCast(draw_quad)->resource_id; + break; + case DrawQuad::STREAM_VIDEO_CONTENT: + resource_id = StreamVideoDrawQuad::MaterialCast(draw_quad)->resource_id; + break; + default: + return false; + } + return resource_provider_->AllowOverlay(resource_id); +} + +bool OverlayStrategySingleOnTop::GetTextureQuadInfo( + const TextureDrawQuad& quad, + OverlayCandidate* quad_info) { + gfx::OverlayTransform overlay_transform = + OverlayCandidate::GetOverlayTransform(quad.quadTransform(), quad.flipped); + if (quad.background_color != SK_ColorTRANSPARENT || + quad.premultiplied_alpha || + overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) + return false; + quad_info->resource_id = quad.resource_id; + quad_info->transform = overlay_transform; + quad_info->uv_rect = BoundingRect(quad.uv_top_left, quad.uv_bottom_right); + return true; +} + +bool OverlayStrategySingleOnTop::GetVideoQuadInfo( + const StreamVideoDrawQuad& quad, + OverlayCandidate* quad_info) { + gfx::OverlayTransform overlay_transform = + OverlayCandidate::GetOverlayTransform(quad.quadTransform(), false); + if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) + return false; + if (!quad.matrix.IsScaleOrTranslation()) { + // We cannot handle anything other than scaling & translation for texture + // coordinates yet. + return false; + } + quad_info->resource_id = quad.resource_id; + quad_info->transform = overlay_transform; + + gfx::Point3F uv0 = gfx::Point3F(0, 0, 0); + gfx::Point3F uv1 = gfx::Point3F(1, 1, 0); + quad.matrix.TransformPoint(&uv0); + quad.matrix.TransformPoint(&uv1); + gfx::Vector3dF delta = uv1 - uv0; + if (delta.x() < 0) { + quad_info->transform = OverlayCandidate::ModifyTransform( + quad_info->transform, gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL); + float x0 = uv0.x(); + uv0.set_x(uv1.x()); + uv1.set_x(x0); + delta.set_x(-delta.x()); + } + + if (delta.y() < 0) { + // In this situation, uv0y < uv1y. Since we overlay inverted, a request + // to invert the source texture means we can just output the texture + // normally and it will be correct. + quad_info->uv_rect = gfx::RectF(uv0.x(), uv1.y(), delta.x(), -delta.y()); + } else { + quad_info->transform = OverlayCandidate::ModifyTransform( + quad_info->transform, gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL); + quad_info->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); + } + return true; +} + +bool OverlayStrategySingleOnTop::GetCandidateQuadInfo( + const DrawQuad& draw_quad, + OverlayCandidate* quad_info) { + // All quad checks. + if (draw_quad.needs_blending || draw_quad.shared_quad_state->opacity != 1.f || + draw_quad.shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) + return false; + + if (draw_quad.material == DrawQuad::TEXTURE_CONTENT) { + const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(&draw_quad); + if (!GetTextureQuadInfo(quad, quad_info)) + return false; + } else if (draw_quad.material == DrawQuad::STREAM_VIDEO_CONTENT) { + const StreamVideoDrawQuad& quad = + *StreamVideoDrawQuad::MaterialCast(&draw_quad); + if (!GetVideoQuadInfo(quad, quad_info)) + return false; + } + + quad_info->format = RGBA_8888; + quad_info->display_rect = OverlayCandidate::GetOverlayRect( + draw_quad.quadTransform(), draw_quad.rect); + return true; +} + bool OverlayStrategySingleOnTop::Attempt( RenderPassList* render_passes_in_draw_order, OverlayCandidateList* candidate_list) { @@ -27,15 +129,12 @@ bool OverlayStrategySingleOnTop::Attempt( RenderPass* root_render_pass = render_passes_in_draw_order->back(); DCHECK(root_render_pass); + OverlayCandidate candidate; QuadList& quad_list = root_render_pass->quad_list; auto candidate_iterator = quad_list.end(); for (auto it = quad_list.begin(); it != quad_list.end(); ++it) { const DrawQuad* draw_quad = *it; - if (draw_quad->material == DrawQuad::TEXTURE_CONTENT) { - const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(draw_quad); - if (!resource_provider_->AllowOverlay(quad.resource_id)) { - continue; - } + if (IsOverlayQuad(draw_quad)) { // Check that no prior quads overlap it. bool intersects = false; gfx::RectF rect = draw_quad->rect; @@ -49,7 +148,7 @@ bool OverlayStrategySingleOnTop::Attempt( break; } } - if (intersects) + if (intersects || !GetCandidateQuadInfo(*draw_quad, &candidate)) continue; candidate_iterator = it; break; @@ -57,34 +156,14 @@ bool OverlayStrategySingleOnTop::Attempt( } if (candidate_iterator == quad_list.end()) return false; - const TextureDrawQuad& quad = - *TextureDrawQuad::MaterialCast(*candidate_iterator); - - // Simple quads only. - gfx::OverlayTransform overlay_transform = - OverlayCandidate::GetOverlayTransform(quad.quadTransform(), quad.flipped); - if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID || - !quad.quadTransform().IsIdentityOrTranslation() || quad.needs_blending || - quad.shared_quad_state->opacity != 1.f || - quad.shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode || - quad.premultiplied_alpha || quad.background_color != SK_ColorTRANSPARENT) - return false; // Add our primary surface. OverlayCandidateList candidates; OverlayCandidate main_image; main_image.display_rect = root_render_pass->output_rect; - main_image.format = RGBA_8888; candidates.push_back(main_image); // Add the overlay. - OverlayCandidate candidate; - candidate.transform = overlay_transform; - candidate.display_rect = - OverlayCandidate::GetOverlayRect(quad.quadTransform(), quad.rect); - candidate.uv_rect = BoundingRect(quad.uv_top_left, quad.uv_bottom_right); - candidate.format = RGBA_8888; - candidate.resource_id = quad.resource_id; candidate.plane_z_order = 1; candidates.push_back(candidate); diff --git a/cc/output/overlay_strategy_single_on_top.h b/cc/output/overlay_strategy_single_on_top.h index e5518cc..f92e104 100644 --- a/cc/output/overlay_strategy_single_on_top.h +++ b/cc/output/overlay_strategy_single_on_top.h @@ -14,6 +14,8 @@ namespace cc { class OverlayCandidateValidator; +class StreamVideoDrawQuad; +class TextureDrawQuad; class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy { public: @@ -23,6 +25,15 @@ class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy { OverlayCandidateList* candidate_list) override; private: + bool IsOverlayQuad(const DrawQuad* draw_quad); + bool GetCandidateQuadInfo(const DrawQuad& draw_quad, + OverlayCandidate* quad_info); + + bool GetTextureQuadInfo(const TextureDrawQuad& quad, + OverlayCandidate* quad_info); + bool GetVideoQuadInfo(const StreamVideoDrawQuad& quad, + OverlayCandidate* quad_info); + OverlayCandidateValidator* capability_checker_; ResourceProvider* resource_provider_; DISALLOW_COPY_AND_ASSIGN(OverlayStrategySingleOnTop); diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc index 8fa35cb..4682679 100644 --- a/cc/output/overlay_unittest.cc +++ b/cc/output/overlay_unittest.cc @@ -11,6 +11,7 @@ #include "cc/output/overlay_strategy_single_on_top.h" #include "cc/quads/checkerboard_draw_quad.h" #include "cc/quads/render_pass.h" +#include "cc/quads/stream_video_draw_quad.h" #include "cc/quads/texture_draw_quad.h" #include "cc/resources/resource_provider.h" #include "cc/resources/texture_mailbox.h" @@ -32,6 +33,16 @@ const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64); const gfx::PointF kUVTopLeft(0.1f, 0.2f); const gfx::PointF kUVBottomRight(1.0f, 1.0f); +const gfx::Transform kNormalTransform = + gfx::Transform(0.9f, 0, 0, 0.8f, 0.1f, 0.2f); // x,y -> x,y. +const gfx::Transform kXMirrorTransform = + gfx::Transform(-0.9f, 0, 0, 0.8f, 1.0f, 0.2f); // x,y -> 1-x,y. +const gfx::Transform kYMirrorTransform = + gfx::Transform(0.9f, 0, 0, -0.8f, 0.1f, 1.0f); // x,y -> x,1-y. +const gfx::Transform kBothMirrorTransform = + gfx::Transform(-0.9f, 0, 0, -0.8f, 1.0f, 1.0f); // x,y -> 1-x,1-y. +const gfx::Transform kSwapTransform = + gfx::Transform(0, 1, 1, 0, 0, 0); // x,y -> y,x. void MailboxReleased(unsigned sync_point, bool lost_resource, @@ -173,6 +184,22 @@ TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider, return overlay_quad; } +StreamVideoDrawQuad* CreateCandidateVideoQuadAt( + ResourceProvider* resource_provider, + const SharedQuadState* shared_quad_state, + RenderPass* render_pass, + const gfx::Rect& rect, + const gfx::Transform& transform) { + ResourceProvider::ResourceId resource_id = CreateResource(resource_provider); + + StreamVideoDrawQuad* overlay_quad = + render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); + overlay_quad->SetNew(shared_quad_state, rect, rect, rect, resource_id, + transform); + + return overlay_quad; +} + TextureDrawQuad* CreateFullscreenCandidateQuad( ResourceProvider* resource_provider, const SharedQuadState* shared_quad_state, @@ -181,6 +208,15 @@ TextureDrawQuad* CreateFullscreenCandidateQuad( resource_provider, shared_quad_state, render_pass, kOverlayRect); } +StreamVideoDrawQuad* CreateFullscreenCandidateVideoQuad( + ResourceProvider* resource_provider, + const SharedQuadState* shared_quad_state, + RenderPass* render_pass, + const gfx::Transform& transform) { + return CreateCandidateVideoQuadAt(resource_provider, shared_quad_state, + render_pass, kOverlayRect, transform); +} + void CreateCheckeredQuadAt(ResourceProvider* resource_provider, const SharedQuadState* shared_quad_state, RenderPass* render_pass, @@ -484,13 +520,13 @@ TEST_F(SingleOverlayOnTopTest, RejectOpacity) { EXPECT_EQ(0U, candidate_list.size()); } -TEST_F(SingleOverlayOnTopTest, RejectTransform) { +TEST_F(SingleOverlayOnTopTest, RejectNonScaleTransform) { scoped_ptr<RenderPass> pass = CreateRenderPass(); CreateFullscreenCandidateQuad(resource_provider_.get(), pass->shared_quad_state_list.back(), pass.get()); - pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, - 2.f); + pass->shared_quad_state_list.back() + ->content_to_target_transform.RotateAboutXAxis(45.f); RenderPassList pass_list; pass_list.push_back(pass.Pass()); @@ -500,6 +536,39 @@ TEST_F(SingleOverlayOnTopTest, RejectTransform) { EXPECT_EQ(0U, candidate_list.size()); } +TEST_F(SingleOverlayOnTopTest, RejectNegativeScaleTransform) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, + -1.0f); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(0U, candidate_list.size()); +} + +TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { + gfx::Rect rect = kOverlayRect; + rect.set_width(rect.width() / 2); + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateCandidateQuadAt(resource_provider_.get(), + pass->shared_quad_state_list.back(), pass.get(), rect); + pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, + 1.0f); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(2U, candidate_list.size()); +} + TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { scoped_ptr<RenderPass> pass = CreateRenderPass(); CreateCheckeredQuadAt(resource_provider_.get(), @@ -523,6 +592,76 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { EXPECT_EQ(2U, candidate_list.size()); } +TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateVideoQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get(), kSwapTransform); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(0U, candidate_list.size()); +} + +TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateVideoQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get(), kXMirrorTransform); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(2U, candidate_list.size()); +} + +TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateVideoQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get(), kBothMirrorTransform); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(2U, candidate_list.size()); +} + +TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateVideoQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get(), kNormalTransform); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(2U, candidate_list.size()); +} + +TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateVideoQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get(), kYMirrorTransform); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + OverlayCandidateList candidate_list; + overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); + ASSERT_EQ(1U, pass_list.size()); + EXPECT_EQ(2U, candidate_list.size()); +} + class OverlayInfoRendererGL : public GLRenderer { public: OverlayInfoRendererGL(RendererClient* client, |