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

Side by Side Diff: cc/output/software_renderer_unittest.cc

Issue 15579002: Implement transform/clip support for Android WebView. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Turn on fuzzy comparator for new SoftwareRenderer tests Created 7 years, 6 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/output/software_renderer.h" 5 #include "cc/output/software_renderer.h"
6 6
7 #include "cc/layers/quad_sink.h" 7 #include "cc/layers/quad_sink.h"
8 #include "cc/output/compositor_frame_metadata.h" 8 #include "cc/output/compositor_frame_metadata.h"
9 #include "cc/output/software_output_device.h" 9 #include "cc/output/software_output_device.h"
10 #include "cc/quads/render_pass.h" 10 #include "cc/quads/render_pass.h"
11 #include "cc/quads/render_pass_draw_quad.h" 11 #include "cc/quads/render_pass_draw_quad.h"
12 #include "cc/quads/solid_color_draw_quad.h" 12 #include "cc/quads/solid_color_draw_quad.h"
13 #include "cc/quads/tile_draw_quad.h" 13 #include "cc/quads/tile_draw_quad.h"
14 #include "cc/test/animation_test_common.h" 14 #include "cc/test/animation_test_common.h"
15 #include "cc/test/fake_output_surface.h" 15 #include "cc/test/fake_output_surface.h"
16 #include "cc/test/geometry_test_utils.h" 16 #include "cc/test/geometry_test_utils.h"
17 #include "cc/test/render_pass_test_common.h" 17 #include "cc/test/render_pass_test_common.h"
18 #include "cc/test/render_pass_test_utils.h" 18 #include "cc/test/render_pass_test_utils.h"
19 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
20 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
21 #include "third_party/skia/include/core/SkCanvas.h"
22 #include "third_party/skia/include/core/SkDevice.h"
21 23
22 namespace cc { 24 namespace cc {
23 namespace { 25 namespace {
24 26
25 class SoftwareRendererTest : public testing::Test, public RendererClient { 27 class SoftwareRendererTest : public testing::Test, public RendererClient {
26 public: 28 public:
27 SoftwareRendererTest() : should_clear_root_render_pass_(true) {} 29 SoftwareRendererTest() : should_clear_root_render_pass_(true) {}
28 30
29 void InitializeRenderer() { 31 void InitializeRenderer(
32 scoped_ptr<SoftwareOutputDevice> software_output_device) {
30 output_surface_ = FakeOutputSurface::CreateSoftware( 33 output_surface_ = FakeOutputSurface::CreateSoftware(
31 make_scoped_ptr(new SoftwareOutputDevice)); 34 software_output_device.Pass());
32 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0); 35 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0);
33 renderer_ = SoftwareRenderer::Create( 36 renderer_ = SoftwareRenderer::Create(
34 this, output_surface_.get(), resource_provider()); 37 this, output_surface_.get(), resource_provider());
35 } 38 }
36 39
37 ResourceProvider* resource_provider() const { 40 ResourceProvider* resource_provider() const {
38 return resource_provider_.get(); 41 return resource_provider_.get();
39 } 42 }
40 43
41 SoftwareRenderer* renderer() const { return renderer_.get(); } 44 SoftwareRenderer* renderer() const { return renderer_.get(); }
42 45
43 void set_viewport_size(gfx::Size viewport_size) { 46 void set_viewport(gfx::Rect viewport) {
44 viewport_size_ = viewport_size; 47 viewport_ = viewport;
45 } 48 }
46 49
47 void set_should_clear_root_render_pass(bool clear_root_render_pass) { 50 void set_should_clear_root_render_pass(bool clear_root_render_pass) {
48 should_clear_root_render_pass_ = clear_root_render_pass; 51 should_clear_root_render_pass_ = clear_root_render_pass;
49 } 52 }
50 53
51 // RendererClient implementation. 54 // RendererClient implementation.
52 virtual gfx::Size DeviceViewportSize() const OVERRIDE { 55 virtual gfx::Rect DeviceViewport() const OVERRIDE {
53 return viewport_size_; 56 return viewport_;
54 } 57 }
55 virtual float DeviceScaleFactor() const OVERRIDE { 58 virtual float DeviceScaleFactor() const OVERRIDE {
56 return 1.f; 59 return 1.f;
57 } 60 }
58 virtual const LayerTreeSettings& Settings() const OVERRIDE { 61 virtual const LayerTreeSettings& Settings() const OVERRIDE {
59 return settings_; 62 return settings_;
60 } 63 }
61 virtual void SetFullRootLayerDamage() OVERRIDE {} 64 virtual void SetFullRootLayerDamage() OVERRIDE {}
62 virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy& policy) 65 virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy& policy)
63 OVERRIDE {} 66 OVERRIDE {}
64 virtual void EnforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) 67 virtual void EnforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy)
65 OVERRIDE {} 68 OVERRIDE {}
66 virtual bool HasImplThread() const OVERRIDE { return false; } 69 virtual bool HasImplThread() const OVERRIDE { return false; }
67 virtual bool ShouldClearRootRenderPass() const OVERRIDE { 70 virtual bool ShouldClearRootRenderPass() const OVERRIDE {
68 return should_clear_root_render_pass_; 71 return should_clear_root_render_pass_;
69 } 72 }
70 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { 73 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE {
71 return CompositorFrameMetadata(); 74 return CompositorFrameMetadata();
72 } 75 }
73 virtual bool AllowPartialSwap() const OVERRIDE { 76 virtual bool AllowPartialSwap() const OVERRIDE {
74 return true; 77 return true;
75 } 78 }
76 79
77 protected: 80 protected:
78 scoped_ptr<FakeOutputSurface> output_surface_; 81 scoped_ptr<FakeOutputSurface> output_surface_;
79 scoped_ptr<ResourceProvider> resource_provider_; 82 scoped_ptr<ResourceProvider> resource_provider_;
80 scoped_ptr<SoftwareRenderer> renderer_; 83 scoped_ptr<SoftwareRenderer> renderer_;
81 gfx::Size viewport_size_; 84 gfx::Rect viewport_;
82 LayerTreeSettings settings_; 85 LayerTreeSettings settings_;
83 bool should_clear_root_render_pass_; 86 bool should_clear_root_render_pass_;
84 }; 87 };
85 88
86 TEST_F(SoftwareRendererTest, SolidColorQuad) { 89 TEST_F(SoftwareRendererTest, SolidColorQuad) {
87 gfx::Size outer_size(100, 100); 90 gfx::Size outer_size(100, 100);
88 gfx::Size inner_size(98, 98); 91 gfx::Size inner_size(98, 98);
89 gfx::Rect outer_rect(outer_size); 92 gfx::Rect outer_rect(outer_size);
90 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); 93 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size);
91 set_viewport_size(outer_size); 94 set_viewport(gfx::Rect(outer_size));
92 95
93 InitializeRenderer(); 96 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
94 97
95 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); 98 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
96 shared_quad_state->SetAll( 99 shared_quad_state->SetAll(
97 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); 100 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0);
98 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); 101 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1);
99 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); 102 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create();
100 root_render_pass->SetNew( 103 root_render_pass->SetNew(
101 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); 104 root_render_pass_id, outer_rect, outer_rect, gfx::Transform());
102 scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create(); 105 scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create();
103 outer_quad->SetNew( 106 outer_quad->SetNew(
104 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); 107 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false);
105 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); 108 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create();
106 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); 109 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false);
107 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); 110 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>());
108 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); 111 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>());
109 112
110 RenderPassList list; 113 RenderPassList list;
111 list.push_back(root_render_pass.PassAs<RenderPass>()); 114 list.push_back(root_render_pass.PassAs<RenderPass>());
112 renderer()->DrawFrame(&list); 115 renderer()->DrawFrame(&list);
113 116
114 SkBitmap output; 117 SkBitmap output;
115 output.setConfig(SkBitmap::kARGB_8888_Config, 118 output.setConfig(SkBitmap::kARGB_8888_Config,
116 DeviceViewportSize().width(), 119 DeviceViewport().width(),
117 DeviceViewportSize().height()); 120 DeviceViewport().height());
118 output.allocPixels(); 121 output.allocPixels();
119 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); 122 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect);
120 123
121 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); 124 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0));
122 EXPECT_EQ(SK_ColorYELLOW, 125 EXPECT_EQ(SK_ColorYELLOW,
123 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); 126 output.getColor(outer_size.width() - 1, outer_size.height() - 1));
124 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); 127 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1));
125 EXPECT_EQ(SK_ColorCYAN, 128 EXPECT_EQ(SK_ColorCYAN,
126 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); 129 output.getColor(inner_size.width() - 1, inner_size.height() - 1));
127 } 130 }
128 131
129 TEST_F(SoftwareRendererTest, TileQuad) { 132 TEST_F(SoftwareRendererTest, TileQuad) {
130 gfx::Size outer_size(100, 100); 133 gfx::Size outer_size(100, 100);
131 gfx::Size inner_size(98, 98); 134 gfx::Size inner_size(98, 98);
132 gfx::Rect outer_rect(outer_size); 135 gfx::Rect outer_rect(outer_size);
133 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); 136 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size);
134 set_viewport_size(outer_size); 137 set_viewport(gfx::Rect(outer_size));
135 InitializeRenderer(); 138 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
136 139
137 ResourceProvider::ResourceId resource_yellow = 140 ResourceProvider::ResourceId resource_yellow =
138 resource_provider()->CreateResource( 141 resource_provider()->CreateResource(
139 outer_size, GL_RGBA, ResourceProvider::TextureUsageAny); 142 outer_size, GL_RGBA, ResourceProvider::TextureUsageAny);
140 ResourceProvider::ResourceId resource_cyan = 143 ResourceProvider::ResourceId resource_cyan =
141 resource_provider()->CreateResource( 144 resource_provider()->CreateResource(
142 inner_size, GL_RGBA, ResourceProvider::TextureUsageAny); 145 inner_size, GL_RGBA, ResourceProvider::TextureUsageAny);
143 146
144 SkBitmap yellow_tile; 147 SkBitmap yellow_tile;
145 yellow_tile.setConfig( 148 yellow_tile.setConfig(
(...skipping 12 matching lines...) Expand all
158 static_cast<uint8_t*>(yellow_tile.getPixels()), 161 static_cast<uint8_t*>(yellow_tile.getPixels()),
159 gfx::Rect(outer_size), 162 gfx::Rect(outer_size),
160 gfx::Rect(outer_size), 163 gfx::Rect(outer_size),
161 gfx::Vector2d()); 164 gfx::Vector2d());
162 resource_provider()->SetPixels(resource_cyan, 165 resource_provider()->SetPixels(resource_cyan,
163 static_cast<uint8_t*>(cyan_tile.getPixels()), 166 static_cast<uint8_t*>(cyan_tile.getPixels()),
164 gfx::Rect(inner_size), 167 gfx::Rect(inner_size),
165 gfx::Rect(inner_size), 168 gfx::Rect(inner_size),
166 gfx::Vector2d()); 169 gfx::Vector2d());
167 170
168 gfx::Rect root_rect = gfx::Rect(DeviceViewportSize()); 171 gfx::Rect root_rect = DeviceViewport();
169 172
170 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); 173 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
171 shared_quad_state->SetAll( 174 shared_quad_state->SetAll(
172 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); 175 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0);
173 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); 176 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1);
174 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); 177 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create();
175 root_render_pass->SetNew( 178 root_render_pass->SetNew(
176 root_render_pass_id, root_rect, root_rect, gfx::Transform()); 179 root_render_pass_id, root_rect, root_rect, gfx::Transform());
177 scoped_ptr<TileDrawQuad> outer_quad = TileDrawQuad::Create(); 180 scoped_ptr<TileDrawQuad> outer_quad = TileDrawQuad::Create();
178 outer_quad->SetNew(shared_quad_state.get(), 181 outer_quad->SetNew(shared_quad_state.get(),
(...skipping 13 matching lines...) Expand all
192 false); 195 false);
193 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); 196 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>());
194 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); 197 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>());
195 198
196 RenderPassList list; 199 RenderPassList list;
197 list.push_back(root_render_pass.PassAs<RenderPass>()); 200 list.push_back(root_render_pass.PassAs<RenderPass>());
198 renderer()->DrawFrame(&list); 201 renderer()->DrawFrame(&list);
199 202
200 SkBitmap output; 203 SkBitmap output;
201 output.setConfig(SkBitmap::kARGB_8888_Config, 204 output.setConfig(SkBitmap::kARGB_8888_Config,
202 DeviceViewportSize().width(), 205 DeviceViewport().width(),
203 DeviceViewportSize().height()); 206 DeviceViewport().height());
204 output.allocPixels(); 207 output.allocPixels();
205 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); 208 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect);
206 209
207 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); 210 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0));
208 EXPECT_EQ(SK_ColorYELLOW, 211 EXPECT_EQ(SK_ColorYELLOW,
209 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); 212 output.getColor(outer_size.width() - 1, outer_size.height() - 1));
210 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); 213 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1));
211 EXPECT_EQ(SK_ColorCYAN, 214 EXPECT_EQ(SK_ColorCYAN,
212 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); 215 output.getColor(inner_size.width() - 1, inner_size.height() - 1));
213 } 216 }
214 217
215 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { 218 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
216 gfx::Rect viewport_rect(0, 0, 100, 100); 219 gfx::Rect viewport_rect(0, 0, 100, 100);
217 set_viewport_size(viewport_rect.size()); 220 set_viewport(viewport_rect);
218 set_should_clear_root_render_pass(false); 221 set_should_clear_root_render_pass(false);
219 InitializeRenderer(); 222 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
220 223
221 RenderPassList list; 224 RenderPassList list;
222 225
223 SkBitmap output; 226 SkBitmap output;
224 output.setConfig(SkBitmap::kARGB_8888_Config, 227 output.setConfig(SkBitmap::kARGB_8888_Config,
225 viewport_rect.width(), 228 viewport_rect.width(),
226 viewport_rect.height()); 229 viewport_rect.height());
227 output.allocPixels(); 230 output.allocPixels();
228 231
229 // Draw a fullscreen green quad in a first frame. 232 // Draw a fullscreen green quad in a first frame.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); 264 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
262 265
263 EXPECT_EQ(SK_ColorMAGENTA, 266 EXPECT_EQ(SK_ColorMAGENTA,
264 output.getColor(smaller_rect.x(), smaller_rect.y())); 267 output.getColor(smaller_rect.x(), smaller_rect.y()));
265 EXPECT_EQ(SK_ColorMAGENTA, 268 EXPECT_EQ(SK_ColorMAGENTA,
266 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); 269 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
267 } 270 }
268 271
269 } // namespace 272 } // namespace
270 } // namespace cc 273 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698