OLD | NEW |
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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
| 9 #include "base/memory/ptr_util.h" |
9 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
10 #include "cc/output/compositor_frame_metadata.h" | 11 #include "cc/output/compositor_frame_metadata.h" |
11 #include "cc/output/copy_output_request.h" | 12 #include "cc/output/copy_output_request.h" |
12 #include "cc/output/copy_output_result.h" | 13 #include "cc/output/copy_output_result.h" |
13 #include "cc/output/software_output_device.h" | 14 #include "cc/output/software_output_device.h" |
14 #include "cc/quads/render_pass.h" | 15 #include "cc/quads/render_pass.h" |
15 #include "cc/quads/render_pass_draw_quad.h" | 16 #include "cc/quads/render_pass_draw_quad.h" |
16 #include "cc/quads/solid_color_draw_quad.h" | 17 #include "cc/quads/solid_color_draw_quad.h" |
17 #include "cc/quads/tile_draw_quad.h" | 18 #include "cc/quads/tile_draw_quad.h" |
18 #include "cc/test/animation_test_common.h" | 19 #include "cc/test/animation_test_common.h" |
19 #include "cc/test/fake_output_surface.h" | 20 #include "cc/test/fake_output_surface.h" |
20 #include "cc/test/fake_output_surface_client.h" | 21 #include "cc/test/fake_output_surface_client.h" |
21 #include "cc/test/fake_resource_provider.h" | 22 #include "cc/test/fake_resource_provider.h" |
22 #include "cc/test/geometry_test_utils.h" | 23 #include "cc/test/geometry_test_utils.h" |
23 #include "cc/test/render_pass_test_utils.h" | 24 #include "cc/test/render_pass_test_utils.h" |
24 #include "cc/test/test_shared_bitmap_manager.h" | 25 #include "cc/test/test_shared_bitmap_manager.h" |
25 #include "testing/gmock/include/gmock/gmock.h" | 26 #include "testing/gmock/include/gmock/gmock.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
27 #include "third_party/skia/include/core/SkCanvas.h" | 28 #include "third_party/skia/include/core/SkCanvas.h" |
28 | 29 |
29 namespace cc { | 30 namespace cc { |
30 namespace { | 31 namespace { |
31 | 32 |
32 class SoftwareRendererTest : public testing::Test, public RendererClient { | 33 class SoftwareRendererTest : public testing::Test, public RendererClient { |
33 public: | 34 public: |
34 void InitializeRenderer( | 35 void InitializeRenderer( |
35 scoped_ptr<SoftwareOutputDevice> software_output_device) { | 36 std::unique_ptr<SoftwareOutputDevice> software_output_device) { |
36 output_surface_ = | 37 output_surface_ = |
37 FakeOutputSurface::CreateSoftware(std::move(software_output_device)); | 38 FakeOutputSurface::CreateSoftware(std::move(software_output_device)); |
38 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 39 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
39 | 40 |
40 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); | 41 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); |
41 resource_provider_ = FakeResourceProvider::Create( | 42 resource_provider_ = FakeResourceProvider::Create( |
42 output_surface_.get(), shared_bitmap_manager_.get()); | 43 output_surface_.get(), shared_bitmap_manager_.get()); |
43 renderer_ = SoftwareRenderer::Create( | 44 renderer_ = SoftwareRenderer::Create( |
44 this, &settings_, output_surface_.get(), resource_provider()); | 45 this, &settings_, output_surface_.get(), resource_provider()); |
45 } | 46 } |
46 | 47 |
47 ResourceProvider* resource_provider() const { | 48 ResourceProvider* resource_provider() const { |
48 return resource_provider_.get(); | 49 return resource_provider_.get(); |
49 } | 50 } |
50 | 51 |
51 SoftwareRenderer* renderer() const { return renderer_.get(); } | 52 SoftwareRenderer* renderer() const { return renderer_.get(); } |
52 | 53 |
53 // RendererClient implementation. | 54 // RendererClient implementation. |
54 void SetFullRootLayerDamage() override {} | 55 void SetFullRootLayerDamage() override {} |
55 | 56 |
56 scoped_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, | 57 std::unique_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, |
57 float device_scale_factor, | 58 float device_scale_factor, |
58 gfx::Rect device_viewport_rect) { | 59 gfx::Rect device_viewport_rect) { |
59 scoped_ptr<SkBitmap> bitmap_result; | 60 std::unique_ptr<SkBitmap> bitmap_result; |
60 base::RunLoop loop; | 61 base::RunLoop loop; |
61 | 62 |
62 list->back()->copy_requests.push_back( | 63 list->back()->copy_requests.push_back( |
63 CopyOutputRequest::CreateBitmapRequest( | 64 CopyOutputRequest::CreateBitmapRequest( |
64 base::Bind(&SoftwareRendererTest::SaveBitmapResult, | 65 base::Bind(&SoftwareRendererTest::SaveBitmapResult, |
65 base::Unretained(&bitmap_result), | 66 base::Unretained(&bitmap_result), |
66 loop.QuitClosure()))); | 67 loop.QuitClosure()))); |
67 | 68 |
68 renderer()->DrawFrame(list, | 69 renderer()->DrawFrame(list, |
69 device_scale_factor, | 70 device_scale_factor, |
70 device_viewport_rect, | 71 device_viewport_rect, |
71 device_viewport_rect, | 72 device_viewport_rect, |
72 false); | 73 false); |
73 loop.Run(); | 74 loop.Run(); |
74 return bitmap_result; | 75 return bitmap_result; |
75 } | 76 } |
76 | 77 |
77 static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result, | 78 static void SaveBitmapResult(std::unique_ptr<SkBitmap>* bitmap_result, |
78 const base::Closure& quit_closure, | 79 const base::Closure& quit_closure, |
79 scoped_ptr<CopyOutputResult> result) { | 80 std::unique_ptr<CopyOutputResult> result) { |
80 DCHECK(result->HasBitmap()); | 81 DCHECK(result->HasBitmap()); |
81 *bitmap_result = result->TakeBitmap(); | 82 *bitmap_result = result->TakeBitmap(); |
82 quit_closure.Run(); | 83 quit_closure.Run(); |
83 } | 84 } |
84 | 85 |
85 protected: | 86 protected: |
86 RendererSettings settings_; | 87 RendererSettings settings_; |
87 FakeOutputSurfaceClient output_surface_client_; | 88 FakeOutputSurfaceClient output_surface_client_; |
88 scoped_ptr<FakeOutputSurface> output_surface_; | 89 std::unique_ptr<FakeOutputSurface> output_surface_; |
89 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 90 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
90 scoped_ptr<ResourceProvider> resource_provider_; | 91 std::unique_ptr<ResourceProvider> resource_provider_; |
91 scoped_ptr<SoftwareRenderer> renderer_; | 92 std::unique_ptr<SoftwareRenderer> renderer_; |
92 }; | 93 }; |
93 | 94 |
94 TEST_F(SoftwareRendererTest, SolidColorQuad) { | 95 TEST_F(SoftwareRendererTest, SolidColorQuad) { |
95 gfx::Size outer_size(100, 100); | 96 gfx::Size outer_size(100, 100); |
96 gfx::Size inner_size(98, 98); | 97 gfx::Size inner_size(98, 98); |
97 gfx::Rect outer_rect(outer_size); | 98 gfx::Rect outer_rect(outer_size); |
98 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 99 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
99 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); | 100 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); |
100 | 101 |
101 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 102 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
102 | 103 |
103 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 104 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
104 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 105 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
105 root_render_pass->SetNew( | 106 root_render_pass->SetNew( |
106 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); | 107 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); |
107 SharedQuadState* shared_quad_state = | 108 SharedQuadState* shared_quad_state = |
108 root_render_pass->CreateAndAppendSharedQuadState(); | 109 root_render_pass->CreateAndAppendSharedQuadState(); |
109 shared_quad_state->SetAll(gfx::Transform(), | 110 shared_quad_state->SetAll(gfx::Transform(), |
110 outer_size, | 111 outer_size, |
111 outer_rect, | 112 outer_rect, |
112 outer_rect, | 113 outer_rect, |
113 false, | 114 false, |
114 1.0, | 115 1.0, |
115 SkXfermode::kSrcOver_Mode, | 116 SkXfermode::kSrcOver_Mode, |
116 0); | 117 0); |
117 SolidColorDrawQuad* inner_quad = | 118 SolidColorDrawQuad* inner_quad = |
118 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 119 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
119 inner_quad->SetNew( | 120 inner_quad->SetNew( |
120 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); | 121 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); |
121 inner_quad->visible_rect = visible_rect; | 122 inner_quad->visible_rect = visible_rect; |
122 SolidColorDrawQuad* outer_quad = | 123 SolidColorDrawQuad* outer_quad = |
123 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 124 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
124 outer_quad->SetNew( | 125 outer_quad->SetNew( |
125 shared_quad_state, outer_rect, outer_rect, SK_ColorYELLOW, false); | 126 shared_quad_state, outer_rect, outer_rect, SK_ColorYELLOW, false); |
126 | 127 |
127 RenderPassList list; | 128 RenderPassList list; |
128 list.push_back(std::move(root_render_pass)); | 129 list.push_back(std::move(root_render_pass)); |
129 | 130 |
130 float device_scale_factor = 1.f; | 131 float device_scale_factor = 1.f; |
131 gfx::Rect device_viewport_rect(outer_size); | 132 gfx::Rect device_viewport_rect(outer_size); |
132 scoped_ptr<SkBitmap> output = | 133 std::unique_ptr<SkBitmap> output = |
133 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 134 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
134 EXPECT_EQ(outer_rect.width(), output->info().width()); | 135 EXPECT_EQ(outer_rect.width(), output->info().width()); |
135 EXPECT_EQ(outer_rect.height(), output->info().height()); | 136 EXPECT_EQ(outer_rect.height(), output->info().height()); |
136 | 137 |
137 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); | 138 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
138 EXPECT_EQ(SK_ColorYELLOW, | 139 EXPECT_EQ(SK_ColorYELLOW, |
139 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); | 140 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
140 EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); | 141 EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); |
141 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); | 142 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); |
142 EXPECT_EQ(SK_ColorCYAN, | 143 EXPECT_EQ(SK_ColorCYAN, |
143 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); | 144 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
144 } | 145 } |
145 | 146 |
146 TEST_F(SoftwareRendererTest, TileQuad) { | 147 TEST_F(SoftwareRendererTest, TileQuad) { |
147 gfx::Size outer_size(100, 100); | 148 gfx::Size outer_size(100, 100); |
148 gfx::Size inner_size(98, 98); | 149 gfx::Size inner_size(98, 98); |
149 gfx::Rect outer_rect(outer_size); | 150 gfx::Rect outer_rect(outer_size); |
150 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 151 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
151 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 152 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
152 | 153 |
153 ResourceId resource_yellow = resource_provider()->CreateResource( | 154 ResourceId resource_yellow = resource_provider()->CreateResource( |
154 outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | 155 outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
155 ResourceId resource_cyan = resource_provider()->CreateResource( | 156 ResourceId resource_cyan = resource_provider()->CreateResource( |
156 inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | 157 inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
157 | 158 |
158 SkBitmap yellow_tile; | 159 SkBitmap yellow_tile; |
159 yellow_tile.allocN32Pixels(outer_size.width(), outer_size.height()); | 160 yellow_tile.allocN32Pixels(outer_size.width(), outer_size.height()); |
160 yellow_tile.eraseColor(SK_ColorYELLOW); | 161 yellow_tile.eraseColor(SK_ColorYELLOW); |
161 | 162 |
162 SkBitmap cyan_tile; | 163 SkBitmap cyan_tile; |
163 cyan_tile.allocN32Pixels(inner_size.width(), inner_size.height()); | 164 cyan_tile.allocN32Pixels(inner_size.width(), inner_size.height()); |
164 cyan_tile.eraseColor(SK_ColorCYAN); | 165 cyan_tile.eraseColor(SK_ColorCYAN); |
165 | 166 |
166 resource_provider()->CopyToResource( | 167 resource_provider()->CopyToResource( |
167 resource_yellow, static_cast<uint8_t*>(yellow_tile.getPixels()), | 168 resource_yellow, static_cast<uint8_t*>(yellow_tile.getPixels()), |
168 outer_size); | 169 outer_size); |
169 resource_provider()->CopyToResource( | 170 resource_provider()->CopyToResource( |
170 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), inner_size); | 171 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), inner_size); |
171 | 172 |
172 gfx::Rect root_rect = outer_rect; | 173 gfx::Rect root_rect = outer_rect; |
173 | 174 |
174 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 175 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
175 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 176 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
176 root_render_pass->SetNew( | 177 root_render_pass->SetNew( |
177 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 178 root_render_pass_id, root_rect, root_rect, gfx::Transform()); |
178 SharedQuadState* shared_quad_state = | 179 SharedQuadState* shared_quad_state = |
179 root_render_pass->CreateAndAppendSharedQuadState(); | 180 root_render_pass->CreateAndAppendSharedQuadState(); |
180 shared_quad_state->SetAll(gfx::Transform(), | 181 shared_quad_state->SetAll(gfx::Transform(), |
181 outer_size, | 182 outer_size, |
182 outer_rect, | 183 outer_rect, |
183 outer_rect, | 184 outer_rect, |
184 false, | 185 false, |
185 1.0, | 186 1.0, |
186 SkXfermode::kSrcOver_Mode, | 187 SkXfermode::kSrcOver_Mode, |
187 0); | 188 0); |
188 TileDrawQuad* inner_quad = | 189 TileDrawQuad* inner_quad = |
189 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 190 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
190 inner_quad->SetNew(shared_quad_state, inner_rect, inner_rect, inner_rect, | 191 inner_quad->SetNew(shared_quad_state, inner_rect, inner_rect, inner_rect, |
191 resource_cyan, gfx::RectF(gfx::SizeF(inner_size)), | 192 resource_cyan, gfx::RectF(gfx::SizeF(inner_size)), |
192 inner_size, false, false); | 193 inner_size, false, false); |
193 TileDrawQuad* outer_quad = | 194 TileDrawQuad* outer_quad = |
194 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 195 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
195 outer_quad->SetNew(shared_quad_state, outer_rect, outer_rect, outer_rect, | 196 outer_quad->SetNew(shared_quad_state, outer_rect, outer_rect, outer_rect, |
196 resource_yellow, gfx::RectF(gfx::SizeF(outer_size)), | 197 resource_yellow, gfx::RectF(gfx::SizeF(outer_size)), |
197 outer_size, false, false); | 198 outer_size, false, false); |
198 | 199 |
199 RenderPassList list; | 200 RenderPassList list; |
200 list.push_back(std::move(root_render_pass)); | 201 list.push_back(std::move(root_render_pass)); |
201 | 202 |
202 float device_scale_factor = 1.f; | 203 float device_scale_factor = 1.f; |
203 gfx::Rect device_viewport_rect(outer_size); | 204 gfx::Rect device_viewport_rect(outer_size); |
204 scoped_ptr<SkBitmap> output = | 205 std::unique_ptr<SkBitmap> output = |
205 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 206 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
206 EXPECT_EQ(outer_rect.width(), output->info().width()); | 207 EXPECT_EQ(outer_rect.width(), output->info().width()); |
207 EXPECT_EQ(outer_rect.height(), output->info().height()); | 208 EXPECT_EQ(outer_rect.height(), output->info().height()); |
208 | 209 |
209 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); | 210 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
210 EXPECT_EQ(SK_ColorYELLOW, | 211 EXPECT_EQ(SK_ColorYELLOW, |
211 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); | 212 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
212 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); | 213 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); |
213 EXPECT_EQ(SK_ColorCYAN, | 214 EXPECT_EQ(SK_ColorCYAN, |
214 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); | 215 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
215 } | 216 } |
216 | 217 |
217 TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { | 218 TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { |
218 gfx::Size tile_size(100, 100); | 219 gfx::Size tile_size(100, 100); |
219 gfx::Rect tile_rect(tile_size); | 220 gfx::Rect tile_rect(tile_size); |
220 gfx::Rect visible_rect = tile_rect; | 221 gfx::Rect visible_rect = tile_rect; |
221 visible_rect.Inset(1, 2, 3, 4); | 222 visible_rect.Inset(1, 2, 3, 4); |
222 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 223 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
223 | 224 |
224 ResourceId resource_cyan = resource_provider()->CreateResource( | 225 ResourceId resource_cyan = resource_provider()->CreateResource( |
225 tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | 226 tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
226 | 227 |
227 SkBitmap cyan_tile; // The lowest five rows are yellow. | 228 SkBitmap cyan_tile; // The lowest five rows are yellow. |
228 cyan_tile.allocN32Pixels(tile_size.width(), tile_size.height()); | 229 cyan_tile.allocN32Pixels(tile_size.width(), tile_size.height()); |
229 cyan_tile.eraseColor(SK_ColorCYAN); | 230 cyan_tile.eraseColor(SK_ColorCYAN); |
230 cyan_tile.eraseArea( | 231 cyan_tile.eraseArea( |
231 SkIRect::MakeLTRB( | 232 SkIRect::MakeLTRB( |
232 0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()), | 233 0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()), |
233 SK_ColorYELLOW); | 234 SK_ColorYELLOW); |
234 | 235 |
235 resource_provider()->CopyToResource( | 236 resource_provider()->CopyToResource( |
236 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), tile_size); | 237 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), tile_size); |
237 | 238 |
238 gfx::Rect root_rect(tile_size); | 239 gfx::Rect root_rect(tile_size); |
239 | 240 |
240 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 241 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
241 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 242 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
242 root_render_pass->SetNew( | 243 root_render_pass->SetNew( |
243 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 244 root_render_pass_id, root_rect, root_rect, gfx::Transform()); |
244 SharedQuadState* shared_quad_state = | 245 SharedQuadState* shared_quad_state = |
245 root_render_pass->CreateAndAppendSharedQuadState(); | 246 root_render_pass->CreateAndAppendSharedQuadState(); |
246 shared_quad_state->SetAll(gfx::Transform(), | 247 shared_quad_state->SetAll(gfx::Transform(), |
247 tile_size, | 248 tile_size, |
248 tile_rect, | 249 tile_rect, |
249 tile_rect, | 250 tile_rect, |
250 false, | 251 false, |
251 1.0, | 252 1.0, |
252 SkXfermode::kSrcOver_Mode, | 253 SkXfermode::kSrcOver_Mode, |
253 0); | 254 0); |
254 TileDrawQuad* quad = | 255 TileDrawQuad* quad = |
255 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 256 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
256 quad->SetNew(shared_quad_state, tile_rect, tile_rect, tile_rect, | 257 quad->SetNew(shared_quad_state, tile_rect, tile_rect, tile_rect, |
257 resource_cyan, gfx::RectF(gfx::SizeF(tile_size)), tile_size, | 258 resource_cyan, gfx::RectF(gfx::SizeF(tile_size)), tile_size, |
258 false, false); | 259 false, false); |
259 quad->visible_rect = visible_rect; | 260 quad->visible_rect = visible_rect; |
260 | 261 |
261 RenderPassList list; | 262 RenderPassList list; |
262 list.push_back(std::move(root_render_pass)); | 263 list.push_back(std::move(root_render_pass)); |
263 | 264 |
264 float device_scale_factor = 1.f; | 265 float device_scale_factor = 1.f; |
265 gfx::Rect device_viewport_rect(tile_size); | 266 gfx::Rect device_viewport_rect(tile_size); |
266 scoped_ptr<SkBitmap> output = | 267 std::unique_ptr<SkBitmap> output = |
267 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 268 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
268 EXPECT_EQ(tile_rect.width(), output->info().width()); | 269 EXPECT_EQ(tile_rect.width(), output->info().width()); |
269 EXPECT_EQ(tile_rect.height(), output->info().height()); | 270 EXPECT_EQ(tile_rect.height(), output->info().height()); |
270 | 271 |
271 // Check portion of tile not in visible rect isn't drawn. | 272 // Check portion of tile not in visible rect isn't drawn. |
272 const unsigned int kTransparent = SK_ColorTRANSPARENT; | 273 const unsigned int kTransparent = SK_ColorTRANSPARENT; |
273 EXPECT_EQ(kTransparent, output->getColor(0, 0)); | 274 EXPECT_EQ(kTransparent, output->getColor(0, 0)); |
274 EXPECT_EQ(kTransparent, | 275 EXPECT_EQ(kTransparent, |
275 output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); | 276 output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); |
276 EXPECT_EQ(kTransparent, | 277 EXPECT_EQ(kTransparent, |
277 output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); | 278 output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); |
278 EXPECT_EQ(kTransparent, | 279 EXPECT_EQ(kTransparent, |
279 output->getColor(visible_rect.right(), visible_rect.bottom())); | 280 output->getColor(visible_rect.right(), visible_rect.bottom())); |
280 // Ensure visible part is drawn correctly. | 281 // Ensure visible part is drawn correctly. |
281 EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); | 282 EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); |
282 EXPECT_EQ( | 283 EXPECT_EQ( |
283 SK_ColorCYAN, | 284 SK_ColorCYAN, |
284 output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); | 285 output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); |
285 // Ensure last visible line is correct. | 286 // Ensure last visible line is correct. |
286 EXPECT_EQ( | 287 EXPECT_EQ( |
287 SK_ColorYELLOW, | 288 SK_ColorYELLOW, |
288 output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); | 289 output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); |
289 } | 290 } |
290 | 291 |
291 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { | 292 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
292 float device_scale_factor = 1.f; | 293 float device_scale_factor = 1.f; |
293 gfx::Rect device_viewport_rect(0, 0, 100, 100); | 294 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
294 | 295 |
295 settings_.should_clear_root_render_pass = false; | 296 settings_.should_clear_root_render_pass = false; |
296 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 297 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
297 | 298 |
298 RenderPassList list; | 299 RenderPassList list; |
299 | 300 |
300 // Draw a fullscreen green quad in a first frame. | 301 // Draw a fullscreen green quad in a first frame. |
301 RenderPassId root_clear_pass_id(1, 0); | 302 RenderPassId root_clear_pass_id(1, 0); |
302 RenderPass* root_clear_pass = AddRenderPass( | 303 RenderPass* root_clear_pass = AddRenderPass( |
303 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); | 304 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
304 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); | 305 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
305 | 306 |
306 renderer()->DecideRenderPassAllocationsForFrame(list); | 307 renderer()->DecideRenderPassAllocationsForFrame(list); |
307 | 308 |
308 scoped_ptr<SkBitmap> output = | 309 std::unique_ptr<SkBitmap> output = |
309 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 310 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
310 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); | 311 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); |
311 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); | 312 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); |
312 | 313 |
313 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); | 314 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
314 EXPECT_EQ(SK_ColorGREEN, | 315 EXPECT_EQ(SK_ColorGREEN, |
315 output->getColor(device_viewport_rect.width() - 1, | 316 output->getColor(device_viewport_rect.width() - 1, |
316 device_viewport_rect.height() - 1)); | 317 device_viewport_rect.height() - 1)); |
317 | 318 |
318 list.clear(); | 319 list.clear(); |
(...skipping 22 matching lines...) Expand all Loading... |
341 EXPECT_EQ(SK_ColorMAGENTA, | 342 EXPECT_EQ(SK_ColorMAGENTA, |
342 output->getColor(smaller_rect.x(), smaller_rect.y())); | 343 output->getColor(smaller_rect.x(), smaller_rect.y())); |
343 EXPECT_EQ( | 344 EXPECT_EQ( |
344 SK_ColorMAGENTA, | 345 SK_ColorMAGENTA, |
345 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 346 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
346 } | 347 } |
347 | 348 |
348 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { | 349 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { |
349 float device_scale_factor = 1.f; | 350 float device_scale_factor = 1.f; |
350 gfx::Rect device_viewport_rect(0, 0, 100, 100); | 351 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
351 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 352 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
352 | 353 |
353 RenderPassList list; | 354 RenderPassList list; |
354 | 355 |
355 // Pass drawn as inner quad is magenta. | 356 // Pass drawn as inner quad is magenta. |
356 gfx::Rect smaller_rect(20, 20, 60, 60); | 357 gfx::Rect smaller_rect(20, 20, 60, 60); |
357 RenderPassId smaller_pass_id(2, 1); | 358 RenderPassId smaller_pass_id(2, 1); |
358 RenderPass* smaller_pass = | 359 RenderPass* smaller_pass = |
359 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); | 360 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); |
360 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); | 361 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); |
361 | 362 |
362 // Root pass is green. | 363 // Root pass is green. |
363 RenderPassId root_clear_pass_id(1, 0); | 364 RenderPassId root_clear_pass_id(1, 0); |
364 RenderPass* root_clear_pass = AddRenderPass( | 365 RenderPass* root_clear_pass = AddRenderPass( |
365 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); | 366 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
366 AddRenderPassQuad(root_clear_pass, smaller_pass); | 367 AddRenderPassQuad(root_clear_pass, smaller_pass); |
367 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); | 368 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
368 | 369 |
369 // Interior pass quad has smaller visible rect. | 370 // Interior pass quad has smaller visible rect. |
370 gfx::Rect interior_visible_rect(30, 30, 40, 40); | 371 gfx::Rect interior_visible_rect(30, 30, 40, 40); |
371 root_clear_pass->quad_list.front()->visible_rect = interior_visible_rect; | 372 root_clear_pass->quad_list.front()->visible_rect = interior_visible_rect; |
372 | 373 |
373 renderer()->DecideRenderPassAllocationsForFrame(list); | 374 renderer()->DecideRenderPassAllocationsForFrame(list); |
374 | 375 |
375 scoped_ptr<SkBitmap> output = | 376 std::unique_ptr<SkBitmap> output = |
376 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 377 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
377 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); | 378 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); |
378 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); | 379 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); |
379 | 380 |
380 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); | 381 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
381 EXPECT_EQ(SK_ColorGREEN, | 382 EXPECT_EQ(SK_ColorGREEN, |
382 output->getColor(device_viewport_rect.width() - 1, | 383 output->getColor(device_viewport_rect.width() - 1, |
383 device_viewport_rect.height() - 1)); | 384 device_viewport_rect.height() - 1)); |
384 | 385 |
385 // Part outside visible rect should remain green. | 386 // Part outside visible rect should remain green. |
386 EXPECT_EQ(SK_ColorGREEN, | 387 EXPECT_EQ(SK_ColorGREEN, |
387 output->getColor(smaller_rect.x(), smaller_rect.y())); | 388 output->getColor(smaller_rect.x(), smaller_rect.y())); |
388 EXPECT_EQ( | 389 EXPECT_EQ( |
389 SK_ColorGREEN, | 390 SK_ColorGREEN, |
390 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 391 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
391 | 392 |
392 EXPECT_EQ( | 393 EXPECT_EQ( |
393 SK_ColorMAGENTA, | 394 SK_ColorMAGENTA, |
394 output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); | 395 output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); |
395 EXPECT_EQ(SK_ColorMAGENTA, | 396 EXPECT_EQ(SK_ColorMAGENTA, |
396 output->getColor(interior_visible_rect.right() - 1, | 397 output->getColor(interior_visible_rect.right() - 1, |
397 interior_visible_rect.bottom() - 1)); | 398 interior_visible_rect.bottom() - 1)); |
398 } | 399 } |
399 | 400 |
400 } // namespace | 401 } // namespace |
401 } // namespace cc | 402 } // namespace cc |
OLD | NEW |