| 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/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 gfx::Size outer_size(100, 100); | 94 gfx::Size outer_size(100, 100); |
| 95 gfx::Size inner_size(98, 98); | 95 gfx::Size inner_size(98, 98); |
| 96 gfx::Rect outer_rect(outer_size); | 96 gfx::Rect outer_rect(outer_size); |
| 97 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 97 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
| 98 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); | 98 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); |
| 99 | 99 |
| 100 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); | 100 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 101 | 101 |
| 102 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 102 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
| 103 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 103 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
| 104 root_render_pass->SetNew( | 104 root_render_pass->SetNew(root_render_pass_id, outer_rect, outer_rect, |
| 105 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); | 105 gfx::Transform(), FilterOperations(), |
| 106 FilterOperations()); |
| 106 SharedQuadState* shared_quad_state = | 107 SharedQuadState* shared_quad_state = |
| 107 root_render_pass->CreateAndAppendSharedQuadState(); | 108 root_render_pass->CreateAndAppendSharedQuadState(); |
| 108 shared_quad_state->SetAll(gfx::Transform(), outer_size, outer_rect, | 109 shared_quad_state->SetAll(gfx::Transform(), outer_size, outer_rect, |
| 109 outer_rect, false, 1.0, SkBlendMode::kSrcOver, 0); | 110 outer_rect, false, 1.0, SkBlendMode::kSrcOver, 0); |
| 110 SolidColorDrawQuad* inner_quad = | 111 SolidColorDrawQuad* inner_quad = |
| 111 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 112 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 112 inner_quad->SetNew( | 113 inner_quad->SetNew( |
| 113 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); | 114 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); |
| 114 inner_quad->visible_rect = visible_rect; | 115 inner_quad->visible_rect = visible_rect; |
| 115 SolidColorDrawQuad* outer_quad = | 116 SolidColorDrawQuad* outer_quad = |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 resource_provider()->CopyToResource( | 161 resource_provider()->CopyToResource( |
| 161 resource_yellow, static_cast<uint8_t*>(yellow_tile.getPixels()), | 162 resource_yellow, static_cast<uint8_t*>(yellow_tile.getPixels()), |
| 162 outer_size); | 163 outer_size); |
| 163 resource_provider()->CopyToResource( | 164 resource_provider()->CopyToResource( |
| 164 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), inner_size); | 165 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), inner_size); |
| 165 | 166 |
| 166 gfx::Rect root_rect = outer_rect; | 167 gfx::Rect root_rect = outer_rect; |
| 167 | 168 |
| 168 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 169 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
| 169 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 170 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
| 170 root_render_pass->SetNew( | 171 root_render_pass->SetNew(root_render_pass_id, root_rect, root_rect, |
| 171 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 172 gfx::Transform(), FilterOperations(), |
| 173 FilterOperations()); |
| 172 SharedQuadState* shared_quad_state = | 174 SharedQuadState* shared_quad_state = |
| 173 root_render_pass->CreateAndAppendSharedQuadState(); | 175 root_render_pass->CreateAndAppendSharedQuadState(); |
| 174 shared_quad_state->SetAll(gfx::Transform(), outer_size, outer_rect, | 176 shared_quad_state->SetAll(gfx::Transform(), outer_size, outer_rect, |
| 175 outer_rect, false, 1.0, SkBlendMode::kSrcOver, 0); | 177 outer_rect, false, 1.0, SkBlendMode::kSrcOver, 0); |
| 176 TileDrawQuad* inner_quad = | 178 TileDrawQuad* inner_quad = |
| 177 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 179 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
| 178 inner_quad->SetNew(shared_quad_state, inner_rect, inner_rect, inner_rect, | 180 inner_quad->SetNew(shared_quad_state, inner_rect, inner_rect, inner_rect, |
| 179 resource_cyan, gfx::RectF(gfx::SizeF(inner_size)), | 181 resource_cyan, gfx::RectF(gfx::SizeF(inner_size)), |
| 180 inner_size, false, false); | 182 inner_size, false, false); |
| 181 TileDrawQuad* outer_quad = | 183 TileDrawQuad* outer_quad = |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()), | 222 0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()), |
| 221 SK_ColorYELLOW); | 223 SK_ColorYELLOW); |
| 222 | 224 |
| 223 resource_provider()->CopyToResource( | 225 resource_provider()->CopyToResource( |
| 224 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), tile_size); | 226 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), tile_size); |
| 225 | 227 |
| 226 gfx::Rect root_rect(tile_size); | 228 gfx::Rect root_rect(tile_size); |
| 227 | 229 |
| 228 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 230 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
| 229 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 231 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
| 230 root_render_pass->SetNew( | 232 root_render_pass->SetNew(root_render_pass_id, root_rect, root_rect, |
| 231 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 233 gfx::Transform(), FilterOperations(), |
| 234 FilterOperations()); |
| 232 SharedQuadState* shared_quad_state = | 235 SharedQuadState* shared_quad_state = |
| 233 root_render_pass->CreateAndAppendSharedQuadState(); | 236 root_render_pass->CreateAndAppendSharedQuadState(); |
| 234 shared_quad_state->SetAll(gfx::Transform(), tile_size, tile_rect, tile_rect, | 237 shared_quad_state->SetAll(gfx::Transform(), tile_size, tile_rect, tile_rect, |
| 235 false, 1.0, SkBlendMode::kSrcOver, 0); | 238 false, 1.0, SkBlendMode::kSrcOver, 0); |
| 236 TileDrawQuad* quad = | 239 TileDrawQuad* quad = |
| 237 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 240 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
| 238 quad->SetNew(shared_quad_state, tile_rect, tile_rect, tile_rect, | 241 quad->SetNew(shared_quad_state, tile_rect, tile_rect, tile_rect, |
| 239 resource_cyan, gfx::RectF(gfx::SizeF(tile_size)), tile_size, | 242 resource_cyan, gfx::RectF(gfx::SizeF(tile_size)), tile_size, |
| 240 false, false); | 243 false, false); |
| 241 quad->visible_rect = visible_rect; | 244 quad->visible_rect = visible_rect; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 float device_scale_factor = 1.f; | 276 float device_scale_factor = 1.f; |
| 274 gfx::Size viewport_size(100, 100); | 277 gfx::Size viewport_size(100, 100); |
| 275 | 278 |
| 276 settings_.should_clear_root_render_pass = false; | 279 settings_.should_clear_root_render_pass = false; |
| 277 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); | 280 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 278 | 281 |
| 279 RenderPassList list; | 282 RenderPassList list; |
| 280 | 283 |
| 281 // Draw a fullscreen green quad in a first frame. | 284 // Draw a fullscreen green quad in a first frame. |
| 282 RenderPassId root_clear_pass_id(1, 0); | 285 RenderPassId root_clear_pass_id(1, 0); |
| 283 RenderPass* root_clear_pass = AddRenderPass( | 286 RenderPass* root_clear_pass = |
| 284 &list, root_clear_pass_id, gfx::Rect(viewport_size), gfx::Transform()); | 287 AddRenderPass(&list, root_clear_pass_id, gfx::Rect(viewport_size), |
| 288 gfx::Transform(), FilterOperations()); |
| 285 AddQuad(root_clear_pass, gfx::Rect(viewport_size), SK_ColorGREEN); | 289 AddQuad(root_clear_pass, gfx::Rect(viewport_size), SK_ColorGREEN); |
| 286 | 290 |
| 287 renderer()->DecideRenderPassAllocationsForFrame(list); | 291 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 288 | 292 |
| 289 std::unique_ptr<SkBitmap> output = | 293 std::unique_ptr<SkBitmap> output = |
| 290 DrawAndCopyOutput(&list, device_scale_factor, viewport_size); | 294 DrawAndCopyOutput(&list, device_scale_factor, viewport_size); |
| 291 EXPECT_EQ(viewport_size.width(), output->info().width()); | 295 EXPECT_EQ(viewport_size.width(), output->info().width()); |
| 292 EXPECT_EQ(viewport_size.height(), output->info().height()); | 296 EXPECT_EQ(viewport_size.height(), output->info().height()); |
| 293 | 297 |
| 294 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); | 298 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| 295 EXPECT_EQ(SK_ColorGREEN, output->getColor(viewport_size.width() - 1, | 299 EXPECT_EQ(SK_ColorGREEN, output->getColor(viewport_size.width() - 1, |
| 296 viewport_size.height() - 1)); | 300 viewport_size.height() - 1)); |
| 297 | 301 |
| 298 list.clear(); | 302 list.clear(); |
| 299 | 303 |
| 300 // Draw a smaller magenta rect without filling the viewport in a separate | 304 // Draw a smaller magenta rect without filling the viewport in a separate |
| 301 // frame. | 305 // frame. |
| 302 gfx::Rect smaller_rect(20, 20, 60, 60); | 306 gfx::Rect smaller_rect(20, 20, 60, 60); |
| 303 | 307 |
| 304 RenderPassId root_smaller_pass_id(2, 0); | 308 RenderPassId root_smaller_pass_id(2, 0); |
| 305 RenderPass* root_smaller_pass = AddRenderPass( | 309 RenderPass* root_smaller_pass = |
| 306 &list, root_smaller_pass_id, gfx::Rect(viewport_size), gfx::Transform()); | 310 AddRenderPass(&list, root_smaller_pass_id, gfx::Rect(viewport_size), |
| 311 gfx::Transform(), FilterOperations()); |
| 307 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); | 312 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); |
| 308 | 313 |
| 309 renderer()->DecideRenderPassAllocationsForFrame(list); | 314 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 310 | 315 |
| 311 output = DrawAndCopyOutput(&list, device_scale_factor, viewport_size); | 316 output = DrawAndCopyOutput(&list, device_scale_factor, viewport_size); |
| 312 EXPECT_EQ(viewport_size.width(), output->info().width()); | 317 EXPECT_EQ(viewport_size.width(), output->info().width()); |
| 313 EXPECT_EQ(viewport_size.height(), output->info().height()); | 318 EXPECT_EQ(viewport_size.height(), output->info().height()); |
| 314 | 319 |
| 315 // If we didn't clear, the borders should still be green. | 320 // If we didn't clear, the borders should still be green. |
| 316 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); | 321 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 328 float device_scale_factor = 1.f; | 333 float device_scale_factor = 1.f; |
| 329 gfx::Size viewport_size(100, 100); | 334 gfx::Size viewport_size(100, 100); |
| 330 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); | 335 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 331 | 336 |
| 332 RenderPassList list; | 337 RenderPassList list; |
| 333 | 338 |
| 334 // Pass drawn as inner quad is magenta. | 339 // Pass drawn as inner quad is magenta. |
| 335 gfx::Rect smaller_rect(20, 20, 60, 60); | 340 gfx::Rect smaller_rect(20, 20, 60, 60); |
| 336 RenderPassId smaller_pass_id(2, 1); | 341 RenderPassId smaller_pass_id(2, 1); |
| 337 RenderPass* smaller_pass = | 342 RenderPass* smaller_pass = |
| 338 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); | 343 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform(), |
| 344 FilterOperations()); |
| 339 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); | 345 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); |
| 340 | 346 |
| 341 // Root pass is green. | 347 // Root pass is green. |
| 342 RenderPassId root_clear_pass_id(1, 0); | 348 RenderPassId root_clear_pass_id(1, 0); |
| 343 RenderPass* root_clear_pass = AddRenderPass( | 349 RenderPass* root_clear_pass = |
| 344 &list, root_clear_pass_id, gfx::Rect(viewport_size), gfx::Transform()); | 350 AddRenderPass(&list, root_clear_pass_id, gfx::Rect(viewport_size), |
| 351 gfx::Transform(), FilterOperations()); |
| 345 AddRenderPassQuad(root_clear_pass, smaller_pass); | 352 AddRenderPassQuad(root_clear_pass, smaller_pass); |
| 346 AddQuad(root_clear_pass, gfx::Rect(viewport_size), SK_ColorGREEN); | 353 AddQuad(root_clear_pass, gfx::Rect(viewport_size), SK_ColorGREEN); |
| 347 | 354 |
| 348 // Interior pass quad has smaller visible rect. | 355 // Interior pass quad has smaller visible rect. |
| 349 gfx::Rect interior_visible_rect(30, 30, 40, 40); | 356 gfx::Rect interior_visible_rect(30, 30, 40, 40); |
| 350 root_clear_pass->quad_list.front()->visible_rect = interior_visible_rect; | 357 root_clear_pass->quad_list.front()->visible_rect = interior_visible_rect; |
| 351 | 358 |
| 352 renderer()->DecideRenderPassAllocationsForFrame(list); | 359 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 353 | 360 |
| 354 std::unique_ptr<SkBitmap> output = | 361 std::unique_ptr<SkBitmap> output = |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 | 412 |
| 406 settings_.partial_swap_enabled = true; | 413 settings_.partial_swap_enabled = true; |
| 407 | 414 |
| 408 auto device_owned = base::MakeUnique<PartialSwapSoftwareOutputDevice>(); | 415 auto device_owned = base::MakeUnique<PartialSwapSoftwareOutputDevice>(); |
| 409 auto* device = device_owned.get(); | 416 auto* device = device_owned.get(); |
| 410 InitializeRenderer(std::move(device_owned)); | 417 InitializeRenderer(std::move(device_owned)); |
| 411 | 418 |
| 412 RenderPassList list; | 419 RenderPassList list; |
| 413 | 420 |
| 414 RenderPassId root_pass_id(1, 0); | 421 RenderPassId root_pass_id(1, 0); |
| 415 RenderPass* root_pass = AddRenderPass( | 422 RenderPass* root_pass = |
| 416 &list, root_pass_id, gfx::Rect(viewport_size), gfx::Transform()); | 423 AddRenderPass(&list, root_pass_id, gfx::Rect(viewport_size), |
| 424 gfx::Transform(), FilterOperations()); |
| 417 AddQuad(root_pass, gfx::Rect(viewport_size), SK_ColorGREEN); | 425 AddQuad(root_pass, gfx::Rect(viewport_size), SK_ColorGREEN); |
| 418 | 426 |
| 419 // Partial frame, we should pass this rect to the SoftwareOutputDevice. | 427 // Partial frame, we should pass this rect to the SoftwareOutputDevice. |
| 420 // partial swap is enabled. | 428 // partial swap is enabled. |
| 421 root_pass->damage_rect = gfx::Rect(2, 2, 3, 3); | 429 root_pass->damage_rect = gfx::Rect(2, 2, 3, 3); |
| 422 | 430 |
| 423 renderer()->DecideRenderPassAllocationsForFrame(list); | 431 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 424 renderer()->DrawFrame(&list, device_scale_factor, gfx::ColorSpace(), | 432 renderer()->DrawFrame(&list, device_scale_factor, gfx::ColorSpace(), |
| 425 viewport_size); | 433 viewport_size); |
| 426 | 434 |
| 427 // The damage rect should be reported to the SoftwareOutputDevice. | 435 // The damage rect should be reported to the SoftwareOutputDevice. |
| 428 EXPECT_EQ(gfx::Rect(2, 2, 3, 3), device->damage_rect_at_start()); | 436 EXPECT_EQ(gfx::Rect(2, 2, 3, 3), device->damage_rect_at_start()); |
| 429 // The SkCanvas should be clipped to the damage rect. | 437 // The SkCanvas should be clipped to the damage rect. |
| 430 EXPECT_EQ(gfx::Rect(2, 2, 3, 3), device->clip_rect_at_end()); | 438 EXPECT_EQ(gfx::Rect(2, 2, 3, 3), device->clip_rect_at_end()); |
| 431 } | 439 } |
| 432 | 440 |
| 433 } // namespace | 441 } // namespace |
| 434 } // namespace cc | 442 } // namespace cc |
| OLD | NEW |