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

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

Issue 2693023002: Use SwapBuffersWithBounds on Chromecast (Closed)
Patch Set: danakj nits 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "cc/base/region.h" 11 #include "cc/base/region.h"
12 #include "cc/output/ca_layer_overlay.h" 12 #include "cc/output/ca_layer_overlay.h"
13 #include "cc/output/filter_operation.h" 13 #include "cc/output/filter_operation.h"
14 #include "cc/output/gl_renderer.h" 14 #include "cc/output/gl_renderer.h"
15 #include "cc/output/output_surface.h" 15 #include "cc/output/output_surface.h"
16 #include "cc/output/output_surface_client.h" 16 #include "cc/output/output_surface_client.h"
17 #include "cc/output/output_surface_frame.h" 17 #include "cc/output/output_surface_frame.h"
18 #include "cc/output/overlay_candidate_validator.h" 18 #include "cc/output/overlay_candidate_validator.h"
19 #include "cc/output/overlay_processor.h" 19 #include "cc/output/overlay_processor.h"
20 #include "cc/output/overlay_strategy_fullscreen.h" 20 #include "cc/output/overlay_strategy_fullscreen.h"
21 #include "cc/output/overlay_strategy_single_on_top.h" 21 #include "cc/output/overlay_strategy_single_on_top.h"
22 #include "cc/output/overlay_strategy_underlay.h" 22 #include "cc/output/overlay_strategy_underlay.h"
23 #include "cc/output/overlay_strategy_underlay_cast.h"
23 #include "cc/quads/render_pass.h" 24 #include "cc/quads/render_pass.h"
24 #include "cc/quads/render_pass_draw_quad.h" 25 #include "cc/quads/render_pass_draw_quad.h"
25 #include "cc/quads/solid_color_draw_quad.h" 26 #include "cc/quads/solid_color_draw_quad.h"
26 #include "cc/quads/stream_video_draw_quad.h" 27 #include "cc/quads/stream_video_draw_quad.h"
27 #include "cc/quads/texture_draw_quad.h" 28 #include "cc/quads/texture_draw_quad.h"
28 #include "cc/resources/resource_provider.h" 29 #include "cc/resources/resource_provider.h"
29 #include "cc/resources/texture_mailbox.h" 30 #include "cc/resources/texture_mailbox.h"
30 #include "cc/test/fake_output_surface_client.h" 31 #include "cc/test/fake_output_surface_client.h"
31 #include "cc/test/fake_resource_provider.h" 32 #include "cc/test/fake_resource_provider.h"
32 #include "cc/test/geometry_test_utils.h" 33 #include "cc/test/geometry_test_utils.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 public: 71 public:
71 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { 72 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
72 strategies->push_back(base::MakeUnique<OverlayStrategyFullscreen>(this)); 73 strategies->push_back(base::MakeUnique<OverlayStrategyFullscreen>(this));
73 } 74 }
74 bool AllowCALayerOverlays() override { return false; } 75 bool AllowCALayerOverlays() override { return false; }
75 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} 76 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
76 }; 77 };
77 78
78 class SingleOverlayValidator : public OverlayCandidateValidator { 79 class SingleOverlayValidator : public OverlayCandidateValidator {
79 public: 80 public:
81 SingleOverlayValidator() : expected_rect_(kOverlayRect) {}
82
80 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { 83 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
81 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this)); 84 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this));
82 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this)); 85 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
83 } 86 }
84 bool AllowCALayerOverlays() override { return false; } 87 bool AllowCALayerOverlays() override { return false; }
85 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { 88 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {
86 // We may have 1 or 2 surfaces depending on whether this ran through the 89 // We may have 1 or 2 surfaces depending on whether this ran through the
87 // full renderer and picked up the output surface, or not. 90 // full renderer and picked up the output surface, or not.
88 ASSERT_LE(1U, surfaces->size()); 91 ASSERT_LE(1U, surfaces->size());
89 ASSERT_GE(2U, surfaces->size()); 92 ASSERT_GE(2U, surfaces->size());
90 93
91 OverlayCandidate& candidate = surfaces->back(); 94 OverlayCandidate& candidate = surfaces->back();
92 EXPECT_TRUE(!candidate.use_output_surface_for_resource); 95 EXPECT_TRUE(!candidate.use_output_surface_for_resource);
93 if (candidate.display_rect.width() == kOverlayBottomRightRect.width()) { 96 EXPECT_NEAR(expected_rect_.x(), candidate.display_rect.x(), 0.01f);
94 EXPECT_EQ(gfx::RectF(kOverlayBottomRightRect), candidate.display_rect); 97 EXPECT_NEAR(expected_rect_.y(), candidate.display_rect.y(), 0.01f);
95 } else { 98 EXPECT_NEAR(expected_rect_.width(), candidate.display_rect.width(), 0.01f);
96 EXPECT_NEAR(kOverlayRect.x(), candidate.display_rect.x(), 0.01f); 99 EXPECT_NEAR(expected_rect_.height(), candidate.display_rect.height(),
97 EXPECT_NEAR(kOverlayRect.y(), candidate.display_rect.y(), 0.01f); 100 0.01f);
98 EXPECT_NEAR(kOverlayRect.width(), candidate.display_rect.width(), 0.01f); 101
99 EXPECT_NEAR(kOverlayRect.height(), candidate.display_rect.height(),
100 0.01f);
101 }
102 EXPECT_FLOAT_RECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight), 102 EXPECT_FLOAT_RECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight),
103 candidate.uv_rect); 103 candidate.uv_rect);
104 if (!candidate.clip_rect.IsEmpty()) { 104 if (!candidate.clip_rect.IsEmpty()) {
105 EXPECT_EQ(true, candidate.is_clipped); 105 EXPECT_EQ(true, candidate.is_clipped);
106 EXPECT_EQ(kOverlayClipRect, candidate.clip_rect); 106 EXPECT_EQ(kOverlayClipRect, candidate.clip_rect);
107 } 107 }
108 candidate.overlay_handled = true; 108 candidate.overlay_handled = true;
109 } 109 }
110
111 void SetExpectedRect(const gfx::RectF& rect) { expected_rect_ = rect; }
112
113 private:
114 gfx::RectF expected_rect_;
110 }; 115 };
111 116
112 class CALayerValidator : public OverlayCandidateValidator { 117 class CALayerValidator : public OverlayCandidateValidator {
113 public: 118 public:
114 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {} 119 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {}
115 bool AllowCALayerOverlays() override { return true; } 120 bool AllowCALayerOverlays() override { return true; }
116 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} 121 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
117 }; 122 };
118 123
119 class SingleOnTopOverlayValidator : public SingleOverlayValidator { 124 class SingleOnTopOverlayValidator : public SingleOverlayValidator {
120 public: 125 public:
121 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { 126 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
122 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this)); 127 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this));
123 } 128 }
124 }; 129 };
125 130
126 class UnderlayOverlayValidator : public SingleOverlayValidator { 131 class UnderlayOverlayValidator : public SingleOverlayValidator {
127 public: 132 public:
128 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { 133 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
129 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this)); 134 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
130 } 135 }
131 }; 136 };
132 137
138 class UnderlayCastOverlayValidator : public SingleOverlayValidator {
139 public:
140 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
141 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlayCast>(this));
142 }
143 };
144
133 class DefaultOverlayProcessor : public OverlayProcessor { 145 class DefaultOverlayProcessor : public OverlayProcessor {
134 public: 146 public:
135 explicit DefaultOverlayProcessor(OutputSurface* surface); 147 explicit DefaultOverlayProcessor(OutputSurface* surface);
136 size_t GetStrategyCount(); 148 size_t GetStrategyCount();
137 }; 149 };
138 150
139 DefaultOverlayProcessor::DefaultOverlayProcessor(OutputSurface* surface) 151 DefaultOverlayProcessor::DefaultOverlayProcessor(OutputSurface* surface)
140 : OverlayProcessor(surface) { 152 : OverlayProcessor(surface) {
141 } 153 }
142 154
143 size_t DefaultOverlayProcessor::GetStrategyCount() { 155 size_t DefaultOverlayProcessor::GetStrategyCount() {
144 return strategies_.size(); 156 return strategies_.size();
145 } 157 }
146 158
159 template <typename OverlayCandidateValidatorType>
147 class OverlayOutputSurface : public OutputSurface { 160 class OverlayOutputSurface : public OutputSurface {
148 public: 161 public:
149 explicit OverlayOutputSurface( 162 explicit OverlayOutputSurface(
150 scoped_refptr<TestContextProvider> context_provider) 163 scoped_refptr<TestContextProvider> context_provider)
151 : OutputSurface(std::move(context_provider)) { 164 : OutputSurface(std::move(context_provider)) {
152 is_displayed_as_overlay_plane_ = true; 165 is_displayed_as_overlay_plane_ = true;
153 } 166 }
154 167
155 // OutputSurface implementation. 168 // OutputSurface implementation.
156 void BindToClient(OutputSurfaceClient* client) override {} 169 void BindToClient(OutputSurfaceClient* client) override {}
157 void EnsureBackbuffer() override {} 170 void EnsureBackbuffer() override {}
158 void DiscardBackbuffer() override {} 171 void DiscardBackbuffer() override {}
159 void BindFramebuffer() override { 172 void BindFramebuffer() override {
160 bind_framebuffer_count_ += 1; 173 bind_framebuffer_count_ += 1;
161 } 174 }
162 void Reshape(const gfx::Size& size, 175 void Reshape(const gfx::Size& size,
163 float device_scale_factor, 176 float device_scale_factor,
164 const gfx::ColorSpace& color_space, 177 const gfx::ColorSpace& color_space,
165 bool has_alpha, 178 bool has_alpha,
166 bool use_stencil) override {} 179 bool use_stencil) override {}
167 void SwapBuffers(OutputSurfaceFrame frame) override {} 180 void SwapBuffers(OutputSurfaceFrame frame) override {}
168 uint32_t GetFramebufferCopyTextureFormat() override { 181 uint32_t GetFramebufferCopyTextureFormat() override {
169 // TestContextProvider has no real framebuffer, just use RGB. 182 // TestContextProvider has no real framebuffer, just use RGB.
170 return GL_RGB; 183 return GL_RGB;
171 } 184 }
172 bool HasExternalStencilTest() const override { return false; } 185 bool HasExternalStencilTest() const override { return false; }
173 void ApplyExternalStencil() override {} 186 void ApplyExternalStencil() override {}
174 OverlayCandidateValidator* GetOverlayCandidateValidator() const override { 187 OverlayCandidateValidatorType* GetOverlayCandidateValidator() const override {
175 return overlay_candidate_validator_.get(); 188 return overlay_candidate_validator_.get();
176 } 189 }
177 bool IsDisplayedAsOverlayPlane() const override { 190 bool IsDisplayedAsOverlayPlane() const override {
178 return is_displayed_as_overlay_plane_; 191 return is_displayed_as_overlay_plane_;
179 } 192 }
180 unsigned GetOverlayTextureId() const override { return 10000; } 193 unsigned GetOverlayTextureId() const override { return 10000; }
181 bool SurfaceIsSuspendForRecycle() const override { return false; } 194 bool SurfaceIsSuspendForRecycle() const override { return false; }
182 195
183 void set_is_displayed_as_overlay_plane(bool value) { 196 void set_is_displayed_as_overlay_plane(bool value) {
184 is_displayed_as_overlay_plane_ = value; 197 is_displayed_as_overlay_plane_ = value;
185 } 198 }
186 199
187 void SetOverlayCandidateValidator(OverlayCandidateValidator* validator) { 200 void SetOverlayCandidateValidator(OverlayCandidateValidatorType* validator) {
188 overlay_candidate_validator_.reset(validator); 201 overlay_candidate_validator_.reset(validator);
189 } 202 }
190 203
191 unsigned bind_framebuffer_count() const { return bind_framebuffer_count_; } 204 unsigned bind_framebuffer_count() const { return bind_framebuffer_count_; }
192 205
193 private: 206 private:
194 std::unique_ptr<OverlayCandidateValidator> overlay_candidate_validator_; 207 std::unique_ptr<OverlayCandidateValidatorType> overlay_candidate_validator_;
195 bool is_displayed_as_overlay_plane_; 208 bool is_displayed_as_overlay_plane_;
196 unsigned bind_framebuffer_count_ = 0; 209 unsigned bind_framebuffer_count_ = 0;
197 }; 210 };
198 211
199 std::unique_ptr<RenderPass> CreateRenderPass() { 212 std::unique_ptr<RenderPass> CreateRenderPass() {
200 int render_pass_id = 1; 213 int render_pass_id = 1;
201 gfx::Rect output_rect(0, 0, 256, 256); 214 gfx::Rect output_rect(0, 0, 256, 256);
202 215
203 std::unique_ptr<RenderPass> pass = RenderPass::Create(); 216 std::unique_ptr<RenderPass> pass = RenderPass::Create();
204 pass->SetNew(render_pass_id, output_rect, output_rect, gfx::Transform()); 217 pass->SetNew(render_pass_id, output_rect, output_rect, gfx::Transform());
205 218
206 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 219 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
207 shared_state->opacity = 1.f; 220 shared_state->opacity = 1.f;
208 return pass; 221 return pass;
209 } 222 }
210 223
224 std::unique_ptr<RenderPass> CreateRenderPassWithTransform(
225 const gfx::Transform& transform) {
226 int render_pass_id = 1;
227 gfx::Rect output_rect(0, 0, 256, 256);
228
229 std::unique_ptr<RenderPass> pass = RenderPass::Create();
230 pass->SetNew(render_pass_id, output_rect, output_rect, gfx::Transform());
231
232 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
233 shared_state->opacity = 1.f;
234 shared_state->quad_to_target_transform = transform;
235 return pass;
236 }
237
211 ResourceId CreateResource(ResourceProvider* resource_provider, 238 ResourceId CreateResource(ResourceProvider* resource_provider,
212 const gfx::Size& size, 239 const gfx::Size& size,
213 bool is_overlay_candidate) { 240 bool is_overlay_candidate) {
214 TextureMailbox mailbox = 241 TextureMailbox mailbox =
215 TextureMailbox(gpu::Mailbox::Generate(), gpu::SyncToken(), GL_TEXTURE_2D, 242 TextureMailbox(gpu::Mailbox::Generate(), gpu::SyncToken(), GL_TEXTURE_2D,
216 size, is_overlay_candidate, false); 243 size, is_overlay_candidate, false);
217 std::unique_ptr<SingleReleaseCallbackImpl> release_callback = 244 std::unique_ptr<SingleReleaseCallbackImpl> release_callback =
218 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); 245 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased));
219 246
220 return resource_provider->CreateResourceFromTextureMailbox( 247 return resource_provider->CreateResourceFromTextureMailbox(
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 322
296 void CreateOpaqueQuadAt(ResourceProvider* resource_provider, 323 void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
297 const SharedQuadState* shared_quad_state, 324 const SharedQuadState* shared_quad_state,
298 RenderPass* render_pass, 325 RenderPass* render_pass,
299 const gfx::Rect& rect) { 326 const gfx::Rect& rect) {
300 SolidColorDrawQuad* color_quad = 327 SolidColorDrawQuad* color_quad =
301 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 328 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
302 color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false); 329 color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false);
303 } 330 }
304 331
332 void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
333 const SharedQuadState* shared_quad_state,
334 RenderPass* render_pass,
335 const gfx::Rect& rect,
336 SkColor color) {
337 DCHECK_EQ(255u, SkColorGetA(color));
338 SolidColorDrawQuad* color_quad =
339 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
340 color_quad->SetNew(shared_quad_state, rect, rect, color, false);
341 }
342
305 void CreateFullscreenOpaqueQuad(ResourceProvider* resource_provider, 343 void CreateFullscreenOpaqueQuad(ResourceProvider* resource_provider,
306 const SharedQuadState* shared_quad_state, 344 const SharedQuadState* shared_quad_state,
307 RenderPass* render_pass) { 345 RenderPass* render_pass) {
308 CreateOpaqueQuadAt(resource_provider, shared_quad_state, render_pass, 346 CreateOpaqueQuadAt(resource_provider, shared_quad_state, render_pass,
309 render_pass->output_rect); 347 render_pass->output_rect);
310 } 348 }
311 349
312 static void CompareRenderPassLists(const RenderPassList& expected_list, 350 static void CompareRenderPassLists(const RenderPassList& expected_list,
313 const RenderPassList& actual_list) { 351 const RenderPassList& actual_list) {
314 EXPECT_EQ(expected_list.size(), actual_list.size()); 352 EXPECT_EQ(expected_list.size(), actual_list.size());
(...skipping 19 matching lines...) Expand all
334 ++exp_iter, ++act_iter) { 372 ++exp_iter, ++act_iter) {
335 EXPECT_EQ(exp_iter->rect.ToString(), act_iter->rect.ToString()); 373 EXPECT_EQ(exp_iter->rect.ToString(), act_iter->rect.ToString());
336 EXPECT_EQ(exp_iter->shared_quad_state->quad_layer_bounds.ToString(), 374 EXPECT_EQ(exp_iter->shared_quad_state->quad_layer_bounds.ToString(),
337 act_iter->shared_quad_state->quad_layer_bounds.ToString()); 375 act_iter->shared_quad_state->quad_layer_bounds.ToString());
338 } 376 }
339 } 377 }
340 } 378 }
341 379
342 template <typename OverlayCandidateValidatorType> 380 template <typename OverlayCandidateValidatorType>
343 class OverlayTest : public testing::Test { 381 class OverlayTest : public testing::Test {
382 using OutputSurfaceType = OverlayOutputSurface<OverlayCandidateValidatorType>;
383
344 protected: 384 protected:
345 void SetUp() override { 385 void SetUp() override {
346 provider_ = TestContextProvider::Create(); 386 provider_ = TestContextProvider::Create();
347 provider_->BindToCurrentThread(); 387 provider_->BindToCurrentThread();
348 output_surface_.reset(new OverlayOutputSurface(provider_)); 388 output_surface_ = base::MakeUnique<OutputSurfaceType>(provider_);
349 output_surface_->BindToClient(&client_); 389 output_surface_->BindToClient(&client_);
350 output_surface_->SetOverlayCandidateValidator( 390 output_surface_->SetOverlayCandidateValidator(
351 new OverlayCandidateValidatorType); 391 new OverlayCandidateValidatorType);
352 392
353 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 393 shared_bitmap_manager_.reset(new TestSharedBitmapManager());
354 resource_provider_ = FakeResourceProvider::Create( 394 resource_provider_ = FakeResourceProvider::Create(
355 provider_.get(), shared_bitmap_manager_.get()); 395 provider_.get(), shared_bitmap_manager_.get());
356 396
357 overlay_processor_.reset(new OverlayProcessor(output_surface_.get())); 397 overlay_processor_.reset(new OverlayProcessor(output_surface_.get()));
358 overlay_processor_->Initialize(); 398 overlay_processor_->Initialize();
359 } 399 }
360 400
361 scoped_refptr<TestContextProvider> provider_; 401 scoped_refptr<TestContextProvider> provider_;
362 std::unique_ptr<OverlayOutputSurface> output_surface_; 402 std::unique_ptr<OutputSurfaceType> output_surface_;
363 FakeOutputSurfaceClient client_; 403 FakeOutputSurfaceClient client_;
364 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; 404 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
365 std::unique_ptr<ResourceProvider> resource_provider_; 405 std::unique_ptr<ResourceProvider> resource_provider_;
366 std::unique_ptr<OverlayProcessor> overlay_processor_; 406 std::unique_ptr<OverlayProcessor> overlay_processor_;
367 gfx::Rect damage_rect_; 407 gfx::Rect damage_rect_;
408 std::vector<gfx::Rect> content_bounds_;
368 }; 409 };
369 410
370 typedef OverlayTest<FullscreenOverlayValidator> FullscreenOverlayTest; 411 using FullscreenOverlayTest = OverlayTest<FullscreenOverlayValidator>;
371 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest; 412 using SingleOverlayOnTopTest = OverlayTest<SingleOnTopOverlayValidator>;
372 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest; 413 using UnderlayTest = OverlayTest<UnderlayOverlayValidator>;
373 typedef OverlayTest<CALayerValidator> CALayerOverlayTest; 414 using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>;
415 using CALayerOverlayTest = OverlayTest<CALayerValidator>;
374 416
375 TEST(OverlayTest, NoOverlaysByDefault) { 417 TEST(OverlayTest, NoOverlaysByDefault) {
376 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); 418 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
377 OverlayOutputSurface output_surface(provider); 419 OverlayOutputSurface<OverlayCandidateValidator> output_surface(provider);
378 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator()); 420 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator());
379 421
380 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); 422 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator);
381 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL); 423 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL);
382 } 424 }
383 425
384 TEST(OverlayTest, OverlaysProcessorHasStrategy) { 426 TEST(OverlayTest, OverlaysProcessorHasStrategy) {
385 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); 427 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
386 provider->BindToCurrentThread(); 428 provider->BindToCurrentThread();
387 OverlayOutputSurface output_surface(provider); 429 OverlayOutputSurface<OverlayCandidateValidator> output_surface(provider);
388 FakeOutputSurfaceClient client; 430 FakeOutputSurfaceClient client;
389 output_surface.BindToClient(&client); 431 output_surface.BindToClient(&client);
390 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); 432 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator);
391 433
392 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager( 434 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager(
393 new TestSharedBitmapManager()); 435 new TestSharedBitmapManager());
394 std::unique_ptr<ResourceProvider> resource_provider = 436 std::unique_ptr<ResourceProvider> resource_provider =
395 FakeResourceProvider::Create(provider.get(), shared_bitmap_manager.get()); 437 FakeResourceProvider::Create(provider.get(), shared_bitmap_manager.get());
396 438
397 std::unique_ptr<DefaultOverlayProcessor> overlay_processor( 439 std::unique_ptr<DefaultOverlayProcessor> overlay_processor(
(...skipping 12 matching lines...) Expand all
410 // Add something behind it. 452 // Add something behind it.
411 CreateFullscreenOpaqueQuad(resource_provider_.get(), 453 CreateFullscreenOpaqueQuad(resource_provider_.get(),
412 pass->shared_quad_state_list.back(), pass.get()); 454 pass->shared_quad_state_list.back(), pass.get());
413 455
414 // Check for potential candidates. 456 // Check for potential candidates.
415 OverlayCandidateList candidate_list; 457 OverlayCandidateList candidate_list;
416 RenderPassFilterList render_pass_filters; 458 RenderPassFilterList render_pass_filters;
417 RenderPassFilterList render_pass_background_filters; 459 RenderPassFilterList render_pass_background_filters;
418 overlay_processor_->ProcessForOverlays( 460 overlay_processor_->ProcessForOverlays(
419 resource_provider_.get(), pass.get(), render_pass_filters, 461 resource_provider_.get(), pass.get(), render_pass_filters,
420 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 462 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
463 &content_bounds_);
421 ASSERT_EQ(1U, candidate_list.size()); 464 ASSERT_EQ(1U, candidate_list.size());
422 465
423 RenderPass* main_pass = pass.get(); 466 RenderPass* main_pass = pass.get();
424 // Check that all the quads are gone. 467 // Check that all the quads are gone.
425 EXPECT_EQ(0U, main_pass->quad_list.size()); 468 EXPECT_EQ(0U, main_pass->quad_list.size());
426 // Check that we have only one overlay. 469 // Check that we have only one overlay.
427 EXPECT_EQ(1U, candidate_list.size()); 470 EXPECT_EQ(1U, candidate_list.size());
428 // Check that the right resource id got extracted. 471 // Check that the right resource id got extracted.
429 EXPECT_EQ(original_resource_id, candidate_list.front().resource_id); 472 EXPECT_EQ(original_resource_id, candidate_list.front().resource_id);
430 } 473 }
431 474
432 TEST_F(FullscreenOverlayTest, ResourceSizeInPixelsFail) { 475 TEST_F(FullscreenOverlayTest, ResourceSizeInPixelsFail) {
433 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 476 std::unique_ptr<RenderPass> pass = CreateRenderPass();
434 TextureDrawQuad* original_quad = CreateFullscreenCandidateQuad( 477 TextureDrawQuad* original_quad = CreateFullscreenCandidateQuad(
435 resource_provider_.get(), pass->shared_quad_state_list.back(), 478 resource_provider_.get(), pass->shared_quad_state_list.back(),
436 pass.get()); 479 pass.get());
437 original_quad->set_resource_size_in_pixels(gfx::Size(64, 64)); 480 original_quad->set_resource_size_in_pixels(gfx::Size(64, 64));
438 481
439 // Check for potential candidates. 482 // Check for potential candidates.
440 OverlayCandidateList candidate_list; 483 OverlayCandidateList candidate_list;
441 RenderPassFilterList render_pass_filters; 484 RenderPassFilterList render_pass_filters;
442 RenderPassFilterList render_pass_background_filters; 485 RenderPassFilterList render_pass_background_filters;
443 overlay_processor_->ProcessForOverlays( 486 overlay_processor_->ProcessForOverlays(
444 resource_provider_.get(), pass.get(), render_pass_filters, 487 resource_provider_.get(), pass.get(), render_pass_filters,
445 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 488 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
489 &content_bounds_);
446 ASSERT_EQ(0U, candidate_list.size()); 490 ASSERT_EQ(0U, candidate_list.size());
447 491
448 RenderPass* main_pass = pass.get(); 492 RenderPass* main_pass = pass.get();
449 // Check that the quad is not gone. 493 // Check that the quad is not gone.
450 EXPECT_EQ(1U, main_pass->quad_list.size()); 494 EXPECT_EQ(1U, main_pass->quad_list.size());
451 } 495 }
452 496
453 TEST_F(FullscreenOverlayTest, OnTopFail) { 497 TEST_F(FullscreenOverlayTest, OnTopFail) {
454 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 498 std::unique_ptr<RenderPass> pass = CreateRenderPass();
455 499
456 // Add something in front of it. 500 // Add something in front of it.
457 CreateOpaqueQuadAt(resource_provider_.get(), 501 CreateOpaqueQuadAt(resource_provider_.get(),
458 pass->shared_quad_state_list.back(), pass.get(), 502 pass->shared_quad_state_list.back(), pass.get(),
459 kOverlayTopLeftRect); 503 kOverlayTopLeftRect);
460 504
461 CreateFullscreenCandidateQuad(resource_provider_.get(), 505 CreateFullscreenCandidateQuad(resource_provider_.get(),
462 pass->shared_quad_state_list.back(), 506 pass->shared_quad_state_list.back(),
463 pass.get()); 507 pass.get());
464 508
465 // Check for potential candidates. 509 // Check for potential candidates.
466 OverlayCandidateList candidate_list; 510 OverlayCandidateList candidate_list;
467 RenderPassFilterList render_pass_filters; 511 RenderPassFilterList render_pass_filters;
468 RenderPassFilterList render_pass_background_filters; 512 RenderPassFilterList render_pass_background_filters;
469 overlay_processor_->ProcessForOverlays( 513 overlay_processor_->ProcessForOverlays(
470 resource_provider_.get(), pass.get(), render_pass_filters, 514 resource_provider_.get(), pass.get(), render_pass_filters,
471 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 515 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
516 &content_bounds_);
472 ASSERT_EQ(0U, candidate_list.size()); 517 ASSERT_EQ(0U, candidate_list.size());
473 518
474 RenderPass* main_pass = pass.get(); 519 RenderPass* main_pass = pass.get();
475 // Check that the 2 quads are not gone. 520 // Check that the 2 quads are not gone.
476 EXPECT_EQ(2U, main_pass->quad_list.size()); 521 EXPECT_EQ(2U, main_pass->quad_list.size());
477 } 522 }
478 523
479 TEST_F(FullscreenOverlayTest, NotCoveringFullscreenFail) { 524 TEST_F(FullscreenOverlayTest, NotCoveringFullscreenFail) {
480 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 525 std::unique_ptr<RenderPass> pass = CreateRenderPass();
481 gfx::Rect inset_rect = pass->output_rect; 526 gfx::Rect inset_rect = pass->output_rect;
482 inset_rect.Inset(0, 1, 0, 1); 527 inset_rect.Inset(0, 1, 0, 1);
483 CreateCandidateQuadAt(resource_provider_.get(), 528 CreateCandidateQuadAt(resource_provider_.get(),
484 pass->shared_quad_state_list.back(), pass.get(), 529 pass->shared_quad_state_list.back(), pass.get(),
485 inset_rect); 530 inset_rect);
486 531
487 // Check for potential candidates. 532 // Check for potential candidates.
488 OverlayCandidateList candidate_list; 533 OverlayCandidateList candidate_list;
489 RenderPassFilterList render_pass_filters; 534 RenderPassFilterList render_pass_filters;
490 RenderPassFilterList render_pass_background_filters; 535 RenderPassFilterList render_pass_background_filters;
491 overlay_processor_->ProcessForOverlays( 536 overlay_processor_->ProcessForOverlays(
492 resource_provider_.get(), pass.get(), render_pass_filters, 537 resource_provider_.get(), pass.get(), render_pass_filters,
493 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 538 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
539 &content_bounds_);
494 ASSERT_EQ(0U, candidate_list.size()); 540 ASSERT_EQ(0U, candidate_list.size());
495 541
496 RenderPass* main_pass = pass.get(); 542 RenderPass* main_pass = pass.get();
497 // Check that the quad is not gone. 543 // Check that the quad is not gone.
498 EXPECT_EQ(1U, main_pass->quad_list.size()); 544 EXPECT_EQ(1U, main_pass->quad_list.size());
499 } 545 }
500 546
501 TEST_F(FullscreenOverlayTest, RemoveFullscreenQuadFromQuadList) { 547 TEST_F(FullscreenOverlayTest, RemoveFullscreenQuadFromQuadList) {
502 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 548 std::unique_ptr<RenderPass> pass = CreateRenderPass();
503 549
504 // Add something in front of it that is fully transparent. 550 // Add something in front of it that is fully transparent.
505 pass->shared_quad_state_list.back()->opacity = 0.0f; 551 pass->shared_quad_state_list.back()->opacity = 0.0f;
506 CreateOpaqueQuadAt(resource_provider_.get(), 552 CreateOpaqueQuadAt(resource_provider_.get(),
507 pass->shared_quad_state_list.back(), pass.get(), 553 pass->shared_quad_state_list.back(), pass.get(),
508 kOverlayTopLeftRect); 554 kOverlayTopLeftRect);
509 555
510 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 556 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
511 shared_state->opacity = 1.f; 557 shared_state->opacity = 1.f;
512 CreateFullscreenCandidateQuad(resource_provider_.get(), 558 CreateFullscreenCandidateQuad(resource_provider_.get(),
513 pass->shared_quad_state_list.back(), 559 pass->shared_quad_state_list.back(),
514 pass.get()); 560 pass.get());
515 561
516 // Check for potential candidates. 562 // Check for potential candidates.
517 OverlayCandidateList candidate_list; 563 OverlayCandidateList candidate_list;
518 RenderPassFilterList render_pass_filters; 564 RenderPassFilterList render_pass_filters;
519 RenderPassFilterList render_pass_background_filters; 565 RenderPassFilterList render_pass_background_filters;
520 overlay_processor_->ProcessForOverlays( 566 overlay_processor_->ProcessForOverlays(
521 resource_provider_.get(), pass.get(), render_pass_filters, 567 resource_provider_.get(), pass.get(), render_pass_filters,
522 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 568 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
569 &content_bounds_);
523 ASSERT_EQ(1U, candidate_list.size()); 570 ASSERT_EQ(1U, candidate_list.size());
524 571
525 // Check that the fullscreen quad is gone. 572 // Check that the fullscreen quad is gone.
526 for (const DrawQuad* quad : pass->quad_list) { 573 for (const DrawQuad* quad : pass->quad_list) {
527 EXPECT_NE(pass->output_rect, quad->rect); 574 EXPECT_NE(pass->output_rect, quad->rect);
528 } 575 }
529 } 576 }
530 577
531 TEST_F(SingleOverlayOnTopTest, SuccessfulOverlay) { 578 TEST_F(SingleOverlayOnTopTest, SuccessfulOverlay) {
532 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 579 std::unique_ptr<RenderPass> pass = CreateRenderPass();
533 TextureDrawQuad* original_quad = 580 TextureDrawQuad* original_quad =
534 CreateFullscreenCandidateQuad(resource_provider_.get(), 581 CreateFullscreenCandidateQuad(resource_provider_.get(),
535 pass->shared_quad_state_list.back(), 582 pass->shared_quad_state_list.back(),
536 pass.get()); 583 pass.get());
537 unsigned original_resource_id = original_quad->resource_id(); 584 unsigned original_resource_id = original_quad->resource_id();
538 585
539 // Add something behind it. 586 // Add something behind it.
540 CreateFullscreenOpaqueQuad(resource_provider_.get(), 587 CreateFullscreenOpaqueQuad(resource_provider_.get(),
541 pass->shared_quad_state_list.back(), pass.get()); 588 pass->shared_quad_state_list.back(), pass.get());
542 CreateFullscreenOpaqueQuad(resource_provider_.get(), 589 CreateFullscreenOpaqueQuad(resource_provider_.get(),
543 pass->shared_quad_state_list.back(), pass.get()); 590 pass->shared_quad_state_list.back(), pass.get());
544 591
545 // Check for potential candidates. 592 // Check for potential candidates.
546 OverlayCandidateList candidate_list; 593 OverlayCandidateList candidate_list;
547 RenderPassFilterList render_pass_filters; 594 RenderPassFilterList render_pass_filters;
548 RenderPassFilterList render_pass_background_filters; 595 RenderPassFilterList render_pass_background_filters;
549 overlay_processor_->ProcessForOverlays( 596 overlay_processor_->ProcessForOverlays(
550 resource_provider_.get(), pass.get(), render_pass_filters, 597 resource_provider_.get(), pass.get(), render_pass_filters,
551 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 598 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
599 &content_bounds_);
552 ASSERT_EQ(1U, candidate_list.size()); 600 ASSERT_EQ(1U, candidate_list.size());
553 601
554 RenderPass* main_pass = pass.get(); 602 RenderPass* main_pass = pass.get();
555 // Check that the quad is gone. 603 // Check that the quad is gone.
556 EXPECT_EQ(2U, main_pass->quad_list.size()); 604 EXPECT_EQ(2U, main_pass->quad_list.size());
557 const QuadList& quad_list = main_pass->quad_list; 605 const QuadList& quad_list = main_pass->quad_list;
558 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); 606 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
559 it != quad_list.BackToFrontEnd(); 607 it != quad_list.BackToFrontEnd();
560 ++it) { 608 ++it) {
561 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); 609 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material);
(...skipping 24 matching lines...) Expand all
586 output_surface_plane.display_rect = gfx::RectF(kOverlayRect); 634 output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
587 output_surface_plane.quad_rect_in_target_space = kOverlayRect; 635 output_surface_plane.quad_rect_in_target_space = kOverlayRect;
588 output_surface_plane.use_output_surface_for_resource = true; 636 output_surface_plane.use_output_surface_for_resource = true;
589 output_surface_plane.overlay_handled = true; 637 output_surface_plane.overlay_handled = true;
590 candidate_list.push_back(output_surface_plane); 638 candidate_list.push_back(output_surface_plane);
591 639
592 RenderPassFilterList render_pass_filters; 640 RenderPassFilterList render_pass_filters;
593 RenderPassFilterList render_pass_background_filters; 641 RenderPassFilterList render_pass_background_filters;
594 overlay_processor_->ProcessForOverlays( 642 overlay_processor_->ProcessForOverlays(
595 resource_provider_.get(), pass.get(), render_pass_filters, 643 resource_provider_.get(), pass.get(), render_pass_filters,
596 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 644 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
645 &content_bounds_);
597 DCHECK(damage_rect_.IsEmpty()); 646 DCHECK(damage_rect_.IsEmpty());
598 } 647 }
599 648
600 TEST_F(SingleOverlayOnTopTest, NoCandidates) { 649 TEST_F(SingleOverlayOnTopTest, NoCandidates) {
601 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 650 std::unique_ptr<RenderPass> pass = CreateRenderPass();
602 CreateFullscreenOpaqueQuad(resource_provider_.get(), 651 CreateFullscreenOpaqueQuad(resource_provider_.get(),
603 pass->shared_quad_state_list.back(), pass.get()); 652 pass->shared_quad_state_list.back(), pass.get());
604 CreateFullscreenOpaqueQuad(resource_provider_.get(), 653 CreateFullscreenOpaqueQuad(resource_provider_.get(),
605 pass->shared_quad_state_list.back(), pass.get()); 654 pass->shared_quad_state_list.back(), pass.get());
606 655
607 RenderPassList pass_list; 656 RenderPassList pass_list;
608 pass_list.push_back(std::move(pass)); 657 pass_list.push_back(std::move(pass));
609 658
610 RenderPassList original_pass_list; 659 RenderPassList original_pass_list;
611 RenderPass::CopyAll(pass_list, &original_pass_list); 660 RenderPass::CopyAll(pass_list, &original_pass_list);
612 661
613 OverlayCandidateList candidate_list; 662 OverlayCandidateList candidate_list;
614 RenderPassFilterList render_pass_filters; 663 RenderPassFilterList render_pass_filters;
615 RenderPassFilterList render_pass_background_filters; 664 RenderPassFilterList render_pass_background_filters;
616 overlay_processor_->ProcessForOverlays( 665 overlay_processor_->ProcessForOverlays(
617 resource_provider_.get(), pass_list.back().get(), render_pass_filters, 666 resource_provider_.get(), pass_list.back().get(), render_pass_filters,
618 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 667 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
668 &content_bounds_);
619 EXPECT_EQ(0U, candidate_list.size()); 669 EXPECT_EQ(0U, candidate_list.size());
620 // There should be nothing new here. 670 // There should be nothing new here.
621 CompareRenderPassLists(pass_list, original_pass_list); 671 CompareRenderPassLists(pass_list, original_pass_list);
622 } 672 }
623 673
624 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { 674 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
625 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 675 std::unique_ptr<RenderPass> pass = CreateRenderPass();
626 CreateFullscreenOpaqueQuad(resource_provider_.get(), 676 CreateFullscreenOpaqueQuad(resource_provider_.get(),
627 pass->shared_quad_state_list.back(), pass.get()); 677 pass->shared_quad_state_list.back(), pass.get());
628 CreateFullscreenOpaqueQuad(resource_provider_.get(), 678 CreateFullscreenOpaqueQuad(resource_provider_.get(),
629 pass->shared_quad_state_list.back(), pass.get()); 679 pass->shared_quad_state_list.back(), pass.get());
630 680
631 CreateFullscreenCandidateQuad(resource_provider_.get(), 681 CreateFullscreenCandidateQuad(resource_provider_.get(),
632 pass->shared_quad_state_list.back(), 682 pass->shared_quad_state_list.back(),
633 pass.get()); 683 pass.get());
634 684
635 RenderPassList pass_list; 685 RenderPassList pass_list;
636 pass_list.push_back(std::move(pass)); 686 pass_list.push_back(std::move(pass));
637 687
638 RenderPassList original_pass_list; 688 RenderPassList original_pass_list;
639 RenderPass::CopyAll(pass_list, &original_pass_list); 689 RenderPass::CopyAll(pass_list, &original_pass_list);
640 690
641 OverlayCandidateList candidate_list; 691 OverlayCandidateList candidate_list;
642 RenderPassFilterList render_pass_filters; 692 RenderPassFilterList render_pass_filters;
643 RenderPassFilterList render_pass_background_filters; 693 RenderPassFilterList render_pass_background_filters;
644 overlay_processor_->ProcessForOverlays( 694 overlay_processor_->ProcessForOverlays(
645 resource_provider_.get(), pass_list.back().get(), render_pass_filters, 695 resource_provider_.get(), pass_list.back().get(), render_pass_filters,
646 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 696 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
697 &content_bounds_);
647 EXPECT_EQ(0U, candidate_list.size()); 698 EXPECT_EQ(0U, candidate_list.size());
648 // There should be nothing new here. 699 // There should be nothing new here.
649 CompareRenderPassLists(pass_list, original_pass_list); 700 CompareRenderPassLists(pass_list, original_pass_list);
650 } 701 }
651 702
652 // Test with multiple render passes. 703 // Test with multiple render passes.
653 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { 704 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
654 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 705 std::unique_ptr<RenderPass> pass = CreateRenderPass();
655 CreateFullscreenCandidateQuad(resource_provider_.get(), 706 CreateFullscreenCandidateQuad(resource_provider_.get(),
656 pass->shared_quad_state_list.back(), 707 pass->shared_quad_state_list.back(),
657 pass.get()); 708 pass.get());
658 709
659 // Add something behind it. 710 // Add something behind it.
660 CreateFullscreenOpaqueQuad(resource_provider_.get(), 711 CreateFullscreenOpaqueQuad(resource_provider_.get(),
661 pass->shared_quad_state_list.back(), pass.get()); 712 pass->shared_quad_state_list.back(), pass.get());
662 CreateFullscreenOpaqueQuad(resource_provider_.get(), 713 CreateFullscreenOpaqueQuad(resource_provider_.get(),
663 pass->shared_quad_state_list.back(), pass.get()); 714 pass->shared_quad_state_list.back(), pass.get());
664 715
665 // Check for potential candidates. 716 // Check for potential candidates.
666 OverlayCandidateList candidate_list; 717 OverlayCandidateList candidate_list;
667 RenderPassFilterList render_pass_filters; 718 RenderPassFilterList render_pass_filters;
668 RenderPassFilterList render_pass_background_filters; 719 RenderPassFilterList render_pass_background_filters;
669 overlay_processor_->ProcessForOverlays( 720 overlay_processor_->ProcessForOverlays(
670 resource_provider_.get(), pass.get(), render_pass_filters, 721 resource_provider_.get(), pass.get(), render_pass_filters,
671 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 722 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
723 &content_bounds_);
672 EXPECT_EQ(1U, candidate_list.size()); 724 EXPECT_EQ(1U, candidate_list.size());
673 } 725 }
674 726
675 TEST_F(SingleOverlayOnTopTest, RejectBlending) { 727 TEST_F(SingleOverlayOnTopTest, RejectBlending) {
676 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 728 std::unique_ptr<RenderPass> pass = CreateRenderPass();
677 TextureDrawQuad* quad = 729 TextureDrawQuad* quad =
678 CreateFullscreenCandidateQuad(resource_provider_.get(), 730 CreateFullscreenCandidateQuad(resource_provider_.get(),
679 pass->shared_quad_state_list.back(), 731 pass->shared_quad_state_list.back(),
680 pass.get()); 732 pass.get());
681 quad->needs_blending = true; 733 quad->needs_blending = true;
682 734
683 OverlayCandidateList candidate_list; 735 OverlayCandidateList candidate_list;
684 RenderPassFilterList render_pass_filters; 736 RenderPassFilterList render_pass_filters;
685 RenderPassFilterList render_pass_background_filters; 737 RenderPassFilterList render_pass_background_filters;
686 overlay_processor_->ProcessForOverlays( 738 overlay_processor_->ProcessForOverlays(
687 resource_provider_.get(), pass.get(), render_pass_filters, 739 resource_provider_.get(), pass.get(), render_pass_filters,
688 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 740 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
741 &content_bounds_);
689 EXPECT_EQ(0U, candidate_list.size()); 742 EXPECT_EQ(0U, candidate_list.size());
690 } 743 }
691 744
692 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { 745 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
693 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 746 std::unique_ptr<RenderPass> pass = CreateRenderPass();
694 TextureDrawQuad* quad = 747 TextureDrawQuad* quad =
695 CreateFullscreenCandidateQuad(resource_provider_.get(), 748 CreateFullscreenCandidateQuad(resource_provider_.get(),
696 pass->shared_quad_state_list.back(), 749 pass->shared_quad_state_list.back(),
697 pass.get()); 750 pass.get());
698 quad->background_color = SK_ColorBLACK; 751 quad->background_color = SK_ColorBLACK;
699 752
700 OverlayCandidateList candidate_list; 753 OverlayCandidateList candidate_list;
701 RenderPassFilterList render_pass_filters; 754 RenderPassFilterList render_pass_filters;
702 RenderPassFilterList render_pass_background_filters; 755 RenderPassFilterList render_pass_background_filters;
703 overlay_processor_->ProcessForOverlays( 756 overlay_processor_->ProcessForOverlays(
704 resource_provider_.get(), pass.get(), render_pass_filters, 757 resource_provider_.get(), pass.get(), render_pass_filters,
705 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 758 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
759 &content_bounds_);
706 EXPECT_EQ(0U, candidate_list.size()); 760 EXPECT_EQ(0U, candidate_list.size());
707 } 761 }
708 762
709 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { 763 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
710 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 764 std::unique_ptr<RenderPass> pass = CreateRenderPass();
711 CreateFullscreenCandidateQuad(resource_provider_.get(), 765 CreateFullscreenCandidateQuad(resource_provider_.get(),
712 pass->shared_quad_state_list.back(), 766 pass->shared_quad_state_list.back(),
713 pass.get()); 767 pass.get());
714 pass->shared_quad_state_list.back()->blend_mode = SkBlendMode::kScreen; 768 pass->shared_quad_state_list.back()->blend_mode = SkBlendMode::kScreen;
715 769
716 OverlayCandidateList candidate_list; 770 OverlayCandidateList candidate_list;
717 RenderPassFilterList render_pass_filters; 771 RenderPassFilterList render_pass_filters;
718 RenderPassFilterList render_pass_background_filters; 772 RenderPassFilterList render_pass_background_filters;
719 overlay_processor_->ProcessForOverlays( 773 overlay_processor_->ProcessForOverlays(
720 resource_provider_.get(), pass.get(), render_pass_filters, 774 resource_provider_.get(), pass.get(), render_pass_filters,
721 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 775 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
776 &content_bounds_);
722 EXPECT_EQ(0U, candidate_list.size()); 777 EXPECT_EQ(0U, candidate_list.size());
723 } 778 }
724 779
725 TEST_F(SingleOverlayOnTopTest, RejectOpacity) { 780 TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
726 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 781 std::unique_ptr<RenderPass> pass = CreateRenderPass();
727 CreateFullscreenCandidateQuad(resource_provider_.get(), 782 CreateFullscreenCandidateQuad(resource_provider_.get(),
728 pass->shared_quad_state_list.back(), 783 pass->shared_quad_state_list.back(),
729 pass.get()); 784 pass.get());
730 pass->shared_quad_state_list.back()->opacity = 0.5f; 785 pass->shared_quad_state_list.back()->opacity = 0.5f;
731 786
732 OverlayCandidateList candidate_list; 787 OverlayCandidateList candidate_list;
733 RenderPassFilterList render_pass_filters; 788 RenderPassFilterList render_pass_filters;
734 RenderPassFilterList render_pass_background_filters; 789 RenderPassFilterList render_pass_background_filters;
735 overlay_processor_->ProcessForOverlays( 790 overlay_processor_->ProcessForOverlays(
736 resource_provider_.get(), pass.get(), render_pass_filters, 791 resource_provider_.get(), pass.get(), render_pass_filters,
737 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 792 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
793 &content_bounds_);
738 EXPECT_EQ(0U, candidate_list.size()); 794 EXPECT_EQ(0U, candidate_list.size());
739 } 795 }
740 796
741 TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) { 797 TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) {
742 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 798 std::unique_ptr<RenderPass> pass = CreateRenderPass();
743 CreateFullscreenCandidateQuad(resource_provider_.get(), 799 CreateFullscreenCandidateQuad(resource_provider_.get(),
744 pass->shared_quad_state_list.back(), 800 pass->shared_quad_state_list.back(),
745 pass.get()); 801 pass.get());
746 pass->shared_quad_state_list.back() 802 pass->shared_quad_state_list.back()
747 ->quad_to_target_transform.RotateAboutXAxis(45.f); 803 ->quad_to_target_transform.RotateAboutXAxis(45.f);
748 804
749 OverlayCandidateList candidate_list; 805 OverlayCandidateList candidate_list;
750 RenderPassFilterList render_pass_filters; 806 RenderPassFilterList render_pass_filters;
751 RenderPassFilterList render_pass_background_filters; 807 RenderPassFilterList render_pass_background_filters;
752 overlay_processor_->ProcessForOverlays( 808 overlay_processor_->ProcessForOverlays(
753 resource_provider_.get(), pass.get(), render_pass_filters, 809 resource_provider_.get(), pass.get(), render_pass_filters,
754 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 810 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
811 &content_bounds_);
755 EXPECT_EQ(0U, candidate_list.size()); 812 EXPECT_EQ(0U, candidate_list.size());
756 } 813 }
757 814
758 TEST_F(SingleOverlayOnTopTest, AllowClipped) { 815 TEST_F(SingleOverlayOnTopTest, AllowClipped) {
759 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 816 std::unique_ptr<RenderPass> pass = CreateRenderPass();
760 CreateFullscreenCandidateQuad(resource_provider_.get(), 817 CreateFullscreenCandidateQuad(resource_provider_.get(),
761 pass->shared_quad_state_list.back(), 818 pass->shared_quad_state_list.back(),
762 pass.get()); 819 pass.get());
763 pass->shared_quad_state_list.back()->is_clipped = true; 820 pass->shared_quad_state_list.back()->is_clipped = true;
764 pass->shared_quad_state_list.back()->clip_rect = kOverlayClipRect; 821 pass->shared_quad_state_list.back()->clip_rect = kOverlayClipRect;
765 822
766 OverlayCandidateList candidate_list; 823 OverlayCandidateList candidate_list;
767 RenderPassFilterList render_pass_filters; 824 RenderPassFilterList render_pass_filters;
768 RenderPassFilterList render_pass_background_filters; 825 RenderPassFilterList render_pass_background_filters;
769 overlay_processor_->ProcessForOverlays( 826 overlay_processor_->ProcessForOverlays(
770 resource_provider_.get(), pass.get(), render_pass_filters, 827 resource_provider_.get(), pass.get(), render_pass_filters,
771 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 828 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
829 &content_bounds_);
772 EXPECT_EQ(1U, candidate_list.size()); 830 EXPECT_EQ(1U, candidate_list.size());
773 } 831 }
774 832
775 TEST_F(UnderlayTest, AllowVerticalFlip) { 833 TEST_F(UnderlayTest, AllowVerticalFlip) {
776 gfx::Rect rect = kOverlayRect; 834 gfx::Rect rect = kOverlayRect;
777 rect.set_width(rect.width() / 2); 835 rect.set_width(rect.width() / 2);
778 rect.Offset(0, -rect.height()); 836 rect.Offset(0, -rect.height());
779 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 837 std::unique_ptr<RenderPass> pass = CreateRenderPass();
780 CreateCandidateQuadAt(resource_provider_.get(), 838 CreateCandidateQuadAt(resource_provider_.get(),
781 pass->shared_quad_state_list.back(), pass.get(), rect); 839 pass->shared_quad_state_list.back(), pass.get(), rect);
782 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f, 840 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f,
783 -1.0f); 841 -1.0f);
784 OverlayCandidateList candidate_list; 842 OverlayCandidateList candidate_list;
785 RenderPassFilterList render_pass_filters; 843 RenderPassFilterList render_pass_filters;
786 RenderPassFilterList render_pass_background_filters; 844 RenderPassFilterList render_pass_background_filters;
787 overlay_processor_->ProcessForOverlays( 845 overlay_processor_->ProcessForOverlays(
788 resource_provider_.get(), pass.get(), render_pass_filters, 846 resource_provider_.get(), pass.get(), render_pass_filters,
789 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 847 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
848 &content_bounds_);
790 ASSERT_EQ(1U, candidate_list.size()); 849 ASSERT_EQ(1U, candidate_list.size());
791 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, 850 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL,
792 candidate_list.back().transform); 851 candidate_list.back().transform);
793 } 852 }
794 853
795 TEST_F(UnderlayTest, AllowHorizontalFlip) { 854 TEST_F(UnderlayTest, AllowHorizontalFlip) {
796 gfx::Rect rect = kOverlayRect; 855 gfx::Rect rect = kOverlayRect;
797 rect.set_height(rect.height() / 2); 856 rect.set_height(rect.height() / 2);
798 rect.Offset(-rect.width(), 0); 857 rect.Offset(-rect.width(), 0);
799 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 858 std::unique_ptr<RenderPass> pass = CreateRenderPass();
800 CreateCandidateQuadAt(resource_provider_.get(), 859 CreateCandidateQuadAt(resource_provider_.get(),
801 pass->shared_quad_state_list.back(), pass.get(), rect); 860 pass->shared_quad_state_list.back(), pass.get(), rect);
802 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(-1.0f, 861 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(-1.0f,
803 2.0f); 862 2.0f);
804 863
805 OverlayCandidateList candidate_list; 864 OverlayCandidateList candidate_list;
806 RenderPassFilterList render_pass_filters; 865 RenderPassFilterList render_pass_filters;
807 RenderPassFilterList render_pass_background_filters; 866 RenderPassFilterList render_pass_background_filters;
808 overlay_processor_->ProcessForOverlays( 867 overlay_processor_->ProcessForOverlays(
809 resource_provider_.get(), pass.get(), render_pass_filters, 868 resource_provider_.get(), pass.get(), render_pass_filters,
810 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 869 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
870 &content_bounds_);
811 ASSERT_EQ(1U, candidate_list.size()); 871 ASSERT_EQ(1U, candidate_list.size());
812 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, 872 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL,
813 candidate_list.back().transform); 873 candidate_list.back().transform);
814 } 874 }
815 875
816 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { 876 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) {
817 gfx::Rect rect = kOverlayRect; 877 gfx::Rect rect = kOverlayRect;
818 rect.set_width(rect.width() / 2); 878 rect.set_width(rect.width() / 2);
819 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 879 std::unique_ptr<RenderPass> pass = CreateRenderPass();
820 CreateCandidateQuadAt(resource_provider_.get(), 880 CreateCandidateQuadAt(resource_provider_.get(),
821 pass->shared_quad_state_list.back(), pass.get(), rect); 881 pass->shared_quad_state_list.back(), pass.get(), rect);
822 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f, 882 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f,
823 1.0f); 883 1.0f);
824 OverlayCandidateList candidate_list; 884 OverlayCandidateList candidate_list;
825 RenderPassFilterList render_pass_filters; 885 RenderPassFilterList render_pass_filters;
826 RenderPassFilterList render_pass_background_filters; 886 RenderPassFilterList render_pass_background_filters;
827 overlay_processor_->ProcessForOverlays( 887 overlay_processor_->ProcessForOverlays(
828 resource_provider_.get(), pass.get(), render_pass_filters, 888 resource_provider_.get(), pass.get(), render_pass_filters,
829 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 889 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
890 &content_bounds_);
830 EXPECT_EQ(1U, candidate_list.size()); 891 EXPECT_EQ(1U, candidate_list.size());
831 } 892 }
832 893
833 TEST_F(SingleOverlayOnTopTest, RejectTransform) { 894 TEST_F(SingleOverlayOnTopTest, RejectTransform) {
834 gfx::Rect rect = kOverlayRect; 895 gfx::Rect rect = kOverlayRect;
835 rect.Offset(0, -rect.height()); 896 rect.Offset(0, -rect.height());
836 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 897 std::unique_ptr<RenderPass> pass = CreateRenderPass();
837 CreateCandidateQuadAt(resource_provider_.get(), 898 CreateCandidateQuadAt(resource_provider_.get(),
838 pass->shared_quad_state_list.back(), pass.get(), rect); 899 pass->shared_quad_state_list.back(), pass.get(), rect);
839 pass->shared_quad_state_list.back() 900 pass->shared_quad_state_list.back()
840 ->quad_to_target_transform.RotateAboutZAxis(90.f); 901 ->quad_to_target_transform.RotateAboutZAxis(90.f);
841 902
842 OverlayCandidateList candidate_list; 903 OverlayCandidateList candidate_list;
843 RenderPassFilterList render_pass_filters; 904 RenderPassFilterList render_pass_filters;
844 RenderPassFilterList render_pass_background_filters; 905 RenderPassFilterList render_pass_background_filters;
845 overlay_processor_->ProcessForOverlays( 906 overlay_processor_->ProcessForOverlays(
846 resource_provider_.get(), pass.get(), render_pass_filters, 907 resource_provider_.get(), pass.get(), render_pass_filters,
847 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 908 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
909 &content_bounds_);
848 ASSERT_EQ(0U, candidate_list.size()); 910 ASSERT_EQ(0U, candidate_list.size());
849 } 911 }
850 912
851 TEST_F(UnderlayTest, Allow90DegreeRotation) { 913 TEST_F(UnderlayTest, Allow90DegreeRotation) {
852 gfx::Rect rect = kOverlayRect; 914 gfx::Rect rect = kOverlayRect;
853 rect.Offset(0, -rect.height()); 915 rect.Offset(0, -rect.height());
854 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 916 std::unique_ptr<RenderPass> pass = CreateRenderPass();
855 CreateCandidateQuadAt(resource_provider_.get(), 917 CreateCandidateQuadAt(resource_provider_.get(),
856 pass->shared_quad_state_list.back(), pass.get(), rect); 918 pass->shared_quad_state_list.back(), pass.get(), rect);
857 pass->shared_quad_state_list.back() 919 pass->shared_quad_state_list.back()
858 ->quad_to_target_transform.RotateAboutZAxis(90.f); 920 ->quad_to_target_transform.RotateAboutZAxis(90.f);
859 921
860 OverlayCandidateList candidate_list; 922 OverlayCandidateList candidate_list;
861 RenderPassFilterList render_pass_filters; 923 RenderPassFilterList render_pass_filters;
862 RenderPassFilterList render_pass_background_filters; 924 RenderPassFilterList render_pass_background_filters;
863 overlay_processor_->ProcessForOverlays( 925 overlay_processor_->ProcessForOverlays(
864 resource_provider_.get(), pass.get(), render_pass_filters, 926 resource_provider_.get(), pass.get(), render_pass_filters,
865 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 927 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
928 &content_bounds_);
866 ASSERT_EQ(1U, candidate_list.size()); 929 ASSERT_EQ(1U, candidate_list.size());
867 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform); 930 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform);
868 } 931 }
869 932
870 TEST_F(UnderlayTest, Allow180DegreeRotation) { 933 TEST_F(UnderlayTest, Allow180DegreeRotation) {
871 gfx::Rect rect = kOverlayRect; 934 gfx::Rect rect = kOverlayRect;
872 rect.Offset(-rect.width(), -rect.height()); 935 rect.Offset(-rect.width(), -rect.height());
873 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 936 std::unique_ptr<RenderPass> pass = CreateRenderPass();
874 CreateCandidateQuadAt(resource_provider_.get(), 937 CreateCandidateQuadAt(resource_provider_.get(),
875 pass->shared_quad_state_list.back(), pass.get(), rect); 938 pass->shared_quad_state_list.back(), pass.get(), rect);
876 pass->shared_quad_state_list.back() 939 pass->shared_quad_state_list.back()
877 ->quad_to_target_transform.RotateAboutZAxis(180.f); 940 ->quad_to_target_transform.RotateAboutZAxis(180.f);
878 941
879 OverlayCandidateList candidate_list; 942 OverlayCandidateList candidate_list;
880 RenderPassFilterList render_pass_filters; 943 RenderPassFilterList render_pass_filters;
881 RenderPassFilterList render_pass_background_filters; 944 RenderPassFilterList render_pass_background_filters;
882 overlay_processor_->ProcessForOverlays( 945 overlay_processor_->ProcessForOverlays(
883 resource_provider_.get(), pass.get(), render_pass_filters, 946 resource_provider_.get(), pass.get(), render_pass_filters,
884 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 947 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
948 &content_bounds_);
885 ASSERT_EQ(1U, candidate_list.size()); 949 ASSERT_EQ(1U, candidate_list.size());
886 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform); 950 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform);
887 } 951 }
888 952
889 TEST_F(UnderlayTest, Allow270DegreeRotation) { 953 TEST_F(UnderlayTest, Allow270DegreeRotation) {
890 gfx::Rect rect = kOverlayRect; 954 gfx::Rect rect = kOverlayRect;
891 rect.Offset(-rect.width(), 0); 955 rect.Offset(-rect.width(), 0);
892 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 956 std::unique_ptr<RenderPass> pass = CreateRenderPass();
893 CreateCandidateQuadAt(resource_provider_.get(), 957 CreateCandidateQuadAt(resource_provider_.get(),
894 pass->shared_quad_state_list.back(), pass.get(), rect); 958 pass->shared_quad_state_list.back(), pass.get(), rect);
895 pass->shared_quad_state_list.back() 959 pass->shared_quad_state_list.back()
896 ->quad_to_target_transform.RotateAboutZAxis(270.f); 960 ->quad_to_target_transform.RotateAboutZAxis(270.f);
897 961
898 OverlayCandidateList candidate_list; 962 OverlayCandidateList candidate_list;
899 RenderPassFilterList render_pass_filters; 963 RenderPassFilterList render_pass_filters;
900 RenderPassFilterList render_pass_background_filters; 964 RenderPassFilterList render_pass_background_filters;
901 overlay_processor_->ProcessForOverlays( 965 overlay_processor_->ProcessForOverlays(
902 resource_provider_.get(), pass.get(), render_pass_filters, 966 resource_provider_.get(), pass.get(), render_pass_filters,
903 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 967 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
968 &content_bounds_);
904 ASSERT_EQ(1U, candidate_list.size()); 969 ASSERT_EQ(1U, candidate_list.size());
905 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform); 970 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform);
906 } 971 }
907 972
908 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { 973 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
974 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
975 gfx::RectF(kOverlayBottomRightRect));
976
909 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 977 std::unique_ptr<RenderPass> pass = CreateRenderPass();
910 CreateOpaqueQuadAt(resource_provider_.get(), 978 CreateOpaqueQuadAt(resource_provider_.get(),
911 pass->shared_quad_state_list.back(), pass.get(), 979 pass->shared_quad_state_list.back(), pass.get(),
912 kOverlayTopLeftRect); 980 kOverlayTopLeftRect);
913 CreateCandidateQuadAt(resource_provider_.get(), 981 CreateCandidateQuadAt(resource_provider_.get(),
914 pass->shared_quad_state_list.back(), 982 pass->shared_quad_state_list.back(),
915 pass.get(), 983 pass.get(),
916 kOverlayBottomRightRect); 984 kOverlayBottomRightRect);
917 985
918 OverlayCandidateList candidate_list; 986 OverlayCandidateList candidate_list;
919 RenderPassFilterList render_pass_filters; 987 RenderPassFilterList render_pass_filters;
920 RenderPassFilterList render_pass_background_filters; 988 RenderPassFilterList render_pass_background_filters;
921 overlay_processor_->ProcessForOverlays( 989 overlay_processor_->ProcessForOverlays(
922 resource_provider_.get(), pass.get(), render_pass_filters, 990 resource_provider_.get(), pass.get(), render_pass_filters,
923 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 991 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
992 &content_bounds_);
924 EXPECT_EQ(1U, candidate_list.size()); 993 EXPECT_EQ(1U, candidate_list.size());
925 } 994 }
926 995
927 TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) { 996 TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
997 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
998 gfx::RectF(kOverlayBottomRightRect));
999
928 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1000 std::unique_ptr<RenderPass> pass = CreateRenderPass();
929 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1001 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
930 shared_state->opacity = 0.f; 1002 shared_state->opacity = 0.f;
931 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(), 1003 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
932 kOverlayBottomRightRect); 1004 kOverlayBottomRightRect);
933 shared_state = pass->CreateAndAppendSharedQuadState(); 1005 shared_state = pass->CreateAndAppendSharedQuadState();
934 shared_state->opacity = 1.f; 1006 shared_state->opacity = 1.f;
935 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(), 1007 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
936 kOverlayBottomRightRect); 1008 kOverlayBottomRightRect);
937 1009
938 OverlayCandidateList candidate_list; 1010 OverlayCandidateList candidate_list;
939 RenderPassFilterList render_pass_filters; 1011 RenderPassFilterList render_pass_filters;
940 RenderPassFilterList render_pass_background_filters; 1012 RenderPassFilterList render_pass_background_filters;
941 overlay_processor_->ProcessForOverlays( 1013 overlay_processor_->ProcessForOverlays(
942 resource_provider_.get(), pass.get(), render_pass_filters, 1014 resource_provider_.get(), pass.get(), render_pass_filters,
943 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1015 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1016 &content_bounds_);
944 EXPECT_EQ(1U, candidate_list.size()); 1017 EXPECT_EQ(1U, candidate_list.size());
945 } 1018 }
946 1019
947 TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) { 1020 TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
1021 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1022 gfx::RectF(kOverlayBottomRightRect));
1023
948 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1024 std::unique_ptr<RenderPass> pass = CreateRenderPass();
949 CreateSolidColorQuadAt(pass->shared_quad_state_list.back(), 1025 CreateSolidColorQuadAt(pass->shared_quad_state_list.back(),
950 SK_ColorTRANSPARENT, pass.get(), 1026 SK_ColorTRANSPARENT, pass.get(),
951 kOverlayBottomRightRect); 1027 kOverlayBottomRightRect);
952 CreateCandidateQuadAt(resource_provider_.get(), 1028 CreateCandidateQuadAt(resource_provider_.get(),
953 pass->shared_quad_state_list.back(), pass.get(), 1029 pass->shared_quad_state_list.back(), pass.get(),
954 kOverlayBottomRightRect); 1030 kOverlayBottomRightRect);
955 1031
956 OverlayCandidateList candidate_list; 1032 OverlayCandidateList candidate_list;
957 RenderPassFilterList render_pass_filters; 1033 RenderPassFilterList render_pass_filters;
958 RenderPassFilterList render_pass_background_filters; 1034 RenderPassFilterList render_pass_background_filters;
959 overlay_processor_->ProcessForOverlays( 1035 overlay_processor_->ProcessForOverlays(
960 resource_provider_.get(), pass.get(), render_pass_filters, 1036 resource_provider_.get(), pass.get(), render_pass_filters,
961 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1037 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1038 &content_bounds_);
962 EXPECT_EQ(1U, candidate_list.size()); 1039 EXPECT_EQ(1U, candidate_list.size());
963 } 1040 }
964 1041
965 TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) { 1042 TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) {
966 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1043 std::unique_ptr<RenderPass> pass = CreateRenderPass();
967 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1044 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
968 shared_state->opacity = 0.5f; 1045 shared_state->opacity = 0.5f;
969 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(), 1046 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
970 kOverlayBottomRightRect); 1047 kOverlayBottomRightRect);
971 shared_state = pass->CreateAndAppendSharedQuadState(); 1048 shared_state = pass->CreateAndAppendSharedQuadState();
972 shared_state->opacity = 1.f; 1049 shared_state->opacity = 1.f;
973 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(), 1050 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
974 kOverlayBottomRightRect); 1051 kOverlayBottomRightRect);
975 1052
976 OverlayCandidateList candidate_list; 1053 OverlayCandidateList candidate_list;
977 RenderPassFilterList render_pass_filters; 1054 RenderPassFilterList render_pass_filters;
978 RenderPassFilterList render_pass_background_filters; 1055 RenderPassFilterList render_pass_background_filters;
979 overlay_processor_->ProcessForOverlays( 1056 overlay_processor_->ProcessForOverlays(
980 resource_provider_.get(), pass.get(), render_pass_filters, 1057 resource_provider_.get(), pass.get(), render_pass_filters,
981 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1058 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1059 &content_bounds_);
982 EXPECT_EQ(0U, candidate_list.size()); 1060 EXPECT_EQ(0U, candidate_list.size());
983 } 1061 }
984 1062
985 TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) { 1063 TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) {
986 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1064 std::unique_ptr<RenderPass> pass = CreateRenderPass();
987 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1065 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
988 CreateSolidColorQuadAt(shared_state, SK_ColorTRANSPARENT, pass.get(), 1066 CreateSolidColorQuadAt(shared_state, SK_ColorTRANSPARENT, pass.get(),
989 kOverlayBottomRightRect)->opaque_rect = 1067 kOverlayBottomRightRect)->opaque_rect =
990 kOverlayBottomRightRect; 1068 kOverlayBottomRightRect;
991 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(), 1069 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
992 kOverlayBottomRightRect); 1070 kOverlayBottomRightRect);
993 1071
994 OverlayCandidateList candidate_list; 1072 OverlayCandidateList candidate_list;
995 RenderPassFilterList render_pass_filters; 1073 RenderPassFilterList render_pass_filters;
996 RenderPassFilterList render_pass_background_filters; 1074 RenderPassFilterList render_pass_background_filters;
997 overlay_processor_->ProcessForOverlays( 1075 overlay_processor_->ProcessForOverlays(
998 resource_provider_.get(), pass.get(), render_pass_filters, 1076 resource_provider_.get(), pass.get(), render_pass_filters,
999 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1077 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1078 &content_bounds_);
1000 EXPECT_EQ(0U, candidate_list.size()); 1079 EXPECT_EQ(0U, candidate_list.size());
1001 } 1080 }
1002 1081
1003 TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) { 1082 TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) {
1004 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1083 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1005 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1084 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1006 pass->shared_quad_state_list.back(), 1085 pass->shared_quad_state_list.back(),
1007 pass.get(), kSwapTransform); 1086 pass.get(), kSwapTransform);
1008 1087
1009 OverlayCandidateList candidate_list; 1088 OverlayCandidateList candidate_list;
1010 RenderPassFilterList render_pass_filters; 1089 RenderPassFilterList render_pass_filters;
1011 RenderPassFilterList render_pass_background_filters; 1090 RenderPassFilterList render_pass_background_filters;
1012 overlay_processor_->ProcessForOverlays( 1091 overlay_processor_->ProcessForOverlays(
1013 resource_provider_.get(), pass.get(), render_pass_filters, 1092 resource_provider_.get(), pass.get(), render_pass_filters,
1014 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1093 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1094 &content_bounds_);
1015 EXPECT_EQ(0U, candidate_list.size()); 1095 EXPECT_EQ(0U, candidate_list.size());
1016 } 1096 }
1017 1097
1018 TEST_F(UnderlayTest, AllowVideoXMirrorTransform) { 1098 TEST_F(UnderlayTest, AllowVideoXMirrorTransform) {
1019 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1099 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1020 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1100 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1021 pass->shared_quad_state_list.back(), 1101 pass->shared_quad_state_list.back(),
1022 pass.get(), kXMirrorTransform); 1102 pass.get(), kXMirrorTransform);
1023 1103
1024 OverlayCandidateList candidate_list; 1104 OverlayCandidateList candidate_list;
1025 RenderPassFilterList render_pass_filters; 1105 RenderPassFilterList render_pass_filters;
1026 RenderPassFilterList render_pass_background_filters; 1106 RenderPassFilterList render_pass_background_filters;
1027 overlay_processor_->ProcessForOverlays( 1107 overlay_processor_->ProcessForOverlays(
1028 resource_provider_.get(), pass.get(), render_pass_filters, 1108 resource_provider_.get(), pass.get(), render_pass_filters,
1029 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1109 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1110 &content_bounds_);
1030 EXPECT_EQ(1U, candidate_list.size()); 1111 EXPECT_EQ(1U, candidate_list.size());
1031 } 1112 }
1032 1113
1033 TEST_F(UnderlayTest, AllowVideoBothMirrorTransform) { 1114 TEST_F(UnderlayTest, AllowVideoBothMirrorTransform) {
1034 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1115 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1035 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1116 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1036 pass->shared_quad_state_list.back(), 1117 pass->shared_quad_state_list.back(),
1037 pass.get(), kBothMirrorTransform); 1118 pass.get(), kBothMirrorTransform);
1038 1119
1039 OverlayCandidateList candidate_list; 1120 OverlayCandidateList candidate_list;
1040 RenderPassFilterList render_pass_filters; 1121 RenderPassFilterList render_pass_filters;
1041 RenderPassFilterList render_pass_background_filters; 1122 RenderPassFilterList render_pass_background_filters;
1042 overlay_processor_->ProcessForOverlays( 1123 overlay_processor_->ProcessForOverlays(
1043 resource_provider_.get(), pass.get(), render_pass_filters, 1124 resource_provider_.get(), pass.get(), render_pass_filters,
1044 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1125 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1126 &content_bounds_);
1045 EXPECT_EQ(1U, candidate_list.size()); 1127 EXPECT_EQ(1U, candidate_list.size());
1046 } 1128 }
1047 1129
1048 TEST_F(UnderlayTest, AllowVideoNormalTransform) { 1130 TEST_F(UnderlayTest, AllowVideoNormalTransform) {
1049 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1131 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1050 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1132 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1051 pass->shared_quad_state_list.back(), 1133 pass->shared_quad_state_list.back(),
1052 pass.get(), kNormalTransform); 1134 pass.get(), kNormalTransform);
1053 1135
1054 OverlayCandidateList candidate_list; 1136 OverlayCandidateList candidate_list;
1055 RenderPassFilterList render_pass_filters; 1137 RenderPassFilterList render_pass_filters;
1056 RenderPassFilterList render_pass_background_filters; 1138 RenderPassFilterList render_pass_background_filters;
1057 overlay_processor_->ProcessForOverlays( 1139 overlay_processor_->ProcessForOverlays(
1058 resource_provider_.get(), pass.get(), render_pass_filters, 1140 resource_provider_.get(), pass.get(), render_pass_filters,
1059 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1141 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1142 &content_bounds_);
1060 EXPECT_EQ(1U, candidate_list.size()); 1143 EXPECT_EQ(1U, candidate_list.size());
1061 } 1144 }
1062 1145
1063 TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) { 1146 TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) {
1064 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1147 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1065 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1148 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1066 pass->shared_quad_state_list.back(), 1149 pass->shared_quad_state_list.back(),
1067 pass.get(), kYMirrorTransform); 1150 pass.get(), kYMirrorTransform);
1068 1151
1069 OverlayCandidateList candidate_list; 1152 OverlayCandidateList candidate_list;
1070 RenderPassFilterList render_pass_filters; 1153 RenderPassFilterList render_pass_filters;
1071 RenderPassFilterList render_pass_background_filters; 1154 RenderPassFilterList render_pass_background_filters;
1072 overlay_processor_->ProcessForOverlays( 1155 overlay_processor_->ProcessForOverlays(
1073 resource_provider_.get(), pass.get(), render_pass_filters, 1156 resource_provider_.get(), pass.get(), render_pass_filters,
1074 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1157 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1158 &content_bounds_);
1075 EXPECT_EQ(1U, candidate_list.size()); 1159 EXPECT_EQ(1U, candidate_list.size());
1076 } 1160 }
1077 1161
1078 TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) { 1162 TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
1163 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1164 gfx::RectF(kOverlayBottomRightRect));
1165
1079 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1166 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1080 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1167 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1081 pass->shared_quad_state_list.back(), pass.get()); 1168 pass->shared_quad_state_list.back(), pass.get());
1082 CreateCandidateQuadAt(resource_provider_.get(), 1169 CreateCandidateQuadAt(resource_provider_.get(),
1083 pass->shared_quad_state_list.back(), pass.get(), 1170 pass->shared_quad_state_list.back(), pass.get(),
1084 kOverlayBottomRightRect); 1171 kOverlayBottomRightRect);
1085 1172
1086 OverlayCandidateList candidate_list; 1173 OverlayCandidateList candidate_list;
1087 RenderPassFilterList render_pass_filters; 1174 RenderPassFilterList render_pass_filters;
1088 RenderPassFilterList render_pass_background_filters; 1175 RenderPassFilterList render_pass_background_filters;
1089 overlay_processor_->ProcessForOverlays( 1176 overlay_processor_->ProcessForOverlays(
1090 resource_provider_.get(), pass.get(), render_pass_filters, 1177 resource_provider_.get(), pass.get(), render_pass_filters,
1091 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1178 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1179 &content_bounds_);
1092 ASSERT_EQ(1U, candidate_list.size()); 1180 ASSERT_EQ(1U, candidate_list.size());
1093 EXPECT_EQ(-1, candidate_list[0].plane_z_order); 1181 EXPECT_EQ(-1, candidate_list[0].plane_z_order);
1094 EXPECT_EQ(2U, pass->quad_list.size()); 1182 EXPECT_EQ(2U, pass->quad_list.size());
1095 // The overlay quad should have changed to a SOLID_COLOR quad. 1183 // The overlay quad should have changed to a SOLID_COLOR quad.
1096 EXPECT_EQ(pass->quad_list.back()->material, DrawQuad::SOLID_COLOR); 1184 EXPECT_EQ(pass->quad_list.back()->material, DrawQuad::SOLID_COLOR);
1097 } 1185 }
1098 1186
1099 TEST_F(UnderlayTest, AllowOnTop) { 1187 TEST_F(UnderlayTest, AllowOnTop) {
1100 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1188 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1101 CreateFullscreenCandidateQuad(resource_provider_.get(), 1189 CreateFullscreenCandidateQuad(resource_provider_.get(),
1102 pass->shared_quad_state_list.back(), 1190 pass->shared_quad_state_list.back(),
1103 pass.get()); 1191 pass.get());
1104 pass->CreateAndAppendSharedQuadState()->opacity = 0.5f; 1192 pass->CreateAndAppendSharedQuadState()->opacity = 0.5f;
1105 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1193 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1106 pass->shared_quad_state_list.back(), pass.get()); 1194 pass->shared_quad_state_list.back(), pass.get());
1107 1195
1108 OverlayCandidateList candidate_list; 1196 OverlayCandidateList candidate_list;
1109 RenderPassFilterList render_pass_filters; 1197 RenderPassFilterList render_pass_filters;
1110 RenderPassFilterList render_pass_background_filters; 1198 RenderPassFilterList render_pass_background_filters;
1111 overlay_processor_->ProcessForOverlays( 1199 overlay_processor_->ProcessForOverlays(
1112 resource_provider_.get(), pass.get(), render_pass_filters, 1200 resource_provider_.get(), pass.get(), render_pass_filters,
1113 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1201 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1202 &content_bounds_);
1114 ASSERT_EQ(1U, candidate_list.size()); 1203 ASSERT_EQ(1U, candidate_list.size());
1115 EXPECT_EQ(-1, candidate_list[0].plane_z_order); 1204 EXPECT_EQ(-1, candidate_list[0].plane_z_order);
1116 // The overlay quad should have changed to a SOLID_COLOR quad. 1205 // The overlay quad should have changed to a SOLID_COLOR quad.
1117 EXPECT_EQ(pass->quad_list.front()->material, DrawQuad::SOLID_COLOR); 1206 EXPECT_EQ(pass->quad_list.front()->material, DrawQuad::SOLID_COLOR);
1118 } 1207 }
1119 1208
1120 // The first time an underlay is scheduled its damage must not be subtracted. 1209 // The first time an underlay is scheduled its damage must not be subtracted.
1121 TEST_F(UnderlayTest, InitialUnderlayDamageNotSubtracted) { 1210 TEST_F(UnderlayTest, InitialUnderlayDamageNotSubtracted) {
1122 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1211 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1123 CreateFullscreenCandidateQuad(resource_provider_.get(), 1212 CreateFullscreenCandidateQuad(resource_provider_.get(),
1124 pass->shared_quad_state_list.back(), 1213 pass->shared_quad_state_list.back(),
1125 pass.get()); 1214 pass.get());
1126 1215
1127 damage_rect_ = kOverlayRect; 1216 damage_rect_ = kOverlayRect;
1128 1217
1129 OverlayCandidateList candidate_list; 1218 OverlayCandidateList candidate_list;
1130 RenderPassFilterList render_pass_filters; 1219 RenderPassFilterList render_pass_filters;
1131 RenderPassFilterList render_pass_background_filters; 1220 RenderPassFilterList render_pass_background_filters;
1132 overlay_processor_->ProcessForOverlays( 1221 overlay_processor_->ProcessForOverlays(
1133 resource_provider_.get(), pass.get(), render_pass_filters, 1222 resource_provider_.get(), pass.get(), render_pass_filters,
1134 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_); 1223 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1224 &content_bounds_);
1135 1225
1136 EXPECT_EQ(kOverlayRect, damage_rect_); 1226 EXPECT_EQ(kOverlayRect, damage_rect_);
1137 } 1227 }
1138 1228
1139 // An identical underlay for two frames in a row means the damage can be 1229 // An identical underlay for two frames in a row means the damage can be
1140 // subtracted the second time. 1230 // subtracted the second time.
1141 TEST_F(UnderlayTest, DamageSubtractedForConsecutiveIdenticalUnderlays) { 1231 TEST_F(UnderlayTest, DamageSubtractedForConsecutiveIdenticalUnderlays) {
1142 for (int i = 0; i < 2; ++i) { 1232 for (int i = 0; i < 2; ++i) {
1143 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1233 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1144 CreateFullscreenCandidateQuad(resource_provider_.get(), 1234 CreateFullscreenCandidateQuad(resource_provider_.get(),
1145 pass->shared_quad_state_list.back(), 1235 pass->shared_quad_state_list.back(),
1146 pass.get()); 1236 pass.get());
1147 1237
1148 damage_rect_ = kOverlayRect; 1238 damage_rect_ = kOverlayRect;
1149 1239
1150 // Add something behind it. 1240 // Add something behind it.
1151 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1241 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1152 pass->shared_quad_state_list.back(), pass.get()); 1242 pass->shared_quad_state_list.back(), pass.get());
1153 1243
1154 OverlayCandidateList candidate_list; 1244 OverlayCandidateList candidate_list;
1155 RenderPassFilterList render_pass_filters; 1245 RenderPassFilterList render_pass_filters;
1156 RenderPassFilterList render_pass_background_filters; 1246 RenderPassFilterList render_pass_background_filters;
1157 overlay_processor_->ProcessForOverlays( 1247 overlay_processor_->ProcessForOverlays(
1158 resource_provider_.get(), pass.get(), render_pass_filters, 1248 resource_provider_.get(), pass.get(), render_pass_filters,
1159 render_pass_background_filters, &candidate_list, nullptr, 1249 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1160 &damage_rect_); 1250 &content_bounds_);
1161 } 1251 }
1162 1252
1163 // The second time the same overlay rect is scheduled it will be subtracted 1253 // The second time the same overlay rect is scheduled it will be subtracted
1164 // from the damage rect. 1254 // from the damage rect.
1165 EXPECT_TRUE(damage_rect_.IsEmpty()); 1255 EXPECT_TRUE(damage_rect_.IsEmpty());
1166 } 1256 }
1167 1257
1168 // Underlay damage can only be subtracted if the previous frame's underlay 1258 // Underlay damage can only be subtracted if the previous frame's underlay
1169 // was the same rect. 1259 // was the same rect.
1170 TEST_F(UnderlayTest, DamageNotSubtractedForNonIdenticalConsecutiveUnderlays) { 1260 TEST_F(UnderlayTest, DamageNotSubtractedForNonIdenticalConsecutiveUnderlays) {
1171 gfx::Rect overlay_rects[] = {kOverlayBottomRightRect, kOverlayRect}; 1261 gfx::Rect overlay_rects[] = {kOverlayBottomRightRect, kOverlayRect};
1172 for (int i = 0; i < 2; ++i) { 1262 for (int i = 0; i < 2; ++i) {
1263 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1264 gfx::RectF(overlay_rects[i]));
1265
1173 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1266 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1174 1267
1175 CreateCandidateQuadAt(resource_provider_.get(), 1268 CreateCandidateQuadAt(resource_provider_.get(),
1176 pass->shared_quad_state_list.back(), pass.get(), 1269 pass->shared_quad_state_list.back(), pass.get(),
1177 overlay_rects[i]); 1270 overlay_rects[i]);
1178 1271
1179 damage_rect_ = overlay_rects[i]; 1272 damage_rect_ = overlay_rects[i];
1180 1273
1181 OverlayCandidateList candidate_list; 1274 OverlayCandidateList candidate_list;
1182 RenderPassFilterList render_pass_filters; 1275 RenderPassFilterList render_pass_filters;
1183 RenderPassFilterList render_pass_background_filters; 1276 RenderPassFilterList render_pass_background_filters;
1184 overlay_processor_->ProcessForOverlays( 1277 overlay_processor_->ProcessForOverlays(
1185 resource_provider_.get(), pass.get(), render_pass_filters, 1278 resource_provider_.get(), pass.get(), render_pass_filters,
1186 render_pass_background_filters, &candidate_list, nullptr, 1279 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1187 &damage_rect_); 1280 &content_bounds_);
1188 1281
1189 EXPECT_EQ(overlay_rects[i], damage_rect_); 1282 EXPECT_EQ(overlay_rects[i], damage_rect_);
1190 } 1283 }
1191 } 1284 }
1192 1285
1193 TEST_F(UnderlayTest, DamageNotSubtractedWhenQuadsAboveOverlap) { 1286 TEST_F(UnderlayTest, DamageNotSubtractedWhenQuadsAboveOverlap) {
1194 for (int i = 0; i < 2; ++i) { 1287 for (int i = 0; i < 2; ++i) {
1195 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1288 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1196 // Add an overlapping quad above the candidate. 1289 // Add an overlapping quad above the candidate.
1197 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1290 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1198 pass->shared_quad_state_list.back(), pass.get()); 1291 pass->shared_quad_state_list.back(), pass.get());
1199 CreateFullscreenCandidateQuad(resource_provider_.get(), 1292 CreateFullscreenCandidateQuad(resource_provider_.get(),
1200 pass->shared_quad_state_list.back(), 1293 pass->shared_quad_state_list.back(),
1201 pass.get()); 1294 pass.get());
1202 1295
1203 damage_rect_ = kOverlayRect; 1296 damage_rect_ = kOverlayRect;
1204 1297
1205 OverlayCandidateList candidate_list; 1298 OverlayCandidateList candidate_list;
1206 RenderPassFilterList render_pass_filters; 1299 RenderPassFilterList render_pass_filters;
1207 RenderPassFilterList render_pass_background_filters; 1300 RenderPassFilterList render_pass_background_filters;
1208 overlay_processor_->ProcessForOverlays( 1301 overlay_processor_->ProcessForOverlays(
1209 resource_provider_.get(), pass.get(), render_pass_filters, 1302 resource_provider_.get(), pass.get(), render_pass_filters,
1210 render_pass_background_filters, &candidate_list, nullptr, 1303 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1211 &damage_rect_); 1304 &content_bounds_);
1212 } 1305 }
1213 1306
1214 EXPECT_EQ(kOverlayRect, damage_rect_); 1307 EXPECT_EQ(kOverlayRect, damage_rect_);
1215 } 1308 }
1216 1309
1217 TEST_F(UnderlayTest, DamageSubtractedWhenQuadsAboveDontOverlap) { 1310 TEST_F(UnderlayTest, DamageSubtractedWhenQuadsAboveDontOverlap) {
1311 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1312 gfx::RectF(kOverlayBottomRightRect));
1313
1218 for (int i = 0; i < 2; ++i) { 1314 for (int i = 0; i < 2; ++i) {
1219 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1315 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1220 // Add a non-overlapping quad above the candidate. 1316 // Add a non-overlapping quad above the candidate.
1221 CreateOpaqueQuadAt(resource_provider_.get(), 1317 CreateOpaqueQuadAt(resource_provider_.get(),
1222 pass->shared_quad_state_list.back(), pass.get(), 1318 pass->shared_quad_state_list.back(), pass.get(),
1223 kOverlayTopLeftRect); 1319 kOverlayTopLeftRect);
1224 CreateCandidateQuadAt(resource_provider_.get(), 1320 CreateCandidateQuadAt(resource_provider_.get(),
1225 pass->shared_quad_state_list.back(), pass.get(), 1321 pass->shared_quad_state_list.back(), pass.get(),
1226 kOverlayBottomRightRect); 1322 kOverlayBottomRightRect);
1227 1323
1228 damage_rect_ = kOverlayBottomRightRect; 1324 damage_rect_ = kOverlayBottomRightRect;
1229 1325
1230 OverlayCandidateList candidate_list; 1326 OverlayCandidateList candidate_list;
1231 RenderPassFilterList render_pass_filters; 1327 RenderPassFilterList render_pass_filters;
1232 RenderPassFilterList render_pass_background_filters; 1328 RenderPassFilterList render_pass_background_filters;
1233 overlay_processor_->ProcessForOverlays( 1329 overlay_processor_->ProcessForOverlays(
1234 resource_provider_.get(), pass.get(), render_pass_filters, 1330 resource_provider_.get(), pass.get(), render_pass_filters,
1235 render_pass_background_filters, &candidate_list, nullptr, 1331 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1236 &damage_rect_); 1332 &content_bounds_);
1237 } 1333 }
1238 1334
1239 EXPECT_TRUE(damage_rect_.IsEmpty()); 1335 EXPECT_TRUE(damage_rect_.IsEmpty());
1240 } 1336 }
1241 1337
1338 TEST_F(UnderlayCastTest, NoOverlayContentBounds) {
1339 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1340
1341 CreateOpaqueQuadAt(resource_provider_.get(),
1342 pass->shared_quad_state_list.back(), pass.get(),
1343 kOverlayTopLeftRect);
1344
1345 OverlayCandidateList candidate_list;
1346 RenderPassFilterList render_pass_filters;
1347 RenderPassFilterList render_pass_background_filters;
1348 overlay_processor_->ProcessForOverlays(
1349 resource_provider_.get(), pass.get(), render_pass_filters,
1350 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1351 &content_bounds_);
1352 EXPECT_EQ(0U, content_bounds_.size());
1353 }
1354
1355 TEST_F(UnderlayCastTest, FullScreenOverlayContentBounds) {
1356 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1357 CreateCandidateQuadAt(resource_provider_.get(),
1358 pass->shared_quad_state_list.back(), pass.get(),
1359 kOverlayRect);
1360
1361 OverlayCandidateList candidate_list;
1362 RenderPassFilterList render_pass_filters;
1363 RenderPassFilterList render_pass_background_filters;
1364 overlay_processor_->ProcessForOverlays(
1365 resource_provider_.get(), pass.get(), render_pass_filters,
1366 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1367 &content_bounds_);
1368
1369 EXPECT_EQ(1U, content_bounds_.size());
1370 EXPECT_TRUE(content_bounds_[0].IsEmpty());
1371 }
1372
1373 TEST_F(UnderlayCastTest, BlackOutsideOverlayContentBounds) {
1374 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1375 gfx::RectF(kOverlayBottomRightRect));
1376
1377 const gfx::Rect kLeftSide(0, 0, 128, 256);
1378 const gfx::Rect kTopRight(128, 0, 128, 128);
1379
1380 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1381 CreateCandidateQuadAt(resource_provider_.get(),
1382 pass->shared_quad_state_list.back(), pass.get(),
1383 kOverlayBottomRightRect);
1384 CreateOpaqueQuadAt(resource_provider_.get(),
1385 pass->shared_quad_state_list.back(), pass.get(), kLeftSide,
1386 SK_ColorBLACK);
1387 CreateOpaqueQuadAt(resource_provider_.get(),
1388 pass->shared_quad_state_list.back(), pass.get(), kTopRight,
1389 SK_ColorBLACK);
1390
1391 OverlayCandidateList candidate_list;
1392 RenderPassFilterList render_pass_filters;
1393 RenderPassFilterList render_pass_background_filters;
1394 overlay_processor_->ProcessForOverlays(
1395 resource_provider_.get(), pass.get(), render_pass_filters,
1396 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1397 &content_bounds_);
1398
1399 EXPECT_EQ(1U, content_bounds_.size());
1400 EXPECT_TRUE(content_bounds_[0].IsEmpty());
1401 }
1402
1403 TEST_F(UnderlayCastTest, OverlayOccludedContentBounds) {
1404 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1405 CreateOpaqueQuadAt(resource_provider_.get(),
1406 pass->shared_quad_state_list.back(), pass.get(),
1407 kOverlayTopLeftRect);
1408 CreateCandidateQuadAt(resource_provider_.get(),
1409 pass->shared_quad_state_list.back(), pass.get(),
1410 kOverlayRect);
1411
1412 OverlayCandidateList candidate_list;
1413 RenderPassFilterList render_pass_filters;
1414 RenderPassFilterList render_pass_background_filters;
1415 overlay_processor_->ProcessForOverlays(
1416 resource_provider_.get(), pass.get(), render_pass_filters,
1417 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1418 &content_bounds_);
1419
1420 EXPECT_EQ(1U, content_bounds_.size());
1421 EXPECT_EQ(kOverlayTopLeftRect, content_bounds_[0]);
1422 }
1423
1424 TEST_F(UnderlayCastTest, OverlayOccludedUnionContentBounds) {
1425 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1426 CreateOpaqueQuadAt(resource_provider_.get(),
1427 pass->shared_quad_state_list.back(), pass.get(),
1428 kOverlayTopLeftRect);
1429 CreateOpaqueQuadAt(resource_provider_.get(),
1430 pass->shared_quad_state_list.back(), pass.get(),
1431 kOverlayBottomRightRect);
1432 CreateCandidateQuadAt(resource_provider_.get(),
1433 pass->shared_quad_state_list.back(), pass.get(),
1434 kOverlayRect);
1435
1436 OverlayCandidateList candidate_list;
1437 RenderPassFilterList render_pass_filters;
1438 RenderPassFilterList render_pass_background_filters;
1439 overlay_processor_->ProcessForOverlays(
1440 resource_provider_.get(), pass.get(), render_pass_filters,
1441 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1442 &content_bounds_);
1443
1444 EXPECT_EQ(1U, content_bounds_.size());
1445 EXPECT_EQ(kOverlayRect, content_bounds_[0]);
1446 }
1447
1448 TEST_F(UnderlayCastTest, RoundOverlayContentBounds) {
1449 // Check rounding behaviour on overlay quads. Be conservative (content
1450 // potentially visible on boundary).
1451 const gfx::Rect overlay_rect(1, 1, 8, 8);
1452 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1453 gfx::RectF(1.5f, 1.5f, 8, 8));
1454
1455 gfx::Transform transform;
1456 transform.Translate(0.5f, 0.5f);
1457
1458 std::unique_ptr<RenderPass> pass = CreateRenderPassWithTransform(transform);
1459 CreateCandidateQuadAt(resource_provider_.get(),
1460 pass->shared_quad_state_list.back(), pass.get(),
1461 overlay_rect);
1462 CreateOpaqueQuadAt(resource_provider_.get(),
1463 pass->shared_quad_state_list.back(), pass.get(),
1464 gfx::Rect(0, 0, 10, 10), SK_ColorWHITE);
1465
1466 OverlayCandidateList candidate_list;
1467 RenderPassFilterList render_pass_filters;
1468 RenderPassFilterList render_pass_background_filters;
1469 overlay_processor_->ProcessForOverlays(
1470 resource_provider_.get(), pass.get(), render_pass_filters,
1471 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1472 &content_bounds_);
1473
1474 EXPECT_EQ(1U, content_bounds_.size());
1475 EXPECT_EQ(gfx::Rect(0, 0, 11, 11), content_bounds_[0]);
1476 }
1477
1478 TEST_F(UnderlayCastTest, RoundContentBounds) {
1479 // Check rounding behaviour on content quads (bounds should be enclosing
1480 // rect).
1481 gfx::Rect overlay_rect = kOverlayRect;
1482 overlay_rect.Inset(0, 0, 1, 1);
1483 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1484 gfx::RectF(0.5f, 0.5f, 255, 255));
1485
1486 gfx::Transform transform;
1487 transform.Translate(0.5f, 0.5f);
1488
1489 std::unique_ptr<RenderPass> pass = CreateRenderPassWithTransform(transform);
1490 CreateCandidateQuadAt(resource_provider_.get(),
1491 pass->shared_quad_state_list.back(), pass.get(),
1492 overlay_rect);
1493 CreateOpaqueQuadAt(resource_provider_.get(),
1494 pass->shared_quad_state_list.back(), pass.get(),
1495 gfx::Rect(0, 0, 255, 255), SK_ColorWHITE);
1496
1497 OverlayCandidateList candidate_list;
1498 RenderPassFilterList render_pass_filters;
1499 RenderPassFilterList render_pass_background_filters;
1500 overlay_processor_->ProcessForOverlays(
1501 resource_provider_.get(), pass.get(), render_pass_filters,
1502 render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
1503 &content_bounds_);
1504
1505 EXPECT_EQ(1U, content_bounds_.size());
1506 EXPECT_EQ(kOverlayRect, content_bounds_[0]);
1507 }
1508
1242 OverlayCandidateList BackbufferOverlayList(const RenderPass* root_render_pass) { 1509 OverlayCandidateList BackbufferOverlayList(const RenderPass* root_render_pass) {
1243 OverlayCandidateList list; 1510 OverlayCandidateList list;
1244 OverlayCandidate output_surface_plane; 1511 OverlayCandidate output_surface_plane;
1245 output_surface_plane.display_rect = gfx::RectF(root_render_pass->output_rect); 1512 output_surface_plane.display_rect = gfx::RectF(root_render_pass->output_rect);
1246 output_surface_plane.quad_rect_in_target_space = 1513 output_surface_plane.quad_rect_in_target_space =
1247 root_render_pass->output_rect; 1514 root_render_pass->output_rect;
1248 output_surface_plane.use_output_surface_for_resource = true; 1515 output_surface_plane.use_output_surface_for_resource = true;
1249 output_surface_plane.overlay_handled = true; 1516 output_surface_plane.overlay_handled = true;
1250 list.push_back(output_surface_plane); 1517 list.push_back(output_surface_plane);
1251 return list; 1518 return list;
1252 } 1519 }
1253 1520
1254 TEST_F(CALayerOverlayTest, AllowNonAxisAlignedTransform) { 1521 TEST_F(CALayerOverlayTest, AllowNonAxisAlignedTransform) {
1255 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1522 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1256 CreateFullscreenCandidateQuad(resource_provider_.get(), 1523 CreateFullscreenCandidateQuad(resource_provider_.get(),
1257 pass->shared_quad_state_list.back(), 1524 pass->shared_quad_state_list.back(),
1258 pass.get()); 1525 pass.get());
1259 pass->shared_quad_state_list.back() 1526 pass->shared_quad_state_list.back()
1260 ->quad_to_target_transform.RotateAboutZAxis(45.f); 1527 ->quad_to_target_transform.RotateAboutZAxis(45.f);
1261 1528
1262 gfx::Rect damage_rect; 1529 gfx::Rect damage_rect;
1263 CALayerOverlayList ca_layer_list; 1530 CALayerOverlayList ca_layer_list;
1264 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get())); 1531 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get()));
1265 RenderPassFilterList render_pass_filters; 1532 RenderPassFilterList render_pass_filters;
1266 RenderPassFilterList render_pass_background_filters; 1533 RenderPassFilterList render_pass_background_filters;
1267 overlay_processor_->ProcessForOverlays( 1534 overlay_processor_->ProcessForOverlays(
1268 resource_provider_.get(), pass.get(), render_pass_filters, 1535 resource_provider_.get(), pass.get(), render_pass_filters,
1269 render_pass_background_filters, &overlay_list, &ca_layer_list, 1536 render_pass_background_filters, &overlay_list, &ca_layer_list,
1270 &damage_rect); 1537 &damage_rect_, &content_bounds_);
1271 EXPECT_EQ(gfx::Rect(), damage_rect); 1538 EXPECT_EQ(gfx::Rect(), damage_rect);
1272 EXPECT_EQ(0U, overlay_list.size()); 1539 EXPECT_EQ(0U, overlay_list.size());
1273 EXPECT_EQ(1U, ca_layer_list.size()); 1540 EXPECT_EQ(1U, ca_layer_list.size());
1274 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); 1541 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
1275 } 1542 }
1276 1543
1277 TEST_F(CALayerOverlayTest, ThreeDTransform) { 1544 TEST_F(CALayerOverlayTest, ThreeDTransform) {
1278 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1545 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1279 CreateFullscreenCandidateQuad(resource_provider_.get(), 1546 CreateFullscreenCandidateQuad(resource_provider_.get(),
1280 pass->shared_quad_state_list.back(), 1547 pass->shared_quad_state_list.back(),
1281 pass.get()); 1548 pass.get());
1282 pass->shared_quad_state_list.back() 1549 pass->shared_quad_state_list.back()
1283 ->quad_to_target_transform.RotateAboutXAxis(45.f); 1550 ->quad_to_target_transform.RotateAboutXAxis(45.f);
1284 1551
1285 gfx::Rect damage_rect; 1552 gfx::Rect damage_rect;
1286 CALayerOverlayList ca_layer_list; 1553 CALayerOverlayList ca_layer_list;
1287 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get())); 1554 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get()));
1288 RenderPassFilterList render_pass_filters; 1555 RenderPassFilterList render_pass_filters;
1289 RenderPassFilterList render_pass_background_filters; 1556 RenderPassFilterList render_pass_background_filters;
1290 overlay_processor_->ProcessForOverlays( 1557 overlay_processor_->ProcessForOverlays(
1291 resource_provider_.get(), pass.get(), render_pass_filters, 1558 resource_provider_.get(), pass.get(), render_pass_filters,
1292 render_pass_background_filters, &overlay_list, &ca_layer_list, 1559 render_pass_background_filters, &overlay_list, &ca_layer_list,
1293 &damage_rect); 1560 &damage_rect_, &content_bounds_);
1294 EXPECT_EQ(0U, overlay_list.size()); 1561 EXPECT_EQ(0U, overlay_list.size());
1295 EXPECT_EQ(1U, ca_layer_list.size()); 1562 EXPECT_EQ(1U, ca_layer_list.size());
1296 gfx::Transform expected_transform; 1563 gfx::Transform expected_transform;
1297 expected_transform.RotateAboutXAxis(45.f); 1564 expected_transform.RotateAboutXAxis(45.f);
1298 gfx::Transform actual_transform(ca_layer_list.back().shared_state->transform); 1565 gfx::Transform actual_transform(ca_layer_list.back().shared_state->transform);
1299 EXPECT_EQ(expected_transform.ToString(), actual_transform.ToString()); 1566 EXPECT_EQ(expected_transform.ToString(), actual_transform.ToString());
1300 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); 1567 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
1301 } 1568 }
1302 1569
1303 TEST_F(CALayerOverlayTest, AllowContainingClip) { 1570 TEST_F(CALayerOverlayTest, AllowContainingClip) {
1304 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1571 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1305 CreateFullscreenCandidateQuad(resource_provider_.get(), 1572 CreateFullscreenCandidateQuad(resource_provider_.get(),
1306 pass->shared_quad_state_list.back(), 1573 pass->shared_quad_state_list.back(),
1307 pass.get()); 1574 pass.get());
1308 pass->shared_quad_state_list.back()->is_clipped = true; 1575 pass->shared_quad_state_list.back()->is_clipped = true;
1309 pass->shared_quad_state_list.back()->clip_rect = kOverlayRect; 1576 pass->shared_quad_state_list.back()->clip_rect = kOverlayRect;
1310 1577
1311 gfx::Rect damage_rect; 1578 gfx::Rect damage_rect;
1312 CALayerOverlayList ca_layer_list; 1579 CALayerOverlayList ca_layer_list;
1313 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get())); 1580 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get()));
1314 RenderPassFilterList render_pass_filters; 1581 RenderPassFilterList render_pass_filters;
1315 RenderPassFilterList render_pass_background_filters; 1582 RenderPassFilterList render_pass_background_filters;
1316 overlay_processor_->ProcessForOverlays( 1583 overlay_processor_->ProcessForOverlays(
1317 resource_provider_.get(), pass.get(), render_pass_filters, 1584 resource_provider_.get(), pass.get(), render_pass_filters,
1318 render_pass_background_filters, &overlay_list, &ca_layer_list, 1585 render_pass_background_filters, &overlay_list, &ca_layer_list,
1319 &damage_rect); 1586 &damage_rect_, &content_bounds_);
1320 EXPECT_EQ(gfx::Rect(), damage_rect); 1587 EXPECT_EQ(gfx::Rect(), damage_rect);
1321 EXPECT_EQ(0U, overlay_list.size()); 1588 EXPECT_EQ(0U, overlay_list.size());
1322 EXPECT_EQ(1U, ca_layer_list.size()); 1589 EXPECT_EQ(1U, ca_layer_list.size());
1323 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); 1590 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
1324 } 1591 }
1325 1592
1326 TEST_F(CALayerOverlayTest, NontrivialClip) { 1593 TEST_F(CALayerOverlayTest, NontrivialClip) {
1327 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1594 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1328 CreateFullscreenCandidateQuad(resource_provider_.get(), 1595 CreateFullscreenCandidateQuad(resource_provider_.get(),
1329 pass->shared_quad_state_list.back(), 1596 pass->shared_quad_state_list.back(),
1330 pass.get()); 1597 pass.get());
1331 pass->shared_quad_state_list.back()->is_clipped = true; 1598 pass->shared_quad_state_list.back()->is_clipped = true;
1332 pass->shared_quad_state_list.back()->clip_rect = gfx::Rect(64, 64, 128, 128); 1599 pass->shared_quad_state_list.back()->clip_rect = gfx::Rect(64, 64, 128, 128);
1333 1600
1334 gfx::Rect damage_rect; 1601 gfx::Rect damage_rect;
1335 CALayerOverlayList ca_layer_list; 1602 CALayerOverlayList ca_layer_list;
1336 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get())); 1603 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get()));
1337 RenderPassFilterList render_pass_filters; 1604 RenderPassFilterList render_pass_filters;
1338 RenderPassFilterList render_pass_background_filters; 1605 RenderPassFilterList render_pass_background_filters;
1339 overlay_processor_->ProcessForOverlays( 1606 overlay_processor_->ProcessForOverlays(
1340 resource_provider_.get(), pass.get(), render_pass_filters, 1607 resource_provider_.get(), pass.get(), render_pass_filters,
1341 render_pass_background_filters, &overlay_list, &ca_layer_list, 1608 render_pass_background_filters, &overlay_list, &ca_layer_list,
1342 &damage_rect); 1609 &damage_rect_, &content_bounds_);
1343 EXPECT_EQ(gfx::Rect(), damage_rect); 1610 EXPECT_EQ(gfx::Rect(), damage_rect);
1344 EXPECT_EQ(0U, overlay_list.size()); 1611 EXPECT_EQ(0U, overlay_list.size());
1345 EXPECT_EQ(1U, ca_layer_list.size()); 1612 EXPECT_EQ(1U, ca_layer_list.size());
1346 EXPECT_TRUE(ca_layer_list.back().shared_state->is_clipped); 1613 EXPECT_TRUE(ca_layer_list.back().shared_state->is_clipped);
1347 EXPECT_EQ(gfx::RectF(64, 64, 128, 128), 1614 EXPECT_EQ(gfx::RectF(64, 64, 128, 128),
1348 ca_layer_list.back().shared_state->clip_rect); 1615 ca_layer_list.back().shared_state->clip_rect);
1349 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); 1616 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
1350 } 1617 }
1351 1618
1352 TEST_F(CALayerOverlayTest, SkipTransparent) { 1619 TEST_F(CALayerOverlayTest, SkipTransparent) {
1353 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1620 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1354 CreateFullscreenCandidateQuad(resource_provider_.get(), 1621 CreateFullscreenCandidateQuad(resource_provider_.get(),
1355 pass->shared_quad_state_list.back(), 1622 pass->shared_quad_state_list.back(),
1356 pass.get()); 1623 pass.get());
1357 pass->shared_quad_state_list.back()->opacity = 0; 1624 pass->shared_quad_state_list.back()->opacity = 0;
1358 1625
1359 gfx::Rect damage_rect; 1626 gfx::Rect damage_rect;
1360 CALayerOverlayList ca_layer_list; 1627 CALayerOverlayList ca_layer_list;
1361 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get())); 1628 OverlayCandidateList overlay_list(BackbufferOverlayList(pass.get()));
1362 RenderPassFilterList render_pass_filters; 1629 RenderPassFilterList render_pass_filters;
1363 RenderPassFilterList render_pass_background_filters; 1630 RenderPassFilterList render_pass_background_filters;
1364 overlay_processor_->ProcessForOverlays( 1631 overlay_processor_->ProcessForOverlays(
1365 resource_provider_.get(), pass.get(), render_pass_filters, 1632 resource_provider_.get(), pass.get(), render_pass_filters,
1366 render_pass_background_filters, &overlay_list, &ca_layer_list, 1633 render_pass_background_filters, &overlay_list, &ca_layer_list,
1367 &damage_rect); 1634 &damage_rect_, &content_bounds_);
1368 EXPECT_EQ(gfx::Rect(), damage_rect); 1635 EXPECT_EQ(gfx::Rect(), damage_rect);
1369 EXPECT_EQ(0U, overlay_list.size()); 1636 EXPECT_EQ(0U, overlay_list.size());
1370 EXPECT_EQ(0U, ca_layer_list.size()); 1637 EXPECT_EQ(0U, ca_layer_list.size());
1371 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); 1638 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
1372 } 1639 }
1373 1640
1374 class OverlayInfoRendererGL : public GLRenderer { 1641 class OverlayInfoRendererGL : public GLRenderer {
1375 public: 1642 public:
1376 OverlayInfoRendererGL(const RendererSettings* settings, 1643 OverlayInfoRendererGL(const RendererSettings* settings,
1377 OutputSurface* output_surface, 1644 OutputSurface* output_surface,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 public: 1679 public:
1413 MOCK_METHOD5(Schedule, 1680 MOCK_METHOD5(Schedule,
1414 void(int plane_z_order, 1681 void(int plane_z_order,
1415 gfx::OverlayTransform plane_transform, 1682 gfx::OverlayTransform plane_transform,
1416 unsigned overlay_texture_id, 1683 unsigned overlay_texture_id,
1417 const gfx::Rect& display_bounds, 1684 const gfx::Rect& display_bounds,
1418 const gfx::RectF& uv_rect)); 1685 const gfx::RectF& uv_rect));
1419 }; 1686 };
1420 1687
1421 class GLRendererWithOverlaysTest : public testing::Test { 1688 class GLRendererWithOverlaysTest : public testing::Test {
1689 using OutputSurfaceType = OverlayOutputSurface<SingleOverlayValidator>;
1690
1422 protected: 1691 protected:
1423 GLRendererWithOverlaysTest() { 1692 GLRendererWithOverlaysTest() {
1424 provider_ = TestContextProvider::Create(); 1693 provider_ = TestContextProvider::Create();
1425 provider_->BindToCurrentThread(); 1694 provider_->BindToCurrentThread();
1426 output_surface_.reset(new OverlayOutputSurface(provider_)); 1695 output_surface_.reset(new OutputSurfaceType(provider_));
1427 output_surface_->BindToClient(&output_surface_client_); 1696 output_surface_->BindToClient(&output_surface_client_);
1428 resource_provider_ = FakeResourceProvider::Create(provider_.get(), nullptr); 1697 resource_provider_ = FakeResourceProvider::Create(provider_.get(), nullptr);
1429 1698
1430 provider_->support()->SetScheduleOverlayPlaneCallback(base::Bind( 1699 provider_->support()->SetScheduleOverlayPlaneCallback(base::Bind(
1431 &MockOverlayScheduler::Schedule, base::Unretained(&scheduler_))); 1700 &MockOverlayScheduler::Schedule, base::Unretained(&scheduler_)));
1432 } 1701 }
1433 1702
1434 void Init(bool use_validator) { 1703 void Init(bool use_validator) {
1435 if (use_validator) 1704 if (use_validator)
1436 output_surface_->SetOverlayCandidateValidator(new SingleOverlayValidator); 1705 output_surface_->SetOverlayCandidateValidator(new SingleOverlayValidator);
(...skipping 22 matching lines...) Expand all
1459 gpu::TextureInUseResponse response; 1728 gpu::TextureInUseResponse response;
1460 response.texture = lock.texture_id(); 1729 response.texture = lock.texture_id();
1461 response.in_use = false; 1730 response.in_use = false;
1462 gpu::TextureInUseResponses responses; 1731 gpu::TextureInUseResponses responses;
1463 responses.push_back(response); 1732 responses.push_back(response);
1464 renderer_->DidReceiveTextureInUseResponses(responses); 1733 renderer_->DidReceiveTextureInUseResponses(responses);
1465 } 1734 }
1466 1735
1467 RendererSettings settings_; 1736 RendererSettings settings_;
1468 FakeOutputSurfaceClient output_surface_client_; 1737 FakeOutputSurfaceClient output_surface_client_;
1469 std::unique_ptr<OverlayOutputSurface> output_surface_; 1738 std::unique_ptr<OutputSurfaceType> output_surface_;
1470 std::unique_ptr<ResourceProvider> resource_provider_; 1739 std::unique_ptr<ResourceProvider> resource_provider_;
1471 std::unique_ptr<OverlayInfoRendererGL> renderer_; 1740 std::unique_ptr<OverlayInfoRendererGL> renderer_;
1472 scoped_refptr<TestContextProvider> provider_; 1741 scoped_refptr<TestContextProvider> provider_;
1473 MockOverlayScheduler scheduler_; 1742 MockOverlayScheduler scheduler_;
1474 }; 1743 };
1475 1744
1476 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) { 1745 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
1477 bool use_validator = true; 1746 bool use_validator = true;
1478 Init(use_validator); 1747 Init(use_validator);
1479 renderer_->set_expect_overlays(true); 1748 renderer_->set_expect_overlays(true);
1749 output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
1750 gfx::RectF(kOverlayBottomRightRect));
1751
1480 gfx::Size viewport_size(16, 16); 1752 gfx::Size viewport_size(16, 16);
1481 1753
1482 std::unique_ptr<RenderPass> pass = CreateRenderPass(); 1754 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1483 1755
1484 CreateCandidateQuadAt(resource_provider_.get(), 1756 CreateCandidateQuadAt(resource_provider_.get(),
1485 pass->shared_quad_state_list.back(), pass.get(), 1757 pass->shared_quad_state_list.back(), pass.get(),
1486 kOverlayBottomRightRect); 1758 kOverlayBottomRightRect);
1487 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1759 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1488 pass->shared_quad_state_list.back(), pass.get()); 1760 pass->shared_quad_state_list.back(), pass.get());
1489 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1761 CreateFullscreenOpaqueQuad(resource_provider_.get(),
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
1897 quad_ = pass_->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); 2169 quad_ = pass_->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
1898 render_pass_id_ = 3; 2170 render_pass_id_ = 3;
1899 } 2171 }
1900 2172
1901 void ProcessForOverlays() { 2173 void ProcessForOverlays() {
1902 gfx::Rect damage_rect; 2174 gfx::Rect damage_rect;
1903 overlay_list_ = BackbufferOverlayList(pass_.get()); 2175 overlay_list_ = BackbufferOverlayList(pass_.get());
1904 overlay_processor_->ProcessForOverlays( 2176 overlay_processor_->ProcessForOverlays(
1905 resource_provider_.get(), pass_.get(), render_pass_filters_, 2177 resource_provider_.get(), pass_.get(), render_pass_filters_,
1906 render_pass_background_filters_, &overlay_list_, &ca_layer_list_, 2178 render_pass_background_filters_, &overlay_list_, &ca_layer_list_,
1907 &damage_rect); 2179 &damage_rect_, &content_bounds_);
1908 } 2180 }
1909 std::unique_ptr<RenderPass> pass_; 2181 std::unique_ptr<RenderPass> pass_;
1910 RenderPassDrawQuad* quad_; 2182 RenderPassDrawQuad* quad_;
1911 int render_pass_id_; 2183 int render_pass_id_;
1912 FilterOperations filters_; 2184 FilterOperations filters_;
1913 FilterOperations background_filters_; 2185 FilterOperations background_filters_;
1914 RenderPassFilterList render_pass_filters_; 2186 RenderPassFilterList render_pass_filters_;
1915 RenderPassFilterList render_pass_background_filters_; 2187 RenderPassFilterList render_pass_background_filters_;
1916 CALayerOverlayList ca_layer_list_; 2188 CALayerOverlayList ca_layer_list_;
1917 OverlayCandidateList overlay_list_; 2189 OverlayCandidateList overlay_list_;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2018 kOverlayRect, render_pass_id_, 2, gfx::Vector2dF(), 2290 kOverlayRect, render_pass_id_, 2, gfx::Vector2dF(),
2019 gfx::Size(), gfx::Vector2dF(1, 1), gfx::PointF()); 2291 gfx::Size(), gfx::Vector2dF(1, 1), gfx::PointF());
2020 } 2292 }
2021 2293
2022 ProcessForOverlays(); 2294 ProcessForOverlays();
2023 EXPECT_EQ(0U, ca_layer_list_.size()); 2295 EXPECT_EQ(0U, ca_layer_list_.size());
2024 } 2296 }
2025 2297
2026 } // namespace 2298 } // namespace
2027 } // namespace cc 2299 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_strategy_underlay_cast.cc ('k') | chromecast/browser/cast_browser_main_parts.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698