1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "cc/layers/io_surface_layer_impl.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "cc/test/layer_test_common.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace cc {
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(IOSurfaceLayerImplTest, Occlusion) {
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Size layer_size(1000, 1000);
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Size viewport_size(1000, 1000);
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerTestCommon::LayerImplTest impl;
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IOSurfaceLayerImpl* io_surface_layer_impl =
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      impl.AddChildToRoot<IOSurfaceLayerImpl>();
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  io_surface_layer_impl->SetBounds(layer_size);
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  io_surface_layer_impl->SetContentBounds(layer_size);
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  io_surface_layer_impl->SetDrawsContent(true);
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  impl.CalcDrawProps(viewport_size);
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("No occlusion");
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect occluded;
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(io_surface_layer_impl, occluded);
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                 gfx::Rect(layer_size));
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, impl.quad_list().size());
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Full occlusion");
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded(io_surface_layer_impl->visible_content_rect());
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(io_surface_layer_impl, occluded);
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(impl.quad_list().size(), 0u);
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Partial occlusion");
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect occluded(200, 0, 800, 1000);
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(io_surface_layer_impl, occluded);
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    size_t partially_occluded_count = 0;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LayerTestCommon::VerifyQuadsAreOccluded(
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        impl.quad_list(), occluded, &partially_occluded_count);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The layer outputs one quad, which is partially occluded.
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, impl.quad_list().size());
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1u, partially_occluded_count);
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace cc
62