Chromium Code Reviews| 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) |
|
danakj
2014/08/06 15:52:59
need {} on the if and the else, since the body is
| |
| 49 EXPECT_EQ(kOverlayBottomRightRect.ToString(), | |
|
danakj
2014/08/06 15:52:59
we don't need to ToString() rects anymore, it happ
achaulk
2014/08/06 16:00:10
Done.
| |
| 50 candidate.display_rect.ToString()); | |
| 51 else | |
| 52 EXPECT_EQ(kOverlayRect.ToString(), candidate.display_rect.ToString()); | |
| 47 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), | 53 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), |
| 48 candidate.uv_rect.ToString()); | 54 candidate.uv_rect.ToString()); |
| 49 candidate.overlay_handled = true; | 55 candidate.overlay_handled = true; |
| 50 } | 56 } |
| 51 | 57 |
| 52 class SingleOverlayProcessor : public OverlayProcessor { | 58 class SingleOverlayProcessor : public OverlayProcessor { |
| 53 public: | 59 public: |
| 54 SingleOverlayProcessor(OutputSurface* surface, | 60 SingleOverlayProcessor(OutputSurface* surface, |
| 55 ResourceProvider* resource_provider); | 61 ResourceProvider* resource_provider); |
| 56 // Virtual to allow testing different strategies. | 62 // Virtual to allow testing different strategies. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 TextureMailbox mailbox = | 128 TextureMailbox mailbox = |
| 123 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); | 129 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
| 124 mailbox.set_allow_overlay(true); | 130 mailbox.set_allow_overlay(true); |
| 125 scoped_ptr<SingleReleaseCallback> release_callback = | 131 scoped_ptr<SingleReleaseCallback> release_callback = |
| 126 SingleReleaseCallback::Create(base::Bind(&MailboxReleased)); | 132 SingleReleaseCallback::Create(base::Bind(&MailboxReleased)); |
| 127 | 133 |
| 128 return resource_provider->CreateResourceFromTextureMailbox( | 134 return resource_provider->CreateResourceFromTextureMailbox( |
| 129 mailbox, release_callback.Pass()); | 135 mailbox, release_callback.Pass()); |
| 130 } | 136 } |
| 131 | 137 |
| 132 TextureDrawQuad* CreateCandidateQuad(ResourceProvider* resource_provider, | 138 TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider, |
| 133 const SharedQuadState* shared_quad_state, | 139 const SharedQuadState* shared_quad_state, |
| 134 RenderPass* render_pass) { | 140 RenderPass* render_pass, |
| 141 const gfx::Rect& rect) { | |
| 135 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider); | 142 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider); |
| 136 bool premultiplied_alpha = false; | 143 bool premultiplied_alpha = false; |
| 137 bool flipped = false; | 144 bool flipped = false; |
| 138 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 145 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 139 | 146 |
| 140 TextureDrawQuad* overlay_quad = | 147 TextureDrawQuad* overlay_quad = |
| 141 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 148 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 142 overlay_quad->SetNew(shared_quad_state, | 149 overlay_quad->SetNew(shared_quad_state, |
| 143 kOverlayRect, | 150 rect, |
| 144 kOverlayRect, | 151 rect, |
| 145 kOverlayRect, | 152 rect, |
| 146 resource_id, | 153 resource_id, |
| 147 premultiplied_alpha, | 154 premultiplied_alpha, |
| 148 kUVTopLeft, | 155 kUVTopLeft, |
| 149 kUVBottomRight, | 156 kUVBottomRight, |
| 150 SK_ColorTRANSPARENT, | 157 SK_ColorTRANSPARENT, |
| 151 vertex_opacity, | 158 vertex_opacity, |
| 152 flipped); | 159 flipped); |
| 153 | 160 |
| 154 return overlay_quad; | 161 return overlay_quad; |
| 155 } | 162 } |
| 156 | 163 |
| 164 TextureDrawQuad* CreateCandidateQuad(ResourceProvider* resource_provider, | |
|
danakj
2014/08/06 15:52:59
CreateFullscreenCandidateQuad?
| |
| 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) { | |
| 175 CheckerboardDrawQuad* checkerboard_quad = | |
| 176 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); | |
| 177 checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor()); | |
| 178 } | |
| 179 | |
| 157 void CreateCheckeredQuad(ResourceProvider* resource_provider, | 180 void CreateCheckeredQuad(ResourceProvider* resource_provider, |
|
danakj
2014/08/06 15:52:59
CreateFullscreenCheckeredQuad?
| |
| 158 const SharedQuadState* shared_quad_state, | 181 const SharedQuadState* shared_quad_state, |
| 159 RenderPass* render_pass) { | 182 RenderPass* render_pass) { |
| 160 CheckerboardDrawQuad* checkerboard_quad = | 183 CreateCheckeredQuadAt( |
| 161 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); | 184 resource_provider, shared_quad_state, render_pass, kOverlayRect); |
| 162 checkerboard_quad->SetNew( | |
| 163 shared_quad_state, kOverlayRect, kOverlayRect, SkColor()); | |
| 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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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) { | |
|
danakj
2014/08/06 15:52:59
Where'd this go?
achaulk
2014/08/06 16:00:10
Deleted, seems to work fine on actual hardware (so
danakj
2014/08/06 16:03:34
Ok, it seems unrelated to this CL, can you do it s
| |
| 371 scoped_ptr<RenderPass> pass = CreateRenderPass(); | |
| 372 TextureDrawQuad* quad = | |
| 373 CreateCandidateQuad(resource_provider_.get(), | |
| 374 pass->shared_quad_state_list.back(), | |
| 375 pass.get()); | |
| 376 quad->premultiplied_alpha = true; | |
| 377 | |
| 378 RenderPassList pass_list; | |
| 379 pass_list.push_back(pass.Pass()); | |
| 380 OverlayCandidateList candidate_list; | |
| 381 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | |
| 382 EXPECT_EQ(1U, pass_list.size()); | |
| 383 EXPECT_EQ(0U, candidate_list.size()); | |
| 384 } | |
| 385 | |
| 386 TEST_F(SingleOverlayOnTopTest, RejectBlending) { | 391 TEST_F(SingleOverlayOnTopTest, RejectBlending) { |
| 387 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 392 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 388 TextureDrawQuad* quad = | 393 TextureDrawQuad* quad = |
| 389 CreateCandidateQuad(resource_provider_.get(), | 394 CreateCandidateQuad(resource_provider_.get(), |
| 390 pass->shared_quad_state_list.back(), | 395 pass->shared_quad_state_list.back(), |
| 391 pass.get()); | 396 pass.get()); |
| 392 quad->needs_blending = true; | 397 quad->needs_blending = true; |
| 393 | 398 |
| 394 RenderPassList pass_list; | 399 RenderPassList pass_list; |
| 395 pass_list.push_back(pass.Pass()); | 400 pass_list.push_back(pass.Pass()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 448 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 444 ASSERT_EQ(1U, pass_list.size()); | 449 ASSERT_EQ(1U, pass_list.size()); |
| 445 EXPECT_EQ(0U, candidate_list.size()); | 450 EXPECT_EQ(0U, candidate_list.size()); |
| 446 } | 451 } |
| 447 | 452 |
| 448 TEST_F(SingleOverlayOnTopTest, RejectTransform) { | 453 TEST_F(SingleOverlayOnTopTest, RejectTransform) { |
| 449 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 454 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 450 CreateCandidateQuad(resource_provider_.get(), | 455 CreateCandidateQuad(resource_provider_.get(), |
| 451 pass->shared_quad_state_list.back(), | 456 pass->shared_quad_state_list.back(), |
| 452 pass.get()); | 457 pass.get()); |
| 453 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, | 458 pass->shared_quad_state_list.back() |
| 454 2.f); | 459 ->content_to_target_transform.RotateAboutXAxis(45.f); |
|
danakj
2014/08/06 15:52:59
Why this change? Does scale not get rejected anymo
achaulk
2014/08/06 16:00:10
The hardware should be capable of handling basic p
danakj
2014/08/06 16:03:34
Can we do this as a separate CL so if we have prob
| |
| 455 | 460 |
| 456 RenderPassList pass_list; | 461 RenderPassList pass_list; |
| 457 pass_list.push_back(pass.Pass()); | 462 pass_list.push_back(pass.Pass()); |
| 458 OverlayCandidateList candidate_list; | 463 OverlayCandidateList candidate_list; |
| 459 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 464 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 460 ASSERT_EQ(1U, pass_list.size()); | 465 ASSERT_EQ(1U, pass_list.size()); |
| 461 EXPECT_EQ(0U, candidate_list.size()); | 466 EXPECT_EQ(0U, candidate_list.size()); |
| 462 } | 467 } |
| 463 | 468 |
| 469 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { | |
|
danakj
2014/08/06 15:52:59
What if it is occluded, is that covered?
achaulk
2014/08/06 16:00:10
Covered by another test
| |
| 470 scoped_ptr<RenderPass> pass = CreateRenderPass(); | |
| 471 CreateCheckeredQuadAt(resource_provider_.get(), | |
| 472 pass->shared_quad_state_list.back(), | |
| 473 pass.get(), | |
| 474 kOverlayTopLeftRect); | |
| 475 CreateCandidateQuadAt(resource_provider_.get(), | |
| 476 pass->shared_quad_state_list.back(), | |
| 477 pass.get(), | |
| 478 kOverlayBottomRightRect); | |
| 479 | |
| 480 RenderPassList pass_list; | |
| 481 pass_list.push_back(pass.Pass()); | |
| 482 | |
| 483 RenderPassList original_pass_list; | |
| 484 RenderPass::CopyAll(pass_list, &original_pass_list); | |
| 485 | |
| 486 OverlayCandidateList candidate_list; | |
| 487 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | |
| 488 EXPECT_EQ(1U, pass_list.size()); | |
| 489 EXPECT_EQ(2U, candidate_list.size()); | |
| 490 } | |
| 491 | |
| 464 class OverlayInfoRendererGL : public GLRenderer { | 492 class OverlayInfoRendererGL : public GLRenderer { |
| 465 public: | 493 public: |
| 466 OverlayInfoRendererGL(RendererClient* client, | 494 OverlayInfoRendererGL(RendererClient* client, |
| 467 const LayerTreeSettings* settings, | 495 const LayerTreeSettings* settings, |
| 468 OutputSurface* output_surface, | 496 OutputSurface* output_surface, |
| 469 ResourceProvider* resource_provider) | 497 ResourceProvider* resource_provider) |
| 470 : GLRenderer(client, | 498 : GLRenderer(client, |
| 471 settings, | 499 settings, |
| 472 output_surface, | 500 output_surface, |
| 473 resource_provider, | 501 resource_provider, |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 731 renderer_->set_expect_overlays(false); | 759 renderer_->set_expect_overlays(false); |
| 732 renderer_->FinishDrawingFrame(&frame3); | 760 renderer_->FinishDrawingFrame(&frame3); |
| 733 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 761 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
| 734 SwapBuffers(); | 762 SwapBuffers(); |
| 735 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 763 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
| 736 Mock::VerifyAndClearExpectations(&scheduler_); | 764 Mock::VerifyAndClearExpectations(&scheduler_); |
| 737 } | 765 } |
| 738 | 766 |
| 739 } // namespace | 767 } // namespace |
| 740 } // namespace cc | 768 } // namespace cc |
| OLD | NEW |