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

Unified Diff: cc/output/overlay_unittest.cc

Issue 2736643004: Add DCLayerOverlayProcessor and supporting DCLayer structures. (Closed)
Patch Set: Created 3 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 side-by-side diff with in-line comments
Download patch
Index: cc/output/overlay_unittest.cc
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
index d36d1db3ab95e42094fe61cdde3ab68f1e7b7e0e..433f36470ab9731f3b0fd8c7480f5126122b12bd 100644
--- a/cc/output/overlay_unittest.cc
+++ b/cc/output/overlay_unittest.cc
@@ -73,6 +73,7 @@ class FullscreenOverlayValidator : public OverlayCandidateValidator {
strategies->push_back(base::MakeUnique<OverlayStrategyFullscreen>(this));
}
bool AllowCALayerOverlays() override { return false; }
+ bool AllowDCLayerOverlays() override { return false; }
void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
};
@@ -85,6 +86,7 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
}
bool AllowCALayerOverlays() override { return false; }
+ bool AllowDCLayerOverlays() override { return false; }
void CheckOverlaySupport(OverlayCandidateList* surfaces) override {
// We may have 1 or 2 surfaces depending on whether this ran through the
// full renderer and picked up the output surface, or not.
@@ -118,6 +120,15 @@ class CALayerValidator : public OverlayCandidateValidator {
public:
void GetStrategies(OverlayProcessor::StrategyList* strategies) override {}
bool AllowCALayerOverlays() override { return true; }
+ bool AllowDCLayerOverlays() override { return false; }
+ void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
+};
+
+class DCLayerValidator : public OverlayCandidateValidator {
+ public:
+ void GetStrategies(OverlayProcessor::StrategyList* strategies) override {}
+ bool AllowCALayerOverlays() override { return false; }
+ bool AllowDCLayerOverlays() override { return true; }
void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
};
@@ -321,6 +332,28 @@ StreamVideoDrawQuad* CreateFullscreenCandidateVideoQuad(
transform);
}
+YUVVideoDrawQuad* CreateFullscreenCandidateYUVVideoQuad(
+ ResourceProvider* resource_provider,
+ const SharedQuadState* shared_quad_state,
+ RenderPass* render_pass) {
+ gfx::RectF tex_coord_rect(0, 0, 1, 1);
+ gfx::Rect rect = render_pass->output_rect;
+ gfx::Size resource_size_in_pixels = rect.size();
+ bool is_overlay_candidate = true;
+ ResourceId resource_id = CreateResource(
+ resource_provider, resource_size_in_pixels, is_overlay_candidate);
+
+ YUVVideoDrawQuad* overlay_quad =
+ render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
+ overlay_quad->SetNew(shared_quad_state, rect, rect, rect, tex_coord_rect,
+ tex_coord_rect, resource_size_in_pixels,
+ resource_size_in_pixels, resource_id, resource_id,
+ resource_id, resource_id, YUVVideoDrawQuad::REC_601,
+ gfx::ColorSpace(), 0, 1.0, 8);
+
+ return overlay_quad;
+}
+
void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
const SharedQuadState* shared_quad_state,
RenderPass* render_pass,
@@ -414,6 +447,7 @@ using SingleOverlayOnTopTest = OverlayTest<SingleOnTopOverlayValidator>;
using UnderlayTest = OverlayTest<UnderlayOverlayValidator>;
using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>;
using CALayerOverlayTest = OverlayTest<CALayerValidator>;
+using DCLayerOverlayTest = OverlayTest<DCLayerValidator>;
TEST(OverlayTest, NoOverlaysByDefault) {
scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
@@ -1639,6 +1673,116 @@ TEST_F(CALayerOverlayTest, SkipTransparent) {
EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
}
+TEST_F(DCLayerOverlayTest, AllowNonAxisAlignedTransform) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+ pass->shared_quad_state_list.back()
+ ->quad_to_target_transform.RotateAboutZAxis(45.f);
+
+ gfx::Rect damage_rect;
+ CALayerOverlayList ca_layer_list;
+ OverlayCandidateList overlay_list;
+ RenderPassFilterList render_pass_filters;
+ RenderPassFilterList render_pass_background_filters;
+ damage_rect_ = gfx::Rect(1, 1, 10, 10);
+ overlay_processor_->ProcessForOverlays(
+ resource_provider_.get(), pass.get(), render_pass_filters,
+ render_pass_background_filters, &overlay_list, &ca_layer_list,
+ &damage_rect_, &content_bounds_);
+ EXPECT_EQ(gfx::Rect(), damage_rect);
+ EXPECT_EQ(0U, overlay_list.size());
+ EXPECT_EQ(1U, ca_layer_list.size());
+ EXPECT_EQ(1U, ca_layer_list.back().shared_state->sorting_context_id);
+ EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
+ EXPECT_EQ(gfx::Rect(1, 1, 10, 10), damage_rect_);
+}
+
+TEST_F(DCLayerOverlayTest, Occluded) {
+ {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ gfx::Rect(0, 2, 100, 100), SK_ColorWHITE);
+ CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+
+ gfx::Rect damage_rect;
+ CALayerOverlayList ca_layer_list;
+ OverlayCandidateList overlay_list;
+ RenderPassFilterList render_pass_filters;
+ RenderPassFilterList render_pass_background_filters;
+ damage_rect_ = gfx::Rect(1, 1, 10, 10);
+ overlay_processor_->ProcessForOverlays(
+ resource_provider_.get(), pass.get(), render_pass_filters,
+ render_pass_background_filters, &overlay_list, &ca_layer_list,
+ &damage_rect_, &content_bounds_);
+ EXPECT_EQ(gfx::Rect(), damage_rect);
+ EXPECT_EQ(0U, overlay_list.size());
+ EXPECT_EQ(1U, ca_layer_list.size());
+ EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
+ EXPECT_EQ(static_cast<unsigned>(-1),
+ ca_layer_list.back().shared_state->sorting_context_id);
+ // Entire underlay rect must be redrawn.
+ EXPECT_EQ(gfx::Rect(0, 0, 256, 256), damage_rect_);
+ }
+ {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ gfx::Rect(2, 2, 100, 100), SK_ColorWHITE);
+ CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+
+ gfx::Rect damage_rect;
+ CALayerOverlayList ca_layer_list;
+ OverlayCandidateList overlay_list;
+ RenderPassFilterList render_pass_filters;
+ RenderPassFilterList render_pass_background_filters;
+ damage_rect_ = gfx::Rect(1, 1, 10, 10);
+ overlay_processor_->ProcessForOverlays(
+ resource_provider_.get(), pass.get(), render_pass_filters,
+ render_pass_background_filters, &overlay_list, &ca_layer_list,
+ &damage_rect_, &content_bounds_);
+ EXPECT_EQ(gfx::Rect(), damage_rect);
+ EXPECT_EQ(0U, overlay_list.size());
+ EXPECT_EQ(1U, ca_layer_list.size());
+ EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
+ EXPECT_EQ(static_cast<unsigned>(-1),
+ ca_layer_list.back().shared_state->sorting_context_id);
+ // The underlay rectangle is the same, so the damage is contained within
+ // the combined occluding rects for this and the last frame.
+ EXPECT_EQ(gfx::Rect(1, 2, 10, 9), damage_rect_);
+ }
+}
+
+TEST_F(DCLayerOverlayTest, DamageRect) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+
+ gfx::Rect damage_rect;
+ CALayerOverlayList ca_layer_list;
+ OverlayCandidateList overlay_list;
+ RenderPassFilterList render_pass_filters;
+ RenderPassFilterList render_pass_background_filters;
+ damage_rect_ = gfx::Rect(1, 1, 10, 10);
+ overlay_processor_->ProcessForOverlays(
+ resource_provider_.get(), pass.get(), render_pass_filters,
+ render_pass_background_filters, &overlay_list, &ca_layer_list,
+ &damage_rect_, &content_bounds_);
+ EXPECT_EQ(gfx::Rect(), damage_rect);
+ EXPECT_EQ(0U, overlay_list.size());
+ EXPECT_EQ(1U, ca_layer_list.size());
+ EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
+ EXPECT_EQ(1U, ca_layer_list.back().shared_state->sorting_context_id);
+ EXPECT_TRUE(damage_rect_.IsEmpty());
+}
+
class OverlayInfoRendererGL : public GLRenderer {
public:
OverlayInfoRendererGL(const RendererSettings* settings,

Powered by Google App Engine
This is Rietveld 408576698