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
3 // found in the LICENSE file.
5 #include "cc/base/scoped_ptr_vector.h"
6 #include "cc/output/gl_renderer.h"
7 #include "cc/output/output_surface.h"
8 #include "cc/output/output_surface_client.h"
9 #include "cc/output/overlay_candidate_validator.h"
10 #include "cc/output/overlay_processor.h"
11 #include "cc/output/overlay_strategy_single_on_top.h"
12 #include "cc/quads/checkerboard_draw_quad.h"
13 #include "cc/quads/render_pass.h"
14 #include "cc/quads/texture_draw_quad.h"
15 #include "cc/resources/resource_provider.h"
16 #include "cc/resources/texture_mailbox.h"
17 #include "cc/test/fake_output_surface_client.h"
18 #include "cc/test/geometry_test_utils.h"
19 #include "cc/test/test_context_provider.h"
20 #include "cc/test/test_shared_bitmap_manager.h"
21 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h"
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);
33 const gfx::PointF
kUVTopLeft(0.1f
, 0.2f
);
34 const gfx::PointF
kUVBottomRight(1.0f
, 1.0f
);
36 void MailboxReleased(unsigned sync_point
, bool lost_resource
) {}
38 class SingleOverlayValidator
: public OverlayCandidateValidator
{
40 virtual void CheckOverlaySupport(OverlayCandidateList
* surfaces
) OVERRIDE
;
43 void SingleOverlayValidator::CheckOverlaySupport(
44 OverlayCandidateList
* surfaces
) {
45 ASSERT_EQ(2U, surfaces
->size());
47 OverlayCandidate
& candidate
= surfaces
->back();
48 if (candidate
.display_rect
.width() == 64)
49 EXPECT_EQ(kOverlayBottomRightRect
, candidate
.display_rect
);
51 EXPECT_EQ(kOverlayRect
, candidate
.display_rect
);
52 EXPECT_EQ(BoundingRect(kUVTopLeft
, kUVBottomRight
).ToString(),
53 candidate
.uv_rect
.ToString());
54 candidate
.overlay_handled
= true;
57 class SingleOverlayProcessor
: public OverlayProcessor
{
59 SingleOverlayProcessor(OutputSurface
* surface
,
60 ResourceProvider
* resource_provider
);
61 // Virtual to allow testing different strategies.
62 virtual void Initialize() OVERRIDE
;
65 SingleOverlayProcessor::SingleOverlayProcessor(
66 OutputSurface
* surface
,
67 ResourceProvider
* resource_provider
)
68 : OverlayProcessor(surface
, resource_provider
) {
69 EXPECT_EQ(surface
, surface_
);
70 EXPECT_EQ(resource_provider
, resource_provider_
);
73 void SingleOverlayProcessor::Initialize() {
74 OverlayCandidateValidator
* candidates
=
75 surface_
->overlay_candidate_validator();
76 ASSERT_TRUE(candidates
!= NULL
);
77 strategies_
.push_back(scoped_ptr
<Strategy
>(
78 new OverlayStrategySingleOnTop(candidates
, resource_provider_
)));
81 class DefaultOverlayProcessor
: public OverlayProcessor
{
83 DefaultOverlayProcessor(OutputSurface
* surface
,
84 ResourceProvider
* resource_provider
);
85 size_t GetStrategyCount();
88 DefaultOverlayProcessor::DefaultOverlayProcessor(
89 OutputSurface
* surface
,
90 ResourceProvider
* resource_provider
)
91 : OverlayProcessor(surface
, resource_provider
) {}
93 size_t DefaultOverlayProcessor::GetStrategyCount() {
94 return strategies_
.size();
97 class OverlayOutputSurface
: public OutputSurface
{
99 explicit OverlayOutputSurface(scoped_refptr
<ContextProvider
> context_provider
)
100 : OutputSurface(context_provider
) {}
102 void InitWithSingleOverlayValidator() {
103 overlay_candidate_validator_
.reset(new SingleOverlayValidator
);
107 scoped_ptr
<RenderPass
> CreateRenderPass() {
108 RenderPassId
id(1, 0);
109 gfx::Rect
output_rect(0, 0, 256, 256);
110 bool has_transparent_background
= true;
112 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
117 has_transparent_background
);
119 SharedQuadState
* shared_state
= pass
->CreateAndAppendSharedQuadState();
120 shared_state
->opacity
= 1.f
;
124 ResourceProvider::ResourceId
CreateResource(
125 ResourceProvider
* resource_provider
) {
126 unsigned sync_point
= 0;
127 TextureMailbox mailbox
=
128 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D
, sync_point
);
129 mailbox
.set_allow_overlay(true);
130 scoped_ptr
<SingleReleaseCallback
> release_callback
=
131 SingleReleaseCallback::Create(base::Bind(&MailboxReleased
));
133 return resource_provider
->CreateResourceFromTextureMailbox(
134 mailbox
, release_callback
.Pass());
137 TextureDrawQuad
* CreateCandidateQuadAt(ResourceProvider
* resource_provider
,
138 const SharedQuadState
* shared_quad_state
,
139 RenderPass
* render_pass
,
140 const gfx::Rect
& rect
) {
141 ResourceProvider::ResourceId resource_id
= CreateResource(resource_provider
);
142 bool premultiplied_alpha
= false;
143 bool flipped
= false;
144 float vertex_opacity
[4] = {1.0f
, 1.0f
, 1.0f
, 1.0f
};
146 TextureDrawQuad
* overlay_quad
=
147 render_pass
->CreateAndAppendDrawQuad
<TextureDrawQuad
>();
148 overlay_quad
->SetNew(shared_quad_state
,
163 TextureDrawQuad
* CreateFullscreenCandidateQuad(
164 ResourceProvider
* resource_provider
,
165 const SharedQuadState
* shared_quad_state
,
166 RenderPass
* render_pass
) {
167 return CreateCandidateQuadAt(
168 resource_provider
, shared_quad_state
, render_pass
, kOverlayRect
);
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());
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
);
187 static void CompareRenderPassLists(const RenderPassList
& expected_list
,
188 const RenderPassList
& actual_list
) {
189 EXPECT_EQ(expected_list
.size(), actual_list
.size());
190 for (size_t i
= 0; i
< actual_list
.size(); ++i
) {
191 RenderPass
* expected
= expected_list
[i
];
192 RenderPass
* actual
= actual_list
[i
];
194 EXPECT_EQ(expected
->id
, actual
->id
);
195 EXPECT_RECT_EQ(expected
->output_rect
, actual
->output_rect
);
196 EXPECT_EQ(expected
->transform_to_root_target
,
197 actual
->transform_to_root_target
);
198 EXPECT_RECT_EQ(expected
->damage_rect
, actual
->damage_rect
);
199 EXPECT_EQ(expected
->has_transparent_background
,
200 actual
->has_transparent_background
);
202 EXPECT_EQ(expected
->shared_quad_state_list
.size(),
203 actual
->shared_quad_state_list
.size());
204 EXPECT_EQ(expected
->quad_list
.size(), actual
->quad_list
.size());
206 for (size_t i
= 0; i
< expected
->quad_list
.size(); ++i
) {
207 EXPECT_EQ(expected
->quad_list
[i
]->rect
.ToString(),
208 actual
->quad_list
[i
]->rect
.ToString());
210 expected
->quad_list
[i
]->shared_quad_state
->content_bounds
.ToString(),
211 actual
->quad_list
[i
]->shared_quad_state
->content_bounds
.ToString());
216 TEST(OverlayTest
, NoOverlaysByDefault
) {
217 scoped_refptr
<TestContextProvider
> provider
= TestContextProvider::Create();
218 OverlayOutputSurface
output_surface(provider
);
219 EXPECT_EQ(NULL
, output_surface
.overlay_candidate_validator());
221 output_surface
.InitWithSingleOverlayValidator();
222 EXPECT_TRUE(output_surface
.overlay_candidate_validator() != NULL
);
225 TEST(OverlayTest
, OverlaysProcessorHasStrategy
) {
226 scoped_refptr
<TestContextProvider
> provider
= TestContextProvider::Create();
227 OverlayOutputSurface
output_surface(provider
);
228 FakeOutputSurfaceClient client
;
229 EXPECT_TRUE(output_surface
.BindToClient(&client
));
230 output_surface
.InitWithSingleOverlayValidator();
231 EXPECT_TRUE(output_surface
.overlay_candidate_validator() != NULL
);
233 scoped_ptr
<SharedBitmapManager
> shared_bitmap_manager(
234 new TestSharedBitmapManager());
235 scoped_ptr
<ResourceProvider
> resource_provider(ResourceProvider::Create(
236 &output_surface
, shared_bitmap_manager
.get(), 0, false, 1, false));
238 scoped_ptr
<DefaultOverlayProcessor
> overlay_processor(
239 new DefaultOverlayProcessor(&output_surface
, resource_provider
.get()));
240 overlay_processor
->Initialize();
241 EXPECT_GE(1U, overlay_processor
->GetStrategyCount());
244 class SingleOverlayOnTopTest
: public testing::Test
{
246 virtual void SetUp() {
247 provider_
= TestContextProvider::Create();
248 output_surface_
.reset(new OverlayOutputSurface(provider_
));
249 EXPECT_TRUE(output_surface_
->BindToClient(&client_
));
250 output_surface_
->InitWithSingleOverlayValidator();
251 EXPECT_TRUE(output_surface_
->overlay_candidate_validator() != NULL
);
253 shared_bitmap_manager_
.reset(new TestSharedBitmapManager());
254 resource_provider_
= ResourceProvider::Create(
255 output_surface_
.get(), shared_bitmap_manager_
.get(), 0, false, 1,
258 overlay_processor_
.reset(new SingleOverlayProcessor(
259 output_surface_
.get(), resource_provider_
.get()));
260 overlay_processor_
->Initialize();
263 scoped_refptr
<TestContextProvider
> provider_
;
264 scoped_ptr
<OverlayOutputSurface
> output_surface_
;
265 FakeOutputSurfaceClient client_
;
266 scoped_ptr
<SharedBitmapManager
> shared_bitmap_manager_
;
267 scoped_ptr
<ResourceProvider
> resource_provider_
;
268 scoped_ptr
<SingleOverlayProcessor
> overlay_processor_
;
271 TEST_F(SingleOverlayOnTopTest
, SuccessfullOverlay
) {
272 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
273 TextureDrawQuad
* original_quad
=
274 CreateFullscreenCandidateQuad(resource_provider_
.get(),
275 pass
->shared_quad_state_list
.back(),
277 unsigned original_resource_id
= original_quad
->resource_id
;
279 // Add something behind it.
280 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
281 pass
->shared_quad_state_list
.back(),
283 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
284 pass
->shared_quad_state_list
.back(),
287 RenderPassList pass_list
;
288 pass_list
.push_back(pass
.Pass());
290 // Check for potential candidates.
291 OverlayCandidateList candidate_list
;
292 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
294 ASSERT_EQ(1U, pass_list
.size());
295 ASSERT_EQ(2U, candidate_list
.size());
297 RenderPass
* main_pass
= pass_list
.back();
298 // Check that the quad is gone.
299 EXPECT_EQ(2U, main_pass
->quad_list
.size());
300 const QuadList
& quad_list
= main_pass
->quad_list
;
301 for (QuadList::ConstBackToFrontIterator it
= quad_list
.BackToFrontBegin();
302 it
!= quad_list
.BackToFrontEnd();
304 EXPECT_NE(DrawQuad::TEXTURE_CONTENT
, (*it
)->material
);
307 // Check that the right resource id got extracted.
308 EXPECT_EQ(original_resource_id
, candidate_list
.back().resource_id
);
311 TEST_F(SingleOverlayOnTopTest
, NoCandidates
) {
312 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
313 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
314 pass
->shared_quad_state_list
.back(),
316 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
317 pass
->shared_quad_state_list
.back(),
320 RenderPassList pass_list
;
321 pass_list
.push_back(pass
.Pass());
323 RenderPassList original_pass_list
;
324 RenderPass::CopyAll(pass_list
, &original_pass_list
);
326 OverlayCandidateList candidate_list
;
327 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
328 EXPECT_EQ(0U, candidate_list
.size());
329 // There should be nothing new here.
330 CompareRenderPassLists(pass_list
, original_pass_list
);
333 TEST_F(SingleOverlayOnTopTest
, OccludedCandidates
) {
334 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
335 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
336 pass
->shared_quad_state_list
.back(),
338 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
339 pass
->shared_quad_state_list
.back(),
342 CreateFullscreenCandidateQuad(resource_provider_
.get(),
343 pass
->shared_quad_state_list
.back(),
346 RenderPassList pass_list
;
347 pass_list
.push_back(pass
.Pass());
349 RenderPassList original_pass_list
;
350 RenderPass::CopyAll(pass_list
, &original_pass_list
);
352 OverlayCandidateList candidate_list
;
353 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
354 EXPECT_EQ(0U, candidate_list
.size());
355 // There should be nothing new here.
356 CompareRenderPassLists(pass_list
, original_pass_list
);
359 // Test with multiple render passes.
360 TEST_F(SingleOverlayOnTopTest
, MultipleRenderPasses
) {
361 RenderPassList pass_list
;
362 pass_list
.push_back(CreateRenderPass());
364 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
365 CreateFullscreenCandidateQuad(resource_provider_
.get(),
366 pass
->shared_quad_state_list
.back(),
369 // Add something behind it.
370 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
371 pass
->shared_quad_state_list
.back(),
373 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
374 pass
->shared_quad_state_list
.back(),
377 pass_list
.push_back(pass
.Pass());
379 RenderPassList original_pass_list
;
380 RenderPass::CopyAll(pass_list
, &original_pass_list
);
382 // Check for potential candidates.
383 OverlayCandidateList candidate_list
;
384 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
385 EXPECT_EQ(2U, candidate_list
.size());
387 // This should be the same.
388 ASSERT_EQ(2U, pass_list
.size());
391 TEST_F(SingleOverlayOnTopTest
, RejectPremultipliedAlpha
) {
392 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
393 TextureDrawQuad
* quad
=
394 CreateFullscreenCandidateQuad(resource_provider_
.get(),
395 pass
->shared_quad_state_list
.back(),
397 quad
->premultiplied_alpha
= true;
399 RenderPassList pass_list
;
400 pass_list
.push_back(pass
.Pass());
401 OverlayCandidateList candidate_list
;
402 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
403 EXPECT_EQ(1U, pass_list
.size());
404 EXPECT_EQ(0U, candidate_list
.size());
407 TEST_F(SingleOverlayOnTopTest
, RejectBlending
) {
408 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
409 TextureDrawQuad
* quad
=
410 CreateFullscreenCandidateQuad(resource_provider_
.get(),
411 pass
->shared_quad_state_list
.back(),
413 quad
->needs_blending
= true;
415 RenderPassList pass_list
;
416 pass_list
.push_back(pass
.Pass());
417 OverlayCandidateList candidate_list
;
418 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
419 ASSERT_EQ(1U, pass_list
.size());
420 EXPECT_EQ(0U, candidate_list
.size());
423 TEST_F(SingleOverlayOnTopTest
, RejectBackgroundColor
) {
424 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
425 TextureDrawQuad
* quad
=
426 CreateFullscreenCandidateQuad(resource_provider_
.get(),
427 pass
->shared_quad_state_list
.back(),
429 quad
->background_color
= SK_ColorBLACK
;
431 RenderPassList pass_list
;
432 pass_list
.push_back(pass
.Pass());
433 OverlayCandidateList candidate_list
;
434 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
435 ASSERT_EQ(1U, pass_list
.size());
436 EXPECT_EQ(0U, candidate_list
.size());
439 TEST_F(SingleOverlayOnTopTest
, RejectBlendMode
) {
440 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
441 CreateFullscreenCandidateQuad(resource_provider_
.get(),
442 pass
->shared_quad_state_list
.back(),
444 pass
->shared_quad_state_list
.back()->blend_mode
= SkXfermode::kScreen_Mode
;
446 RenderPassList pass_list
;
447 pass_list
.push_back(pass
.Pass());
448 OverlayCandidateList candidate_list
;
449 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
450 ASSERT_EQ(1U, pass_list
.size());
451 EXPECT_EQ(0U, candidate_list
.size());
454 TEST_F(SingleOverlayOnTopTest
, RejectOpacity
) {
455 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
456 CreateFullscreenCandidateQuad(resource_provider_
.get(),
457 pass
->shared_quad_state_list
.back(),
459 pass
->shared_quad_state_list
.back()->opacity
= 0.5f
;
461 RenderPassList pass_list
;
462 pass_list
.push_back(pass
.Pass());
463 OverlayCandidateList candidate_list
;
464 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
465 ASSERT_EQ(1U, pass_list
.size());
466 EXPECT_EQ(0U, candidate_list
.size());
469 TEST_F(SingleOverlayOnTopTest
, RejectTransform
) {
470 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
471 CreateFullscreenCandidateQuad(resource_provider_
.get(),
472 pass
->shared_quad_state_list
.back(),
474 pass
->shared_quad_state_list
.back()->content_to_target_transform
.Scale(2.f
,
477 RenderPassList pass_list
;
478 pass_list
.push_back(pass
.Pass());
479 OverlayCandidateList candidate_list
;
480 overlay_processor_
->ProcessForOverlays(&pass_list
, &candidate_list
);
481 ASSERT_EQ(1U, pass_list
.size());
482 EXPECT_EQ(0U, candidate_list
.size());
485 TEST_F(SingleOverlayOnTopTest
, AllowNotTopIfNotOccluded
) {
486 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
487 CreateCheckeredQuadAt(resource_provider_
.get(),
488 pass
->shared_quad_state_list
.back(),
490 kOverlayTopLeftRect
);
491 CreateCandidateQuadAt(resource_provider_
.get(),
492 pass
->shared_quad_state_list
.back(),
494 kOverlayBottomRightRect
);
496 RenderPassList pass_list
;
497 pass_list
.push_back(pass
.Pass());
499 RenderPassList original_pass_list
;
500 RenderPass::CopyAll(pass_list
, &original_pass_list
);
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());
508 class OverlayInfoRendererGL
: public GLRenderer
{
510 OverlayInfoRendererGL(RendererClient
* client
,
511 const LayerTreeSettings
* settings
,
512 OutputSurface
* output_surface
,
513 ResourceProvider
* resource_provider
)
520 expect_overlays_(false) {}
522 MOCK_METHOD2(DoDrawQuad
, void(DrawingFrame
* frame
, const DrawQuad
* quad
));
524 virtual void FinishDrawingFrame(DrawingFrame
* frame
) OVERRIDE
{
525 GLRenderer::FinishDrawingFrame(frame
);
527 if (!expect_overlays_
) {
528 EXPECT_EQ(0U, frame
->overlay_list
.size());
532 ASSERT_EQ(2U, frame
->overlay_list
.size());
533 EXPECT_NE(0U, frame
->overlay_list
.back().resource_id
);
536 void set_expect_overlays(bool expect_overlays
) {
537 expect_overlays_
= expect_overlays
;
541 bool expect_overlays_
;
544 class FakeRendererClient
: public RendererClient
{
546 // RendererClient methods.
547 virtual void SetFullRootLayerDamage() OVERRIDE
{}
550 class MockOverlayScheduler
{
552 MOCK_METHOD5(Schedule
,
553 void(int plane_z_order
,
554 gfx::OverlayTransform plane_transform
,
555 unsigned overlay_texture_id
,
556 const gfx::Rect
& display_bounds
,
557 const gfx::RectF
& uv_rect
));
560 class GLRendererWithOverlaysTest
: public testing::Test
{
562 GLRendererWithOverlaysTest() {
563 provider_
= TestContextProvider::Create();
564 output_surface_
.reset(new OverlayOutputSurface(provider_
));
565 CHECK(output_surface_
->BindToClient(&output_surface_client_
));
567 ResourceProvider::Create(output_surface_
.get(), NULL
, 0, false, 1,
570 provider_
->support()->SetScheduleOverlayPlaneCallback(base::Bind(
571 &MockOverlayScheduler::Schedule
, base::Unretained(&scheduler_
)));
574 void Init(bool use_validator
) {
576 output_surface_
->InitWithSingleOverlayValidator();
579 make_scoped_ptr(new OverlayInfoRendererGL(&renderer_client_
,
581 output_surface_
.get(),
582 resource_provider_
.get()));
585 void SwapBuffers() { renderer_
->SwapBuffers(CompositorFrameMetadata()); }
587 LayerTreeSettings settings_
;
588 FakeOutputSurfaceClient output_surface_client_
;
589 scoped_ptr
<OverlayOutputSurface
> output_surface_
;
590 FakeRendererClient renderer_client_
;
591 scoped_ptr
<ResourceProvider
> resource_provider_
;
592 scoped_ptr
<OverlayInfoRendererGL
> renderer_
;
593 scoped_refptr
<TestContextProvider
> provider_
;
594 MockOverlayScheduler scheduler_
;
597 TEST_F(GLRendererWithOverlaysTest
, OverlayQuadNotDrawn
) {
598 bool use_validator
= true;
600 renderer_
->set_expect_overlays(true);
601 gfx::Rect
viewport_rect(16, 16);
603 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
605 CreateFullscreenCandidateQuad(resource_provider_
.get(),
606 pass
->shared_quad_state_list
.back(),
609 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
610 pass
->shared_quad_state_list
.back(),
612 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
613 pass
->shared_quad_state_list
.back(),
616 RenderPassList pass_list
;
617 pass_list
.push_back(pass
.Pass());
619 // Candidate pass was taken out and extra skipped pass added,
620 // so only draw 2 quads.
621 EXPECT_CALL(*renderer_
, DoDrawQuad(_
, _
)).Times(2);
622 EXPECT_CALL(scheduler_
,
624 gfx::OVERLAY_TRANSFORM_NONE
,
627 BoundingRect(kUVTopLeft
, kUVBottomRight
))).Times(1);
628 renderer_
->DrawFrame(&pass_list
, 1.f
, viewport_rect
, viewport_rect
, false);
632 Mock::VerifyAndClearExpectations(renderer_
.get());
633 Mock::VerifyAndClearExpectations(&scheduler_
);
636 TEST_F(GLRendererWithOverlaysTest
, OccludedQuadDrawn
) {
637 bool use_validator
= true;
639 renderer_
->set_expect_overlays(false);
640 gfx::Rect
viewport_rect(16, 16);
642 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
644 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
645 pass
->shared_quad_state_list
.back(),
647 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
648 pass
->shared_quad_state_list
.back(),
651 CreateFullscreenCandidateQuad(resource_provider_
.get(),
652 pass
->shared_quad_state_list
.back(),
655 RenderPassList pass_list
;
656 pass_list
.push_back(pass
.Pass());
658 // 3 quads in the pass, all should draw.
659 EXPECT_CALL(*renderer_
, DoDrawQuad(_
, _
)).Times(3);
660 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(0);
661 renderer_
->DrawFrame(&pass_list
, 1.f
, viewport_rect
, viewport_rect
, false);
665 Mock::VerifyAndClearExpectations(renderer_
.get());
666 Mock::VerifyAndClearExpectations(&scheduler_
);
669 TEST_F(GLRendererWithOverlaysTest
, NoValidatorNoOverlay
) {
670 bool use_validator
= false;
672 renderer_
->set_expect_overlays(false);
673 gfx::Rect
viewport_rect(16, 16);
675 scoped_ptr
<RenderPass
> pass
= CreateRenderPass();
677 CreateFullscreenCandidateQuad(resource_provider_
.get(),
678 pass
->shared_quad_state_list
.back(),
681 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
682 pass
->shared_quad_state_list
.back(),
684 CreateFullscreenCheckeredQuad(resource_provider_
.get(),
685 pass
->shared_quad_state_list
.back(),
688 RenderPassList pass_list
;
689 pass_list
.push_back(pass
.Pass());
691 // Should see no overlays.
692 EXPECT_CALL(*renderer_
, DoDrawQuad(_
, _
)).Times(3);
693 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(0);
694 renderer_
->DrawFrame(&pass_list
, 1.f
, viewport_rect
, viewport_rect
, false);
698 Mock::VerifyAndClearExpectations(renderer_
.get());
699 Mock::VerifyAndClearExpectations(&scheduler_
);
702 TEST_F(GLRendererWithOverlaysTest
, ResourcesExportedAndReturned
) {
703 bool use_validator
= true;
705 renderer_
->set_expect_overlays(true);
707 ResourceProvider::ResourceId resource1
=
708 CreateResource(resource_provider_
.get());
709 ResourceProvider::ResourceId resource2
=
710 CreateResource(resource_provider_
.get());
712 DirectRenderer::DrawingFrame frame1
;
713 frame1
.overlay_list
.resize(2);
714 OverlayCandidate
& overlay1
= frame1
.overlay_list
.back();
715 overlay1
.resource_id
= resource1
;
716 overlay1
.plane_z_order
= 1;
718 DirectRenderer::DrawingFrame frame2
;
719 frame2
.overlay_list
.resize(2);
720 OverlayCandidate
& overlay2
= frame2
.overlay_list
.back();
721 overlay2
.resource_id
= resource2
;
722 overlay2
.plane_z_order
= 1;
724 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(1);
725 renderer_
->FinishDrawingFrame(&frame1
);
726 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
727 EXPECT_FALSE(resource_provider_
->InUseByConsumer(resource2
));
729 Mock::VerifyAndClearExpectations(&scheduler_
);
731 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(1);
732 renderer_
->FinishDrawingFrame(&frame2
);
733 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
734 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource2
));
736 EXPECT_FALSE(resource_provider_
->InUseByConsumer(resource1
));
737 Mock::VerifyAndClearExpectations(&scheduler_
);
739 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(1);
740 renderer_
->FinishDrawingFrame(&frame1
);
741 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
742 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource2
));
744 EXPECT_FALSE(resource_provider_
->InUseByConsumer(resource2
));
745 Mock::VerifyAndClearExpectations(&scheduler_
);
747 // No overlays, release the resource.
748 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(0);
749 DirectRenderer::DrawingFrame frame3
;
750 renderer_
->set_expect_overlays(false);
751 renderer_
->FinishDrawingFrame(&frame3
);
752 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
753 EXPECT_FALSE(resource_provider_
->InUseByConsumer(resource2
));
755 EXPECT_FALSE(resource_provider_
->InUseByConsumer(resource1
));
756 Mock::VerifyAndClearExpectations(&scheduler_
);
758 // Use the same buffer twice.
759 renderer_
->set_expect_overlays(true);
760 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(1);
761 renderer_
->FinishDrawingFrame(&frame1
);
762 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
764 Mock::VerifyAndClearExpectations(&scheduler_
);
766 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(1);
767 renderer_
->FinishDrawingFrame(&frame1
);
768 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
770 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
771 Mock::VerifyAndClearExpectations(&scheduler_
);
773 EXPECT_CALL(scheduler_
, Schedule(_
, _
, _
, _
, _
)).Times(0);
774 renderer_
->set_expect_overlays(false);
775 renderer_
->FinishDrawingFrame(&frame3
);
776 EXPECT_TRUE(resource_provider_
->InUseByConsumer(resource1
));
778 EXPECT_FALSE(resource_provider_
->InUseByConsumer(resource1
));
779 Mock::VerifyAndClearExpectations(&scheduler_
);