Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 23805002: [cc] Enable specifying a overhang/gutter texture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Don't require Webkit patch Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 2825 matching lines...) Expand 10 before | Expand all | Expand 10 after
2836 layer1->SetExpectation(false, false); 2836 layer1->SetExpectation(false, false);
2837 layer1->set_update_rect(gfx::RectF(layer1->content_bounds())); 2837 layer1->set_update_rect(gfx::RectF(layer1->content_bounds()));
2838 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 2838 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
2839 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); 2839 host_impl_->DrawLayers(&frame, base::TimeTicks::Now());
2840 EXPECT_TRUE(layer1->quads_appended()); 2840 EXPECT_TRUE(layer1->quads_appended());
2841 host_impl_->DidDrawAllLayers(frame); 2841 host_impl_->DidDrawAllLayers(frame);
2842 } 2842 }
2843 2843
2844 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { 2844 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest {
2845 public: 2845 public:
2846 LayerTreeHostImplViewportCoveredTest() :
2847 gutter_quad_material_(DrawQuad::SOLID_COLOR),
2848 child_(NULL),
2849 did_activate_pending_tree_(false) { }
enne (OOO) 2013/09/03 23:18:26 style nit: {}. Consider running 'git cl format' o
ccameron 2013/09/04 02:36:47 Done.
2850
2846 void CreateLayerTreeHostImpl(bool always_draw) { 2851 void CreateLayerTreeHostImpl(bool always_draw) {
2847 LayerTreeSettings settings; 2852 LayerTreeSettings settings;
2848 settings.minimum_occlusion_tracking_size = gfx::Size(); 2853 settings.minimum_occlusion_tracking_size = gfx::Size();
2849 settings.impl_side_painting = true; 2854 settings.impl_side_painting = true;
2850 host_impl_ = LayerTreeHostImpl::Create( 2855 host_impl_ = LayerTreeHostImpl::Create(
2851 settings, this, &proxy_, &stats_instrumentation_); 2856 settings, this, &proxy_, &stats_instrumentation_);
2852 2857
2853 scoped_ptr<FakeOutputSurface> output_surface; 2858 scoped_ptr<FakeOutputSurface> output_surface;
2854 if (always_draw) 2859 if (always_draw)
2855 output_surface = FakeOutputSurface::CreateAlwaysDrawAndSwap3d().Pass(); 2860 output_surface = FakeOutputSurface::CreateAlwaysDrawAndSwap3d().Pass();
(...skipping 24 matching lines...) Expand all
2880 child_->SetPosition(layer_rect.origin()); 2885 child_->SetPosition(layer_rect.origin());
2881 child_->SetBounds(layer_rect.size()); 2886 child_->SetBounds(layer_rect.size());
2882 child_->SetContentBounds(layer_rect.size()); 2887 child_->SetContentBounds(layer_rect.size());
2883 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 2888 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
2884 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 2889 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
2885 2890
2886 LayerTreeHostImpl::FrameData frame; 2891 LayerTreeHostImpl::FrameData frame;
2887 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 2892 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
2888 ASSERT_EQ(1u, frame.render_passes.size()); 2893 ASSERT_EQ(1u, frame.render_passes.size());
2889 2894
2890 size_t num_gutter_quads = 0; 2895 EXPECT_EQ(0u, CountGutterQuads(frame.render_passes[0]->quad_list));
2891 for (size_t i = 0; i < frame.render_passes[0]->quad_list.size(); ++i)
2892 num_gutter_quads += (frame.render_passes[0]->quad_list[i]->material ==
2893 DrawQuad::SOLID_COLOR) ? 1 : 0;
2894 EXPECT_EQ(0u, num_gutter_quads);
2895 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); 2896 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size());
2897 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
2896 2898
2897 LayerTestCommon::VerifyQuadsExactlyCoverRect( 2899 LayerTestCommon::VerifyQuadsExactlyCoverRect(
2898 frame.render_passes[0]->quad_list, gfx::Rect(viewport_size_)); 2900 frame.render_passes[0]->quad_list, gfx::Rect(viewport_size_));
2899 host_impl_->DidDrawAllLayers(frame); 2901 host_impl_->DidDrawAllLayers(frame);
2900 } 2902 }
2901 2903
2902 // Expect fullscreen gutter rect. 2904 // Expect fullscreen gutter rect.
2903 void TestEmptyLayer() { 2905 void TestEmptyLayer() {
2904 gfx::Rect layer_rect(0, 0, 0, 0); 2906 gfx::Rect layer_rect(0, 0, 0, 0);
2905 child_->SetPosition(layer_rect.origin()); 2907 child_->SetPosition(layer_rect.origin());
2906 child_->SetBounds(layer_rect.size()); 2908 child_->SetBounds(layer_rect.size());
2907 child_->SetContentBounds(layer_rect.size()); 2909 child_->SetContentBounds(layer_rect.size());
2908 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 2910 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
2909 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 2911 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
2910 2912
2911 LayerTreeHostImpl::FrameData frame; 2913 LayerTreeHostImpl::FrameData frame;
2912 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 2914 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
2913 ASSERT_EQ(1u, frame.render_passes.size()); 2915 ASSERT_EQ(1u, frame.render_passes.size());
2914 2916
2915 size_t num_gutter_quads = 0; 2917 EXPECT_EQ(1u, CountGutterQuads(frame.render_passes[0]->quad_list));
2916 for (size_t i = 0; i < frame.render_passes[0]->quad_list.size(); ++i)
2917 num_gutter_quads += (frame.render_passes[0]->quad_list[i]->material ==
2918 DrawQuad::SOLID_COLOR) ? 1 : 0;
2919 EXPECT_EQ(1u, num_gutter_quads);
2920 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); 2918 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size());
2919 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
2921 2920
2922 LayerTestCommon::VerifyQuadsExactlyCoverRect( 2921 LayerTestCommon::VerifyQuadsExactlyCoverRect(
2923 frame.render_passes[0]->quad_list, gfx::Rect(viewport_size_)); 2922 frame.render_passes[0]->quad_list, gfx::Rect(viewport_size_));
2924 host_impl_->DidDrawAllLayers(frame); 2923 host_impl_->DidDrawAllLayers(frame);
2925 } 2924 }
2926 2925
2927 // Expect four surrounding gutter rects. 2926 // Expect four surrounding gutter rects.
2928 void TestLayerInMiddleOfViewport() { 2927 void TestLayerInMiddleOfViewport() {
2929 gfx::Rect layer_rect(500, 500, 200, 200); 2928 gfx::Rect layer_rect(500, 500, 200, 200);
2930 child_->SetPosition(layer_rect.origin()); 2929 child_->SetPosition(layer_rect.origin());
2931 child_->SetBounds(layer_rect.size()); 2930 child_->SetBounds(layer_rect.size());
2932 child_->SetContentBounds(layer_rect.size()); 2931 child_->SetContentBounds(layer_rect.size());
2933 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 2932 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
2934 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 2933 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
2935 2934
2936 LayerTreeHostImpl::FrameData frame; 2935 LayerTreeHostImpl::FrameData frame;
2937 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 2936 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
2938 ASSERT_EQ(1u, frame.render_passes.size()); 2937 ASSERT_EQ(1u, frame.render_passes.size());
2939 2938
2940 size_t num_gutter_quads = 0; 2939 EXPECT_EQ(4u, CountGutterQuads(frame.render_passes[0]->quad_list));
2941 for (size_t i = 0; i < frame.render_passes[0]->quad_list.size(); ++i)
2942 num_gutter_quads += (frame.render_passes[0]->quad_list[i]->material ==
2943 DrawQuad::SOLID_COLOR) ? 1 : 0;
2944 EXPECT_EQ(4u, num_gutter_quads);
2945 EXPECT_EQ(5u, frame.render_passes[0]->quad_list.size()); 2940 EXPECT_EQ(5u, frame.render_passes[0]->quad_list.size());
2941 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
2946 2942
2947 LayerTestCommon::VerifyQuadsExactlyCoverRect( 2943 LayerTestCommon::VerifyQuadsExactlyCoverRect(
2948 frame.render_passes[0]->quad_list, gfx::Rect(viewport_size_)); 2944 frame.render_passes[0]->quad_list, gfx::Rect(viewport_size_));
2949 host_impl_->DidDrawAllLayers(frame); 2945 host_impl_->DidDrawAllLayers(frame);
2950 } 2946 }
2951 2947
2952 // Expect no gutter rects. 2948 // Expect no gutter rects.
2953 void TestLayerIsLargerThanViewport() { 2949 void TestLayerIsLargerThanViewport() {
2954 gfx::Rect layer_rect(viewport_size_.width() + 10, 2950 gfx::Rect layer_rect(viewport_size_.width() + 10,
2955 viewport_size_.height() + 10); 2951 viewport_size_.height() + 10);
2956 child_->SetPosition(layer_rect.origin()); 2952 child_->SetPosition(layer_rect.origin());
2957 child_->SetBounds(layer_rect.size()); 2953 child_->SetBounds(layer_rect.size());
2958 child_->SetContentBounds(layer_rect.size()); 2954 child_->SetContentBounds(layer_rect.size());
2959 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 2955 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
2960 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 2956 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
2961 2957
2962 LayerTreeHostImpl::FrameData frame; 2958 LayerTreeHostImpl::FrameData frame;
2963 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 2959 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
2964 ASSERT_EQ(1u, frame.render_passes.size()); 2960 ASSERT_EQ(1u, frame.render_passes.size());
2965 2961
2966 size_t num_gutter_quads = 0; 2962 EXPECT_EQ(0u, CountGutterQuads(frame.render_passes[0]->quad_list));
2967 for (size_t i = 0; i < frame.render_passes[0]->quad_list.size(); ++i)
2968 num_gutter_quads += (frame.render_passes[0]->quad_list[i]->material ==
2969 DrawQuad::SOLID_COLOR) ? 1 : 0;
2970 EXPECT_EQ(0u, num_gutter_quads);
2971 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); 2963 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size());
2964 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
2972 2965
2973 host_impl_->DidDrawAllLayers(frame); 2966 host_impl_->DidDrawAllLayers(frame);
2974 } 2967 }
2975 2968
2976 virtual void DidActivatePendingTree() OVERRIDE { 2969 virtual void DidActivatePendingTree() OVERRIDE {
2977 did_activate_pending_tree_ = true; 2970 did_activate_pending_tree_ = true;
2978 } 2971 }
2979 2972
2973 void set_gutter_quad_material(DrawQuad::Material material) {
2974 gutter_quad_material_ = material;
2975 }
2976 void set_gutter_texture_size(gfx::Size gutter_texture_size) {
2977 gutter_texture_size_ = gutter_texture_size;
2978 }
2979
2980 protected: 2980 protected:
2981 size_t CountGutterQuads(const QuadList& quad_list) {
2982 size_t num_gutter_quads = 0;
2983 for (size_t i = 0; i < quad_list.size(); ++i) {
2984 num_gutter_quads += (quad_list[i]->material ==
2985 gutter_quad_material_) ? 1 : 0;
2986 }
2987 return num_gutter_quads;
2988 }
2989
2990 // Make sure that the texture coordinates match their expectations.
2991 void ValidateTextureDrawQuads(const QuadList& quad_list) {
2992 for (size_t i = 0; i < quad_list.size(); ++i) {
2993 if (quad_list[i]->material == DrawQuad::TEXTURE_CONTENT) {
enne (OOO) 2013/09/03 23:18:26 style nit: early-out with a continue here, rather
ccameron 2013/09/04 02:36:47 Done.
2994 TextureDrawQuad* quad = reinterpret_cast<TextureDrawQuad*>(
enne (OOO) 2013/09/03 23:18:26 TextureDrawQuad::MaterialCast(quad_list[i])
ccameron 2013/09/04 02:36:47 Done.
2995 quad_list[i]);
2996 EXPECT_EQ(quad->uv_top_left.x(),
2997 quad->rect.x() /
2998 static_cast<float>(gutter_texture_size_.width()));
2999 EXPECT_EQ(quad->uv_top_left.y(),
3000 quad->rect.y() /
3001 static_cast<float>(gutter_texture_size_.height()));
3002 EXPECT_EQ(quad->uv_bottom_right.x(),
3003 (quad->rect.x() + quad->rect.width()) /
enne (OOO) 2013/09/03 23:18:26 quad->rect.right()
ccameron 2013/09/04 02:36:47 Done.
3004 static_cast<float>(gutter_texture_size_.width()));
3005 EXPECT_EQ(quad->uv_bottom_right.y(),
3006 (quad->rect.y() + quad->rect.height()) /
3007 static_cast<float>(gutter_texture_size_.height()));
3008 }
3009 }
3010 }
3011
3012 DrawQuad::Material gutter_quad_material_;
3013 gfx::Size gutter_texture_size_;
2981 gfx::Size viewport_size_; 3014 gfx::Size viewport_size_;
2982 BlendStateCheckLayer* child_; 3015 BlendStateCheckLayer* child_;
2983 bool did_activate_pending_tree_; 3016 bool did_activate_pending_tree_;
2984 }; 3017 };
2985 3018
2986 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) { 3019 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) {
2987 bool always_draw = false; 3020 bool always_draw = false;
2988 CreateLayerTreeHostImpl(always_draw); 3021 CreateLayerTreeHostImpl(always_draw);
2989 3022
2990 host_impl_->SetViewportSize(viewport_size_); 3023 host_impl_->SetViewportSize(viewport_size_);
2991 SetupActiveTreeLayers(); 3024 SetupActiveTreeLayers();
2992 TestLayerCoversFullViewport(); 3025 TestLayerCoversFullViewport();
2993 TestEmptyLayer(); 3026 TestEmptyLayer();
2994 TestLayerInMiddleOfViewport(); 3027 TestLayerInMiddleOfViewport();
2995 TestLayerIsLargerThanViewport(); 3028 TestLayerIsLargerThanViewport();
2996 } 3029 }
2997 3030
3031 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredOverhangBitmap) {
3032 bool always_draw = false;
3033 CreateLayerTreeHostImpl(always_draw);
3034
3035 host_impl_->SetViewportSize(viewport_size_);
3036 SetupActiveTreeLayers();
3037
3038 // Specify an overhang bitmap to use.
3039 scoped_refptr<UIResourceBitmap> ui_resource_bitmap(UIResourceBitmap::Create(
3040 new uint8_t[4], UIResourceBitmap::RGBA8, gfx::Size(1, 1)));
3041 UIResourceId ui_resource_id = 12345;
3042 host_impl_->CreateUIResource(ui_resource_id, ui_resource_bitmap);
3043 host_impl_->SetOverhangUIResource(ui_resource_id, gfx::Size(32, 32));
3044 set_gutter_quad_material(DrawQuad::TEXTURE_CONTENT);
3045 set_gutter_texture_size(gfx::Size(32, 32));
3046
3047 TestLayerCoversFullViewport();
3048 TestEmptyLayer();
3049 TestLayerInMiddleOfViewport();
3050 TestLayerIsLargerThanViewport();
3051
3052 // Change the resource size.
3053 host_impl_->SetOverhangUIResource(ui_resource_id, gfx::Size(128, 16));
3054 set_gutter_texture_size(gfx::Size(128, 16));
3055
3056 TestLayerCoversFullViewport();
3057 TestEmptyLayer();
3058 TestLayerInMiddleOfViewport();
3059 TestLayerIsLargerThanViewport();
3060 }
3061
2998 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { 3062 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) {
2999 bool always_draw = true; 3063 bool always_draw = true;
3000 CreateLayerTreeHostImpl(always_draw); 3064 CreateLayerTreeHostImpl(always_draw);
3001 3065
3002 // Pending tree to force active_tree size invalid. Not used otherwise. 3066 // Pending tree to force active_tree size invalid. Not used otherwise.
3003 host_impl_->CreatePendingTree(); 3067 host_impl_->CreatePendingTree();
3004 host_impl_->SetViewportSize(viewport_size_); 3068 host_impl_->SetViewportSize(viewport_size_);
3005 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); 3069 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
3006 3070
3007 SetupActiveTreeLayers(); 3071 SetupActiveTreeLayers();
3008 TestEmptyLayer(); 3072 TestEmptyLayer();
3009 TestLayerInMiddleOfViewport(); 3073 TestLayerInMiddleOfViewport();
3010 TestLayerIsLargerThanViewport(); 3074 TestLayerIsLargerThanViewport();
3011 } 3075 }
3012 3076
3013 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { 3077 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) {
3014 bool always_draw = true; 3078 bool always_draw = true;
3015 CreateLayerTreeHostImpl(always_draw); 3079 CreateLayerTreeHostImpl(always_draw);
3016 3080
3017 // Set larger viewport and activate it to active tree. 3081 // Set larger viewport and activate it to active tree.
3018 host_impl_->CreatePendingTree(); 3082 host_impl_->CreatePendingTree();
3019 gfx::Size larger_viewport(viewport_size_.width() + 100, 3083 gfx::Size larger_viewport(viewport_size_.width() + 100,
3020 viewport_size_.height() + 100); 3084 viewport_size_.height() + 100);
3021 host_impl_->SetViewportSize(larger_viewport); 3085 host_impl_->SetViewportSize(larger_viewport);
3022 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); 3086 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
3023 did_activate_pending_tree_ = false;
3024 host_impl_->ActivatePendingTree(); 3087 host_impl_->ActivatePendingTree();
3025 EXPECT_TRUE(did_activate_pending_tree_); 3088 EXPECT_TRUE(did_activate_pending_tree_);
3026 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid()); 3089 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid());
3027 3090
3028 // Shrink pending tree viewport without activating. 3091 // Shrink pending tree viewport without activating.
3029 host_impl_->CreatePendingTree(); 3092 host_impl_->CreatePendingTree();
3030 host_impl_->SetViewportSize(viewport_size_); 3093 host_impl_->SetViewportSize(viewport_size_);
3031 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); 3094 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
3032 3095
3033 SetupActiveTreeLayers(); 3096 SetupActiveTreeLayers();
(...skipping 3342 matching lines...) Expand 10 before | Expand all | Expand 10 after
6376 EXPECT_EQ(0u, host_impl_->ResourceIdForUIResource(ui_resource_id)); 6439 EXPECT_EQ(0u, host_impl_->ResourceIdForUIResource(ui_resource_id));
6377 EXPECT_EQ(0u, context3d->NumTextures()); 6440 EXPECT_EQ(0u, context3d->NumTextures());
6378 6441
6379 // Should not change state for multiple deletion on one UIResourceId 6442 // Should not change state for multiple deletion on one UIResourceId
6380 host_impl_->DeleteUIResource(ui_resource_id); 6443 host_impl_->DeleteUIResource(ui_resource_id);
6381 EXPECT_EQ(0u, context3d->NumTextures()); 6444 EXPECT_EQ(0u, context3d->NumTextures());
6382 } 6445 }
6383 6446
6384 } // namespace 6447 } // namespace
6385 } // namespace cc 6448 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698