14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/append_quads_data.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/ui_resource_layer_impl.h"
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/quads/draw_quad.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/ui_resource_bitmap.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/ui_resource_client.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_ui_resource_layer_tree_host_impl.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/layer_test_common.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/transform.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<UIResourceLayerImpl> GenerateUIResourceLayer(
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    FakeUIResourceLayerTreeHostImpl* host_impl,
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size& bitmap_size,
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size& layer_size,
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool opaque,
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UIResourceId uid) {
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect visible_content_rect(layer_size);
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<UIResourceLayerImpl> layer =
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      UIResourceLayerImpl::Create(host_impl->active_tree(), 1);
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->draw_properties().visible_content_rect = visible_content_rect;
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->SetBounds(layer_size);
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->SetContentBounds(layer_size);
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->CreateRenderSurface();
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->draw_properties().render_target = layer.get();
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  UIResourceBitmap bitmap(bitmap_size, opaque);
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  host_impl->CreateUIResource(uid, bitmap);
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->SetUIResourceId(uid);
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return layer.Pass();
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void QuadSizeTest(scoped_ptr<UIResourceLayerImpl> layer,
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  size_t expected_quad_size) {
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MockOcclusionTracker<LayerImpl> occlusion_tracker;
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AppendQuadsData data;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Verify quad rects
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const QuadList& quads = render_pass->quad_list;
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected_quad_size, quads.size());
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(UIResourceLayerImplTest, VerifyDrawQuads) {
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeImplProxy proxy;
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeUIResourceLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure we're appending quads when there are valid values.
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size bitmap_size(100, 100);
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size layer_size(100, 100);;
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t expected_quad_size = 1;
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool opaque = true;
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UIResourceId uid = 1;
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer(&host_impl,
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                  bitmap_size,
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                  layer_size,
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                                  opaque,
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                  uid);
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuadSizeTest(layer.Pass(), expected_quad_size);
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure we're not appending quads when there are invalid values.
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  expected_quad_size = 0;
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  uid = 0;
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer = GenerateUIResourceLayer(&host_impl,
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  bitmap_size,
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  layer_size,
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  opaque,
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  uid);
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuadSizeTest(layer.Pass(), expected_quad_size);
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OpaqueBoundsTest(scoped_ptr<UIResourceLayerImpl> layer,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const gfx::Rect& expected_opaque_bounds) {
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MockOcclusionTracker<LayerImpl> occlusion_tracker;
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AppendQuadsData data;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Verify quad rects
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const QuadList& quads = render_pass->quad_list;
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GE(quads.size(), (size_t)0);
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect opaque_rect = quads.front()->opaque_rect;
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected_opaque_bounds, opaque_rect);
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(UIResourceLayerImplTest, VerifySetOpaqueOnSkBitmap) {
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeImplProxy proxy;
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeUIResourceLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size bitmap_size(100, 100);
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size layer_size(100, 100);;
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool opaque = false;
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UIResourceId uid = 1;
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer(&host_impl,
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                  bitmap_size,
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                  layer_size,
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                                  opaque,
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                  uid);
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect expected_opaque_bounds;
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds);
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  opaque = true;
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer = GenerateUIResourceLayer(&host_impl,
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  bitmap_size,
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  layer_size,
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  opaque,
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  uid);
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  expected_opaque_bounds = gfx::Rect(layer->bounds());
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds);
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(UIResourceLayerImplTest, VerifySetOpaqueOnLayer) {
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeImplProxy proxy;
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeUIResourceLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Size bitmap_size(100, 100);
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Size layer_size(100, 100);
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool skbitmap_opaque = false;
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UIResourceId uid = 1;
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer(
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid);
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  layer->SetContentsOpaque(false);
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect expected_opaque_bounds;
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds);
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  layer = GenerateUIResourceLayer(
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid);
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer->SetContentsOpaque(true);
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  expected_opaque_bounds = gfx::Rect(layer->bounds());
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds);
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(UIResourceLayerImplTest, Occlusion) {
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size layer_size(1000, 1000);
15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size viewport_size(1000, 1000);
15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  LayerTestCommon::LayerImplTest impl;
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SkBitmap sk_bitmap;
15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  sk_bitmap.allocN32Pixels(10, 10);
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  sk_bitmap.setImmutable();
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UIResourceId uid = 5;
16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UIResourceBitmap bitmap(sk_bitmap);
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  impl.host_impl()->CreateUIResource(uid, bitmap);
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UIResourceLayerImpl* ui_resource_layer_impl =
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      impl.AddChildToRoot<UIResourceLayerImpl>();
16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ui_resource_layer_impl->SetBounds(layer_size);
16723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ui_resource_layer_impl->SetContentBounds(layer_size);
16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ui_resource_layer_impl->SetDrawsContent(true);
16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ui_resource_layer_impl->SetUIResourceId(uid);
17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  impl.CalcDrawProps(viewport_size);
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("No occlusion");
17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded;
17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(ui_resource_layer_impl, occluded);
17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                 gfx::Rect(layer_size));
18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, impl.quad_list().size());
18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
18223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Full occlusion");
18523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded(ui_resource_layer_impl->visible_content_rect());
18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(ui_resource_layer_impl, occluded);
18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
18923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(impl.quad_list().size(), 0u);
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Partial occlusion");
19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded(200, 0, 800, 1000);
19523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(ui_resource_layer_impl, occluded);
19623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    size_t partially_occluded_count = 0;
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LayerTestCommon::VerifyQuadsAreOccluded(
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        impl.quad_list(), occluded, &partially_occluded_count);
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The layer outputs one quad, which is partially occluded.
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, impl.quad_list().size());
20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, partially_occluded_count);
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace cc
208