| OLD | NEW |
| 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 "cc/base/scoped_ptr_vector.h" | 5 #include "cc/base/scoped_ptr_vector.h" |
| 6 #include "cc/output/gl_renderer.h" | 6 #include "cc/output/gl_renderer.h" |
| 7 #include "cc/output/output_surface.h" | 7 #include "cc/output/output_surface.h" |
| 8 #include "cc/output/output_surface_client.h" | 8 #include "cc/output/output_surface_client.h" |
| 9 #include "cc/output/overlay_candidate_validator.h" | 9 #include "cc/output/overlay_candidate_validator.h" |
| 10 #include "cc/output/overlay_processor.h" | 10 #include "cc/output/overlay_processor.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 23 |
| 24 using testing::_; | 24 using testing::_; |
| 25 using testing::Mock; | 25 using testing::Mock; |
| 26 | 26 |
| 27 namespace cc { | 27 namespace cc { |
| 28 namespace { | 28 namespace { |
| 29 | 29 |
| 30 const gfx::Rect kOverlayRect(0, 0, 128, 128); | 30 const gfx::Rect kOverlayRect(0, 0, 128, 128); |
| 31 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); |
| 32 const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64); |
| 31 const gfx::PointF kUVTopLeft(0.1f, 0.2f); | 33 const gfx::PointF kUVTopLeft(0.1f, 0.2f); |
| 32 const gfx::PointF kUVBottomRight(1.0f, 1.0f); | 34 const gfx::PointF kUVBottomRight(1.0f, 1.0f); |
| 33 | 35 |
| 34 void MailboxReleased(unsigned sync_point, bool lost_resource) {} | 36 void MailboxReleased(unsigned sync_point, bool lost_resource) {} |
| 35 | 37 |
| 36 class SingleOverlayValidator : public OverlayCandidateValidator { | 38 class SingleOverlayValidator : public OverlayCandidateValidator { |
| 37 public: | 39 public: |
| 38 virtual void CheckOverlaySupport(OverlayCandidateList* surfaces) OVERRIDE; | 40 virtual void CheckOverlaySupport(OverlayCandidateList* surfaces) OVERRIDE; |
| 39 }; | 41 }; |
| 40 | 42 |
| 41 void SingleOverlayValidator::CheckOverlaySupport( | 43 void SingleOverlayValidator::CheckOverlaySupport( |
| 42 OverlayCandidateList* surfaces) { | 44 OverlayCandidateList* surfaces) { |
| 43 ASSERT_EQ(2U, surfaces->size()); | 45 ASSERT_EQ(2U, surfaces->size()); |
| 44 | 46 |
| 45 OverlayCandidate& candidate = surfaces->back(); | 47 OverlayCandidate& candidate = surfaces->back(); |
| 46 EXPECT_EQ(kOverlayRect.ToString(), candidate.display_rect.ToString()); | 48 if (candidate.display_rect.width() == 64) |
| 49 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); |
| 50 else |
| 51 EXPECT_EQ(kOverlayRect, candidate.display_rect); |
| 47 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), | 52 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), |
| 48 candidate.uv_rect.ToString()); | 53 candidate.uv_rect.ToString()); |
| 49 candidate.overlay_handled = true; | 54 candidate.overlay_handled = true; |
| 50 } | 55 } |
| 51 | 56 |
| 52 class SingleOverlayProcessor : public OverlayProcessor { | 57 class SingleOverlayProcessor : public OverlayProcessor { |
| 53 public: | 58 public: |
| 54 SingleOverlayProcessor(OutputSurface* surface, | 59 SingleOverlayProcessor(OutputSurface* surface, |
| 55 ResourceProvider* resource_provider); | 60 ResourceProvider* resource_provider); |
| 56 // Virtual to allow testing different strategies. | 61 // Virtual to allow testing different strategies. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 TextureMailbox mailbox = | 127 TextureMailbox mailbox = |
| 123 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); | 128 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
| 124 mailbox.set_allow_overlay(true); | 129 mailbox.set_allow_overlay(true); |
| 125 scoped_ptr<SingleReleaseCallback> release_callback = | 130 scoped_ptr<SingleReleaseCallback> release_callback = |
| 126 SingleReleaseCallback::Create(base::Bind(&MailboxReleased)); | 131 SingleReleaseCallback::Create(base::Bind(&MailboxReleased)); |
| 127 | 132 |
| 128 return resource_provider->CreateResourceFromTextureMailbox( | 133 return resource_provider->CreateResourceFromTextureMailbox( |
| 129 mailbox, release_callback.Pass()); | 134 mailbox, release_callback.Pass()); |
| 130 } | 135 } |
| 131 | 136 |
| 132 TextureDrawQuad* CreateCandidateQuad(ResourceProvider* resource_provider, | 137 TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider, |
| 133 const SharedQuadState* shared_quad_state, | 138 const SharedQuadState* shared_quad_state, |
| 134 RenderPass* render_pass) { | 139 RenderPass* render_pass, |
| 140 const gfx::Rect& rect) { |
| 135 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider); | 141 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider); |
| 136 bool premultiplied_alpha = false; | 142 bool premultiplied_alpha = false; |
| 137 bool flipped = false; | 143 bool flipped = false; |
| 138 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 144 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 139 | 145 |
| 140 TextureDrawQuad* overlay_quad = | 146 TextureDrawQuad* overlay_quad = |
| 141 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 147 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 142 overlay_quad->SetNew(shared_quad_state, | 148 overlay_quad->SetNew(shared_quad_state, |
| 143 kOverlayRect, | 149 rect, |
| 144 kOverlayRect, | 150 rect, |
| 145 kOverlayRect, | 151 rect, |
| 146 resource_id, | 152 resource_id, |
| 147 premultiplied_alpha, | 153 premultiplied_alpha, |
| 148 kUVTopLeft, | 154 kUVTopLeft, |
| 149 kUVBottomRight, | 155 kUVBottomRight, |
| 150 SK_ColorTRANSPARENT, | 156 SK_ColorTRANSPARENT, |
| 151 vertex_opacity, | 157 vertex_opacity, |
| 152 flipped); | 158 flipped); |
| 153 | 159 |
| 154 return overlay_quad; | 160 return overlay_quad; |
| 155 } | 161 } |
| 156 | 162 |
| 157 void CreateCheckeredQuad(ResourceProvider* resource_provider, | 163 TextureDrawQuad* CreateFullscreenCandidateQuad( |
| 158 const SharedQuadState* shared_quad_state, | 164 ResourceProvider* resource_provider, |
| 159 RenderPass* render_pass) { | 165 const SharedQuadState* shared_quad_state, |
| 166 RenderPass* render_pass) { |
| 167 return CreateCandidateQuadAt( |
| 168 resource_provider, shared_quad_state, render_pass, kOverlayRect); |
| 169 } |
| 170 |
| 171 void CreateCheckeredQuadAt(ResourceProvider* resource_provider, |
| 172 const SharedQuadState* shared_quad_state, |
| 173 RenderPass* render_pass, |
| 174 const gfx::Rect& rect) { |
| 160 CheckerboardDrawQuad* checkerboard_quad = | 175 CheckerboardDrawQuad* checkerboard_quad = |
| 161 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); | 176 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); |
| 162 checkerboard_quad->SetNew( | 177 checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor()); |
| 163 shared_quad_state, kOverlayRect, kOverlayRect, SkColor()); | 178 } |
| 179 |
| 180 void CreateFullscreenCheckeredQuad(ResourceProvider* resource_provider, |
| 181 const SharedQuadState* shared_quad_state, |
| 182 RenderPass* render_pass) { |
| 183 CreateCheckeredQuadAt( |
| 184 resource_provider, shared_quad_state, render_pass, kOverlayRect); |
| 164 } | 185 } |
| 165 | 186 |
| 166 static void CompareRenderPassLists(const RenderPassList& expected_list, | 187 static void CompareRenderPassLists(const RenderPassList& expected_list, |
| 167 const RenderPassList& actual_list) { | 188 const RenderPassList& actual_list) { |
| 168 EXPECT_EQ(expected_list.size(), actual_list.size()); | 189 EXPECT_EQ(expected_list.size(), actual_list.size()); |
| 169 for (size_t i = 0; i < actual_list.size(); ++i) { | 190 for (size_t i = 0; i < actual_list.size(); ++i) { |
| 170 RenderPass* expected = expected_list[i]; | 191 RenderPass* expected = expected_list[i]; |
| 171 RenderPass* actual = actual_list[i]; | 192 RenderPass* actual = actual_list[i]; |
| 172 | 193 |
| 173 EXPECT_EQ(expected->id, actual->id); | 194 EXPECT_EQ(expected->id, actual->id); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 scoped_ptr<OverlayOutputSurface> output_surface_; | 264 scoped_ptr<OverlayOutputSurface> output_surface_; |
| 244 FakeOutputSurfaceClient client_; | 265 FakeOutputSurfaceClient client_; |
| 245 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 266 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| 246 scoped_ptr<ResourceProvider> resource_provider_; | 267 scoped_ptr<ResourceProvider> resource_provider_; |
| 247 scoped_ptr<SingleOverlayProcessor> overlay_processor_; | 268 scoped_ptr<SingleOverlayProcessor> overlay_processor_; |
| 248 }; | 269 }; |
| 249 | 270 |
| 250 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { | 271 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { |
| 251 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 272 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 252 TextureDrawQuad* original_quad = | 273 TextureDrawQuad* original_quad = |
| 253 CreateCandidateQuad(resource_provider_.get(), | 274 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 254 pass->shared_quad_state_list.back(), | 275 pass->shared_quad_state_list.back(), |
| 255 pass.get()); | 276 pass.get()); |
| 256 unsigned original_resource_id = original_quad->resource_id; | 277 unsigned original_resource_id = original_quad->resource_id; |
| 257 | 278 |
| 258 // Add something behind it. | 279 // Add something behind it. |
| 259 CreateCheckeredQuad(resource_provider_.get(), | 280 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 260 pass->shared_quad_state_list.back(), | 281 pass->shared_quad_state_list.back(), |
| 261 pass.get()); | 282 pass.get()); |
| 262 CreateCheckeredQuad(resource_provider_.get(), | 283 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 263 pass->shared_quad_state_list.back(), | 284 pass->shared_quad_state_list.back(), |
| 264 pass.get()); | 285 pass.get()); |
| 265 | 286 |
| 266 RenderPassList pass_list; | 287 RenderPassList pass_list; |
| 267 pass_list.push_back(pass.Pass()); | 288 pass_list.push_back(pass.Pass()); |
| 268 | 289 |
| 269 // Check for potential candidates. | 290 // Check for potential candidates. |
| 270 OverlayCandidateList candidate_list; | 291 OverlayCandidateList candidate_list; |
| 271 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 292 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 272 | 293 |
| 273 ASSERT_EQ(1U, pass_list.size()); | 294 ASSERT_EQ(1U, pass_list.size()); |
| 274 ASSERT_EQ(2U, candidate_list.size()); | 295 ASSERT_EQ(2U, candidate_list.size()); |
| 275 | 296 |
| 276 RenderPass* main_pass = pass_list.back(); | 297 RenderPass* main_pass = pass_list.back(); |
| 277 // Check that the quad is gone. | 298 // Check that the quad is gone. |
| 278 EXPECT_EQ(2U, main_pass->quad_list.size()); | 299 EXPECT_EQ(2U, main_pass->quad_list.size()); |
| 279 const QuadList& quad_list = main_pass->quad_list; | 300 const QuadList& quad_list = main_pass->quad_list; |
| 280 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); | 301 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); |
| 281 it != quad_list.BackToFrontEnd(); | 302 it != quad_list.BackToFrontEnd(); |
| 282 ++it) { | 303 ++it) { |
| 283 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, (*it)->material); | 304 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, (*it)->material); |
| 284 } | 305 } |
| 285 | 306 |
| 286 // Check that the right resource id got extracted. | 307 // Check that the right resource id got extracted. |
| 287 EXPECT_EQ(original_resource_id, candidate_list.back().resource_id); | 308 EXPECT_EQ(original_resource_id, candidate_list.back().resource_id); |
| 288 } | 309 } |
| 289 | 310 |
| 290 TEST_F(SingleOverlayOnTopTest, NoCandidates) { | 311 TEST_F(SingleOverlayOnTopTest, NoCandidates) { |
| 291 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 312 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 292 CreateCheckeredQuad(resource_provider_.get(), | 313 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 293 pass->shared_quad_state_list.back(), | 314 pass->shared_quad_state_list.back(), |
| 294 pass.get()); | 315 pass.get()); |
| 295 CreateCheckeredQuad(resource_provider_.get(), | 316 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 296 pass->shared_quad_state_list.back(), | 317 pass->shared_quad_state_list.back(), |
| 297 pass.get()); | 318 pass.get()); |
| 298 | 319 |
| 299 RenderPassList pass_list; | 320 RenderPassList pass_list; |
| 300 pass_list.push_back(pass.Pass()); | 321 pass_list.push_back(pass.Pass()); |
| 301 | 322 |
| 302 RenderPassList original_pass_list; | 323 RenderPassList original_pass_list; |
| 303 RenderPass::CopyAll(pass_list, &original_pass_list); | 324 RenderPass::CopyAll(pass_list, &original_pass_list); |
| 304 | 325 |
| 305 OverlayCandidateList candidate_list; | 326 OverlayCandidateList candidate_list; |
| 306 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 327 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 307 EXPECT_EQ(0U, candidate_list.size()); | 328 EXPECT_EQ(0U, candidate_list.size()); |
| 308 // There should be nothing new here. | 329 // There should be nothing new here. |
| 309 CompareRenderPassLists(pass_list, original_pass_list); | 330 CompareRenderPassLists(pass_list, original_pass_list); |
| 310 } | 331 } |
| 311 | 332 |
| 312 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { | 333 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { |
| 313 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 334 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 314 CreateCheckeredQuad(resource_provider_.get(), | 335 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 315 pass->shared_quad_state_list.back(), | 336 pass->shared_quad_state_list.back(), |
| 316 pass.get()); | 337 pass.get()); |
| 317 CreateCheckeredQuad(resource_provider_.get(), | 338 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 318 pass->shared_quad_state_list.back(), | 339 pass->shared_quad_state_list.back(), |
| 319 pass.get()); | 340 pass.get()); |
| 320 | 341 |
| 321 CreateCandidateQuad(resource_provider_.get(), | 342 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 322 pass->shared_quad_state_list.back(), | 343 pass->shared_quad_state_list.back(), |
| 323 pass.get()); | 344 pass.get()); |
| 324 | 345 |
| 325 RenderPassList pass_list; | 346 RenderPassList pass_list; |
| 326 pass_list.push_back(pass.Pass()); | 347 pass_list.push_back(pass.Pass()); |
| 327 | 348 |
| 328 RenderPassList original_pass_list; | 349 RenderPassList original_pass_list; |
| 329 RenderPass::CopyAll(pass_list, &original_pass_list); | 350 RenderPass::CopyAll(pass_list, &original_pass_list); |
| 330 | 351 |
| 331 OverlayCandidateList candidate_list; | 352 OverlayCandidateList candidate_list; |
| 332 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 353 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 333 EXPECT_EQ(0U, candidate_list.size()); | 354 EXPECT_EQ(0U, candidate_list.size()); |
| 334 // There should be nothing new here. | 355 // There should be nothing new here. |
| 335 CompareRenderPassLists(pass_list, original_pass_list); | 356 CompareRenderPassLists(pass_list, original_pass_list); |
| 336 } | 357 } |
| 337 | 358 |
| 338 // Test with multiple render passes. | 359 // Test with multiple render passes. |
| 339 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { | 360 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { |
| 340 RenderPassList pass_list; | 361 RenderPassList pass_list; |
| 341 pass_list.push_back(CreateRenderPass()); | 362 pass_list.push_back(CreateRenderPass()); |
| 342 | 363 |
| 343 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 364 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 344 CreateCandidateQuad(resource_provider_.get(), | 365 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 345 pass->shared_quad_state_list.back(), | 366 pass->shared_quad_state_list.back(), |
| 346 pass.get()); | 367 pass.get()); |
| 347 | 368 |
| 348 // Add something behind it. | 369 // Add something behind it. |
| 349 CreateCheckeredQuad(resource_provider_.get(), | 370 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 350 pass->shared_quad_state_list.back(), | 371 pass->shared_quad_state_list.back(), |
| 351 pass.get()); | 372 pass.get()); |
| 352 CreateCheckeredQuad(resource_provider_.get(), | 373 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 353 pass->shared_quad_state_list.back(), | 374 pass->shared_quad_state_list.back(), |
| 354 pass.get()); | 375 pass.get()); |
| 355 | 376 |
| 356 pass_list.push_back(pass.Pass()); | 377 pass_list.push_back(pass.Pass()); |
| 357 | 378 |
| 358 RenderPassList original_pass_list; | 379 RenderPassList original_pass_list; |
| 359 RenderPass::CopyAll(pass_list, &original_pass_list); | 380 RenderPass::CopyAll(pass_list, &original_pass_list); |
| 360 | 381 |
| 361 // Check for potential candidates. | 382 // Check for potential candidates. |
| 362 OverlayCandidateList candidate_list; | 383 OverlayCandidateList candidate_list; |
| 363 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 384 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 364 EXPECT_EQ(2U, candidate_list.size()); | 385 EXPECT_EQ(2U, candidate_list.size()); |
| 365 | 386 |
| 366 // This should be the same. | 387 // This should be the same. |
| 367 ASSERT_EQ(2U, pass_list.size()); | 388 ASSERT_EQ(2U, pass_list.size()); |
| 368 } | 389 } |
| 369 | 390 |
| 370 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) { | 391 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) { |
| 371 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 392 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 372 TextureDrawQuad* quad = | 393 TextureDrawQuad* quad = |
| 373 CreateCandidateQuad(resource_provider_.get(), | 394 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 374 pass->shared_quad_state_list.back(), | 395 pass->shared_quad_state_list.back(), |
| 375 pass.get()); | 396 pass.get()); |
| 376 quad->premultiplied_alpha = true; | 397 quad->premultiplied_alpha = true; |
| 377 | 398 |
| 378 RenderPassList pass_list; | 399 RenderPassList pass_list; |
| 379 pass_list.push_back(pass.Pass()); | 400 pass_list.push_back(pass.Pass()); |
| 380 OverlayCandidateList candidate_list; | 401 OverlayCandidateList candidate_list; |
| 381 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 402 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 382 EXPECT_EQ(1U, pass_list.size()); | 403 EXPECT_EQ(1U, pass_list.size()); |
| 383 EXPECT_EQ(0U, candidate_list.size()); | 404 EXPECT_EQ(0U, candidate_list.size()); |
| 384 } | 405 } |
| 385 | 406 |
| 386 TEST_F(SingleOverlayOnTopTest, RejectBlending) { | 407 TEST_F(SingleOverlayOnTopTest, RejectBlending) { |
| 387 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 408 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 388 TextureDrawQuad* quad = | 409 TextureDrawQuad* quad = |
| 389 CreateCandidateQuad(resource_provider_.get(), | 410 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 390 pass->shared_quad_state_list.back(), | 411 pass->shared_quad_state_list.back(), |
| 391 pass.get()); | 412 pass.get()); |
| 392 quad->needs_blending = true; | 413 quad->needs_blending = true; |
| 393 | 414 |
| 394 RenderPassList pass_list; | 415 RenderPassList pass_list; |
| 395 pass_list.push_back(pass.Pass()); | 416 pass_list.push_back(pass.Pass()); |
| 396 OverlayCandidateList candidate_list; | 417 OverlayCandidateList candidate_list; |
| 397 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 418 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 398 ASSERT_EQ(1U, pass_list.size()); | 419 ASSERT_EQ(1U, pass_list.size()); |
| 399 EXPECT_EQ(0U, candidate_list.size()); | 420 EXPECT_EQ(0U, candidate_list.size()); |
| 400 } | 421 } |
| 401 | 422 |
| 402 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { | 423 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { |
| 403 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 424 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 404 TextureDrawQuad* quad = | 425 TextureDrawQuad* quad = |
| 405 CreateCandidateQuad(resource_provider_.get(), | 426 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 406 pass->shared_quad_state_list.back(), | 427 pass->shared_quad_state_list.back(), |
| 407 pass.get()); | 428 pass.get()); |
| 408 quad->background_color = SK_ColorBLACK; | 429 quad->background_color = SK_ColorBLACK; |
| 409 | 430 |
| 410 RenderPassList pass_list; | 431 RenderPassList pass_list; |
| 411 pass_list.push_back(pass.Pass()); | 432 pass_list.push_back(pass.Pass()); |
| 412 OverlayCandidateList candidate_list; | 433 OverlayCandidateList candidate_list; |
| 413 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 434 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 414 ASSERT_EQ(1U, pass_list.size()); | 435 ASSERT_EQ(1U, pass_list.size()); |
| 415 EXPECT_EQ(0U, candidate_list.size()); | 436 EXPECT_EQ(0U, candidate_list.size()); |
| 416 } | 437 } |
| 417 | 438 |
| 418 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { | 439 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { |
| 419 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 440 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 420 CreateCandidateQuad(resource_provider_.get(), | 441 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 421 pass->shared_quad_state_list.back(), | 442 pass->shared_quad_state_list.back(), |
| 422 pass.get()); | 443 pass.get()); |
| 423 pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode; | 444 pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode; |
| 424 | 445 |
| 425 RenderPassList pass_list; | 446 RenderPassList pass_list; |
| 426 pass_list.push_back(pass.Pass()); | 447 pass_list.push_back(pass.Pass()); |
| 427 OverlayCandidateList candidate_list; | 448 OverlayCandidateList candidate_list; |
| 428 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 449 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 429 ASSERT_EQ(1U, pass_list.size()); | 450 ASSERT_EQ(1U, pass_list.size()); |
| 430 EXPECT_EQ(0U, candidate_list.size()); | 451 EXPECT_EQ(0U, candidate_list.size()); |
| 431 } | 452 } |
| 432 | 453 |
| 433 TEST_F(SingleOverlayOnTopTest, RejectOpacity) { | 454 TEST_F(SingleOverlayOnTopTest, RejectOpacity) { |
| 434 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 455 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 435 CreateCandidateQuad(resource_provider_.get(), | 456 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 436 pass->shared_quad_state_list.back(), | 457 pass->shared_quad_state_list.back(), |
| 437 pass.get()); | 458 pass.get()); |
| 438 pass->shared_quad_state_list.back()->opacity = 0.5f; | 459 pass->shared_quad_state_list.back()->opacity = 0.5f; |
| 439 | 460 |
| 440 RenderPassList pass_list; | 461 RenderPassList pass_list; |
| 441 pass_list.push_back(pass.Pass()); | 462 pass_list.push_back(pass.Pass()); |
| 442 OverlayCandidateList candidate_list; | 463 OverlayCandidateList candidate_list; |
| 443 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 464 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 444 ASSERT_EQ(1U, pass_list.size()); | 465 ASSERT_EQ(1U, pass_list.size()); |
| 445 EXPECT_EQ(0U, candidate_list.size()); | 466 EXPECT_EQ(0U, candidate_list.size()); |
| 446 } | 467 } |
| 447 | 468 |
| 448 TEST_F(SingleOverlayOnTopTest, RejectTransform) { | 469 TEST_F(SingleOverlayOnTopTest, RejectTransform) { |
| 449 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 470 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 450 CreateCandidateQuad(resource_provider_.get(), | 471 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 451 pass->shared_quad_state_list.back(), | 472 pass->shared_quad_state_list.back(), |
| 452 pass.get()); | 473 pass.get()); |
| 453 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, | 474 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, |
| 454 2.f); | 475 2.f); |
| 455 | 476 |
| 456 RenderPassList pass_list; | 477 RenderPassList pass_list; |
| 457 pass_list.push_back(pass.Pass()); | 478 pass_list.push_back(pass.Pass()); |
| 458 OverlayCandidateList candidate_list; | 479 OverlayCandidateList candidate_list; |
| 459 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 480 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 460 ASSERT_EQ(1U, pass_list.size()); | 481 ASSERT_EQ(1U, pass_list.size()); |
| 461 EXPECT_EQ(0U, candidate_list.size()); | 482 EXPECT_EQ(0U, candidate_list.size()); |
| 462 } | 483 } |
| 463 | 484 |
| 485 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { |
| 486 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 487 CreateCheckeredQuadAt(resource_provider_.get(), |
| 488 pass->shared_quad_state_list.back(), |
| 489 pass.get(), |
| 490 kOverlayTopLeftRect); |
| 491 CreateCandidateQuadAt(resource_provider_.get(), |
| 492 pass->shared_quad_state_list.back(), |
| 493 pass.get(), |
| 494 kOverlayBottomRightRect); |
| 495 |
| 496 RenderPassList pass_list; |
| 497 pass_list.push_back(pass.Pass()); |
| 498 |
| 499 RenderPassList original_pass_list; |
| 500 RenderPass::CopyAll(pass_list, &original_pass_list); |
| 501 |
| 502 OverlayCandidateList candidate_list; |
| 503 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 504 EXPECT_EQ(1U, pass_list.size()); |
| 505 EXPECT_EQ(2U, candidate_list.size()); |
| 506 } |
| 507 |
| 464 class OverlayInfoRendererGL : public GLRenderer { | 508 class OverlayInfoRendererGL : public GLRenderer { |
| 465 public: | 509 public: |
| 466 OverlayInfoRendererGL(RendererClient* client, | 510 OverlayInfoRendererGL(RendererClient* client, |
| 467 const LayerTreeSettings* settings, | 511 const LayerTreeSettings* settings, |
| 468 OutputSurface* output_surface, | 512 OutputSurface* output_surface, |
| 469 ResourceProvider* resource_provider) | 513 ResourceProvider* resource_provider) |
| 470 : GLRenderer(client, | 514 : GLRenderer(client, |
| 471 settings, | 515 settings, |
| 472 output_surface, | 516 output_surface, |
| 473 resource_provider, | 517 resource_provider, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 }; | 596 }; |
| 553 | 597 |
| 554 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) { | 598 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) { |
| 555 bool use_validator = true; | 599 bool use_validator = true; |
| 556 Init(use_validator); | 600 Init(use_validator); |
| 557 renderer_->set_expect_overlays(true); | 601 renderer_->set_expect_overlays(true); |
| 558 gfx::Rect viewport_rect(16, 16); | 602 gfx::Rect viewport_rect(16, 16); |
| 559 | 603 |
| 560 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 604 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 561 | 605 |
| 562 CreateCandidateQuad(resource_provider_.get(), | 606 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 563 pass->shared_quad_state_list.back(), | 607 pass->shared_quad_state_list.back(), |
| 564 pass.get()); | 608 pass.get()); |
| 565 | 609 |
| 566 CreateCheckeredQuad(resource_provider_.get(), | 610 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 567 pass->shared_quad_state_list.back(), | 611 pass->shared_quad_state_list.back(), |
| 568 pass.get()); | 612 pass.get()); |
| 569 CreateCheckeredQuad(resource_provider_.get(), | 613 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 570 pass->shared_quad_state_list.back(), | 614 pass->shared_quad_state_list.back(), |
| 571 pass.get()); | 615 pass.get()); |
| 572 | 616 |
| 573 RenderPassList pass_list; | 617 RenderPassList pass_list; |
| 574 pass_list.push_back(pass.Pass()); | 618 pass_list.push_back(pass.Pass()); |
| 575 | 619 |
| 576 // Candidate pass was taken out and extra skipped pass added, | 620 // Candidate pass was taken out and extra skipped pass added, |
| 577 // so only draw 2 quads. | 621 // so only draw 2 quads. |
| 578 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(2); | 622 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(2); |
| 579 EXPECT_CALL(scheduler_, | 623 EXPECT_CALL(scheduler_, |
| 580 Schedule(1, | 624 Schedule(1, |
| 581 gfx::OVERLAY_TRANSFORM_NONE, | 625 gfx::OVERLAY_TRANSFORM_NONE, |
| 582 _, | 626 _, |
| 583 kOverlayRect, | 627 kOverlayRect, |
| 584 BoundingRect(kUVTopLeft, kUVBottomRight))).Times(1); | 628 BoundingRect(kUVTopLeft, kUVBottomRight))).Times(1); |
| 585 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); | 629 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); |
| 586 | 630 |
| 587 SwapBuffers(); | 631 SwapBuffers(); |
| 588 | 632 |
| 589 Mock::VerifyAndClearExpectations(renderer_.get()); | 633 Mock::VerifyAndClearExpectations(renderer_.get()); |
| 590 Mock::VerifyAndClearExpectations(&scheduler_); | 634 Mock::VerifyAndClearExpectations(&scheduler_); |
| 591 } | 635 } |
| 592 | 636 |
| 593 TEST_F(GLRendererWithOverlaysTest, OccludedQuadDrawn) { | 637 TEST_F(GLRendererWithOverlaysTest, OccludedQuadDrawn) { |
| 594 bool use_validator = true; | 638 bool use_validator = true; |
| 595 Init(use_validator); | 639 Init(use_validator); |
| 596 renderer_->set_expect_overlays(false); | 640 renderer_->set_expect_overlays(false); |
| 597 gfx::Rect viewport_rect(16, 16); | 641 gfx::Rect viewport_rect(16, 16); |
| 598 | 642 |
| 599 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 643 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 600 | 644 |
| 601 CreateCheckeredQuad(resource_provider_.get(), | 645 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 602 pass->shared_quad_state_list.back(), | 646 pass->shared_quad_state_list.back(), |
| 603 pass.get()); | 647 pass.get()); |
| 604 CreateCheckeredQuad(resource_provider_.get(), | 648 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 605 pass->shared_quad_state_list.back(), | 649 pass->shared_quad_state_list.back(), |
| 606 pass.get()); | 650 pass.get()); |
| 607 | 651 |
| 608 CreateCandidateQuad(resource_provider_.get(), | 652 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 609 pass->shared_quad_state_list.back(), | 653 pass->shared_quad_state_list.back(), |
| 610 pass.get()); | 654 pass.get()); |
| 611 | 655 |
| 612 RenderPassList pass_list; | 656 RenderPassList pass_list; |
| 613 pass_list.push_back(pass.Pass()); | 657 pass_list.push_back(pass.Pass()); |
| 614 | 658 |
| 615 // 3 quads in the pass, all should draw. | 659 // 3 quads in the pass, all should draw. |
| 616 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3); | 660 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3); |
| 617 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0); | 661 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0); |
| 618 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); | 662 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); |
| 619 | 663 |
| 620 SwapBuffers(); | 664 SwapBuffers(); |
| 621 | 665 |
| 622 Mock::VerifyAndClearExpectations(renderer_.get()); | 666 Mock::VerifyAndClearExpectations(renderer_.get()); |
| 623 Mock::VerifyAndClearExpectations(&scheduler_); | 667 Mock::VerifyAndClearExpectations(&scheduler_); |
| 624 } | 668 } |
| 625 | 669 |
| 626 TEST_F(GLRendererWithOverlaysTest, NoValidatorNoOverlay) { | 670 TEST_F(GLRendererWithOverlaysTest, NoValidatorNoOverlay) { |
| 627 bool use_validator = false; | 671 bool use_validator = false; |
| 628 Init(use_validator); | 672 Init(use_validator); |
| 629 renderer_->set_expect_overlays(false); | 673 renderer_->set_expect_overlays(false); |
| 630 gfx::Rect viewport_rect(16, 16); | 674 gfx::Rect viewport_rect(16, 16); |
| 631 | 675 |
| 632 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 676 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 633 | 677 |
| 634 CreateCandidateQuad(resource_provider_.get(), | 678 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 635 pass->shared_quad_state_list.back(), | 679 pass->shared_quad_state_list.back(), |
| 636 pass.get()); | 680 pass.get()); |
| 637 | 681 |
| 638 CreateCheckeredQuad(resource_provider_.get(), | 682 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 639 pass->shared_quad_state_list.back(), | 683 pass->shared_quad_state_list.back(), |
| 640 pass.get()); | 684 pass.get()); |
| 641 CreateCheckeredQuad(resource_provider_.get(), | 685 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 642 pass->shared_quad_state_list.back(), | 686 pass->shared_quad_state_list.back(), |
| 643 pass.get()); | 687 pass.get()); |
| 644 | 688 |
| 645 RenderPassList pass_list; | 689 RenderPassList pass_list; |
| 646 pass_list.push_back(pass.Pass()); | 690 pass_list.push_back(pass.Pass()); |
| 647 | 691 |
| 648 // Should see no overlays. | 692 // Should see no overlays. |
| 649 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3); | 693 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3); |
| 650 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0); | 694 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0); |
| 651 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); | 695 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); |
| 652 | 696 |
| 653 SwapBuffers(); | 697 SwapBuffers(); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 renderer_->set_expect_overlays(false); | 775 renderer_->set_expect_overlays(false); |
| 732 renderer_->FinishDrawingFrame(&frame3); | 776 renderer_->FinishDrawingFrame(&frame3); |
| 733 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 777 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
| 734 SwapBuffers(); | 778 SwapBuffers(); |
| 735 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 779 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
| 736 Mock::VerifyAndClearExpectations(&scheduler_); | 780 Mock::VerifyAndClearExpectations(&scheduler_); |
| 737 } | 781 } |
| 738 | 782 |
| 739 } // namespace | 783 } // namespace |
| 740 } // namespace cc | 784 } // namespace cc |
| OLD | NEW |