123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/context_provider.h"
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/output_surface.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/layer_test_common.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace cc {
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace {
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid IgnoreCallback(uint32 sync_point,
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    bool lost,
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    BlockingTaskRunner* main_thread_task_runner) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(TextureLayerImplTest, Occlusion) {
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size layer_size(1000, 1000);
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size viewport_size(1000, 1000);
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  LayerTestCommon::LayerImplTest impl;
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gpu::Mailbox mailbox;
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  impl.output_surface()->context_provider()->ContextGL()->GenMailboxCHROMIUM(
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      mailbox.name);
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TextureMailbox texture_mailbox(mailbox, GL_TEXTURE_2D, 0);
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TextureLayerImpl* texture_layer_impl =
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      impl.AddChildToRoot<TextureLayerImpl>();
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  texture_layer_impl->SetBounds(layer_size);
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  texture_layer_impl->SetContentBounds(layer_size);
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  texture_layer_impl->SetDrawsContent(true);
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  texture_layer_impl->SetTextureMailbox(
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      texture_mailbox,
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SingleReleaseCallbackImpl::Create(base::Bind(&IgnoreCallback)));
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  impl.CalcDrawProps(viewport_size);
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("No occlusion");
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded;
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(texture_layer_impl, occluded);
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                 gfx::Rect(layer_size));
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, impl.quad_list().size());
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Full occlusion");
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded(texture_layer_impl->visible_content_rect());
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(texture_layer_impl, occluded);
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(impl.quad_list().size(), 0u);
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Partial occlusion");
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded(200, 0, 800, 1000);
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(texture_layer_impl, occluded);
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    size_t partially_occluded_count = 0;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LayerTestCommon::VerifyQuadsAreOccluded(
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        impl.quad_list(), occluded, &partially_occluded_count);
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The layer outputs one quad, which is partially occluded.
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, impl.quad_list().size());
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(1u, partially_occluded_count);
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace cc
77