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

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

Issue 14417014: cc: Add tile-free software compositing mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add tests and optimize quad generation Created 7 years, 7 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 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 "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/base/math_util.h" 8 #include "cc/base/math_util.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h" 10 #include "cc/output/compositor_frame_ack.h"
11 #include "cc/output/compositor_frame_metadata.h" 11 #include "cc/output/compositor_frame_metadata.h"
12 #include "cc/output/output_surface.h" 12 #include "cc/output/output_surface.h"
13 #include "cc/output/software_output_device.h" 13 #include "cc/output/software_output_device.h"
14 #include "cc/quads/debug_border_draw_quad.h" 14 #include "cc/quads/debug_border_draw_quad.h"
15 #include "cc/quads/picture_draw_quad.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/texture_draw_quad.h" 18 #include "cc/quads/texture_draw_quad.h"
18 #include "cc/quads/tile_draw_quad.h" 19 #include "cc/quads/tile_draw_quad.h"
19 #include "third_party/skia/include/core/SkCanvas.h" 20 #include "third_party/skia/include/core/SkCanvas.h"
20 #include "third_party/skia/include/core/SkColor.h" 21 #include "third_party/skia/include/core/SkColor.h"
21 #include "third_party/skia/include/core/SkDevice.h" 22 #include "third_party/skia/include/core/SkDevice.h"
22 #include "third_party/skia/include/core/SkMatrix.h" 23 #include "third_party/skia/include/core/SkMatrix.h"
23 #include "third_party/skia/include/core/SkShader.h" 24 #include "third_party/skia/include/core/SkShader.h"
24 #include "third_party/skia/include/effects/SkLayerRasterizer.h" 25 #include "third_party/skia/include/effects/SkLayerRasterizer.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 SoftwareRenderer::SoftwareRenderer(RendererClient* client, 65 SoftwareRenderer::SoftwareRenderer(RendererClient* client,
65 OutputSurface* output_surface, 66 OutputSurface* output_surface,
66 ResourceProvider* resource_provider) 67 ResourceProvider* resource_provider)
67 : DirectRenderer(client, resource_provider), 68 : DirectRenderer(client, resource_provider),
68 visible_(true), 69 visible_(true),
69 is_scissor_enabled_(false), 70 is_scissor_enabled_(false),
70 is_viewport_changed_(true), 71 is_viewport_changed_(true),
71 output_surface_(output_surface), 72 output_surface_(output_surface),
72 output_device_(output_surface->software_device()), 73 output_device_(output_surface->software_device()),
73 current_canvas_(NULL) { 74 current_canvas_(NULL) {
74 capabilities_.max_texture_size = resource_provider_->max_texture_size(); 75 if (resource_provider_) {
enne (OOO) 2013/05/07 06:11:22 Can you fill in these values here with something o
aelias_OOO_until_Jul13 2013/05/07 23:51:47 Hmm, that doesn't seem quite right. Nobody ever l
enne (OOO) 2013/05/09 17:35:43 Ok, I'll buy that argument.
75 capabilities_.best_texture_format = resource_provider_->best_texture_format(); 76 capabilities_.max_texture_size = resource_provider_->max_texture_size();
77 capabilities_.best_texture_format =
78 resource_provider_->best_texture_format();
79 }
76 capabilities_.using_set_visibility = true; 80 capabilities_.using_set_visibility = true;
77 // The updater can access bitmaps while the SoftwareRenderer is using them. 81 // The updater can access bitmaps while the SoftwareRenderer is using them.
78 capabilities_.allow_partial_texture_updates = true; 82 capabilities_.allow_partial_texture_updates = true;
79 capabilities_.using_partial_swap = true; 83 capabilities_.using_partial_swap = true;
80 if (Settings().compositor_frame_message && client_->HasImplThread()) 84 if (Settings().compositor_frame_message && client_->HasImplThread())
81 capabilities_.using_swap_complete_callback = true; 85 capabilities_.using_swap_complete_callback = true;
82 compositor_frame_.software_frame_data.reset(new SoftwareFrameData()); 86 compositor_frame_.software_frame_data.reset(new SoftwareFrameData());
83 } 87 }
84 88
85 SoftwareRenderer::~SoftwareRenderer() {} 89 SoftwareRenderer::~SoftwareRenderer() {}
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 current_paint_.setAlpha(quad->opacity() * 255); 240 current_paint_.setAlpha(quad->opacity() * 255);
237 current_paint_.setXfermodeMode(SkXfermode::kSrcOver_Mode); 241 current_paint_.setXfermodeMode(SkXfermode::kSrcOver_Mode);
238 } else { 242 } else {
239 current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode); 243 current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode);
240 } 244 }
241 245
242 switch (quad->material) { 246 switch (quad->material) {
243 case DrawQuad::DEBUG_BORDER: 247 case DrawQuad::DEBUG_BORDER:
244 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); 248 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad));
245 break; 249 break;
250 case DrawQuad::PICTURE_CONTENT:
251 DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad));
252 break;
246 case DrawQuad::SOLID_COLOR: 253 case DrawQuad::SOLID_COLOR:
247 DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad)); 254 DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad));
248 break; 255 break;
249 case DrawQuad::TEXTURE_CONTENT: 256 case DrawQuad::TEXTURE_CONTENT:
250 DrawTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); 257 DrawTextureQuad(frame, TextureDrawQuad::MaterialCast(quad));
251 break; 258 break;
252 case DrawQuad::TILED_CONTENT: 259 case DrawQuad::TILED_CONTENT:
253 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); 260 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad));
254 break; 261 break;
255 case DrawQuad::RENDER_PASS: 262 case DrawQuad::RENDER_PASS:
(...skipping 19 matching lines...) Expand all
275 current_canvas_->resetMatrix(); 282 current_canvas_->resetMatrix();
276 283
277 current_paint_.setColor(quad->color); 284 current_paint_.setColor(quad->color);
278 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); 285 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color));
279 current_paint_.setStyle(SkPaint::kStroke_Style); 286 current_paint_.setStyle(SkPaint::kStroke_Style);
280 current_paint_.setStrokeWidth(quad->width); 287 current_paint_.setStrokeWidth(quad->width);
281 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, 288 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode,
282 4, transformed_vertices, current_paint_); 289 4, transformed_vertices, current_paint_);
283 } 290 }
284 291
292 void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
293 const PictureDrawQuad* quad) {
294 SkMatrix content_matrix;
295 content_matrix.setRectToRect(
296 gfx::RectFToSkRect(quad->tex_coord_rect),
297 gfx::RectFToSkRect(QuadVertexRect()),
298 SkMatrix::kFill_ScaleToFit);
299 current_canvas_->concat(content_matrix);
300
301 if (quad->ShouldDrawWithBlending()) {
302 TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad with blending");
303 SkBitmap temp_bitmap;
304 temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
305 quad->texture_size.width(),
306 quad->texture_size.height());
307 temp_bitmap.allocPixels();
308 SkDevice temp_device(temp_bitmap);
309 SkCanvas temp_canvas(&temp_device);
310
311 quad->picture_pile->Raster(
312 &temp_canvas, quad->content_rect, quad->contents_scale, NULL);
313
314 current_paint_.setFilterBitmap(true);
315 current_canvas_->drawBitmap(temp_bitmap, 0, 0, &current_paint_);
316 } else {
317 TRACE_EVENT0("cc",
318 "SoftwareRenderer::DrawPictureQuad direct from PicturePile");
319 quad->picture_pile->Raster(
320 current_canvas_, quad->content_rect, quad->contents_scale, NULL);
321 }
322 }
323
285 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, 324 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
286 const SolidColorDrawQuad* quad) { 325 const SolidColorDrawQuad* quad) {
287 current_paint_.setColor(quad->color); 326 current_paint_.setColor(quad->color);
288 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); 327 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color));
289 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), 328 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()),
290 current_paint_); 329 current_paint_);
291 } 330 }
292 331
293 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame, 332 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame,
294 const TextureDrawQuad* quad) { 333 const TextureDrawQuad* quad) {
(...skipping 13 matching lines...) Expand all
308 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect); 347 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect);
309 if (quad->flipped) 348 if (quad->flipped)
310 current_canvas_->scale(1, -1); 349 current_canvas_->scale(1, -1);
311 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect, 350 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect,
312 gfx::RectFToSkRect(QuadVertexRect()), 351 gfx::RectFToSkRect(QuadVertexRect()),
313 &current_paint_); 352 &current_paint_);
314 } 353 }
315 354
316 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, 355 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame,
317 const TileDrawQuad* quad) { 356 const TileDrawQuad* quad) {
357 DCHECK(!output_surface_->ForcedDrawToSoftwareDevice());
318 DCHECK(IsSoftwareResource(quad->resource_id)); 358 DCHECK(IsSoftwareResource(quad->resource_id));
319 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, 359 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
320 quad->resource_id); 360 quad->resource_id);
321 361
322 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect); 362 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect);
323 current_paint_.setFilterBitmap(true); 363 current_paint_.setFilterBitmap(true);
324 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect, 364 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect,
325 gfx::RectFToSkRect(QuadVertexRect()), 365 gfx::RectFToSkRect(QuadVertexRect()),
326 &current_paint_); 366 &current_paint_);
327 } 367 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 4 * rect.width()); 467 4 * rect.width());
428 } 468 }
429 469
430 void SoftwareRenderer::SetVisible(bool visible) { 470 void SoftwareRenderer::SetVisible(bool visible) {
431 if (visible_ == visible) 471 if (visible_ == visible)
432 return; 472 return;
433 visible_ = visible; 473 visible_ = visible;
434 } 474 }
435 475
436 } // namespace cc 476 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698