Chromium Code Reviews| 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 "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" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 } | 71 } |
| 72 | 72 |
| 73 SoftwareRenderer::SoftwareRenderer(RendererClient* client, | 73 SoftwareRenderer::SoftwareRenderer(RendererClient* client, |
| 74 const LayerTreeSettings* settings, | 74 const LayerTreeSettings* settings, |
| 75 OutputSurface* output_surface, | 75 OutputSurface* output_surface, |
| 76 ResourceProvider* resource_provider) | 76 ResourceProvider* resource_provider) |
| 77 : DirectRenderer(client, settings, output_surface, resource_provider), | 77 : DirectRenderer(client, settings, output_surface, resource_provider), |
| 78 is_scissor_enabled_(false), | 78 is_scissor_enabled_(false), |
| 79 is_backbuffer_discarded_(false), | 79 is_backbuffer_discarded_(false), |
| 80 output_device_(output_surface->software_device()), | 80 output_device_(output_surface->software_device()), |
| 81 current_canvas_(NULL) { | 81 current_canvas_(nullptr) { |
| 82 if (resource_provider_) { | 82 if (resource_provider_) { |
| 83 capabilities_.max_texture_size = resource_provider_->max_texture_size(); | 83 capabilities_.max_texture_size = resource_provider_->max_texture_size(); |
| 84 capabilities_.best_texture_format = | 84 capabilities_.best_texture_format = |
| 85 resource_provider_->best_texture_format(); | 85 resource_provider_->best_texture_format(); |
| 86 } | 86 } |
| 87 // The updater can access bitmaps while the SoftwareRenderer is using them. | 87 // The updater can access bitmaps while the SoftwareRenderer is using them. |
| 88 capabilities_.allow_partial_texture_updates = true; | 88 capabilities_.allow_partial_texture_updates = true; |
| 89 capabilities_.using_partial_swap = true; | 89 capabilities_.using_partial_swap = true; |
| 90 | 90 |
| 91 capabilities_.using_shared_memory_resources = true; | 91 capabilities_.using_shared_memory_resources = true; |
| 92 | 92 |
| 93 capabilities_.allow_rasterize_on_demand = true; | 93 capabilities_.allow_rasterize_on_demand = true; |
| 94 } | 94 } |
| 95 | 95 |
| 96 SoftwareRenderer::~SoftwareRenderer() {} | 96 SoftwareRenderer::~SoftwareRenderer() {} |
| 97 | 97 |
| 98 const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const { | 98 const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const { |
| 99 return capabilities_; | 99 return capabilities_; |
| 100 } | 100 } |
| 101 | 101 |
| 102 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { | 102 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
| 103 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); | 103 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); |
| 104 root_canvas_ = output_device_->BeginPaint( | 104 root_canvas_ = output_device_->BeginPaint( |
| 105 gfx::ToEnclosingRect(frame->root_damage_rect)); | 105 gfx::ToEnclosingRect(frame->root_damage_rect)); |
| 106 } | 106 } |
| 107 | 107 |
| 108 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { | 108 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
| 109 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); | 109 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); |
| 110 current_framebuffer_lock_ = nullptr; | 110 current_framebuffer_lock_ = nullptr; |
| 111 current_canvas_ = NULL; | 111 current_canvas_ = nullptr; |
| 112 root_canvas_ = NULL; | 112 root_canvas_ = nullptr; |
| 113 | 113 |
| 114 current_frame_data_.reset(new SoftwareFrameData); | 114 current_frame_data_.reset(new SoftwareFrameData); |
| 115 output_device_->EndPaint(current_frame_data_.get()); | 115 output_device_->EndPaint(current_frame_data_.get()); |
| 116 } | 116 } |
| 117 | 117 |
| 118 void SoftwareRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { | 118 void SoftwareRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
| 119 TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers"); | 119 TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers"); |
| 120 CompositorFrame compositor_frame; | 120 CompositorFrame compositor_frame; |
| 121 compositor_frame.metadata = metadata; | 121 compositor_frame.metadata = metadata; |
| 122 compositor_frame.software_frame_data = current_frame_data_.Pass(); | 122 compositor_frame.software_frame_data = current_frame_data_.Pass(); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 342 skia::RefPtr<SkDrawFilter> opacity_filter = | 342 skia::RefPtr<SkDrawFilter> opacity_filter = |
| 343 skia::AdoptRef(new skia::OpacityDrawFilter( | 343 skia::AdoptRef(new skia::OpacityDrawFilter( |
| 344 quad->opacity(), frame->disable_picture_quad_image_filtering)); | 344 quad->opacity(), frame->disable_picture_quad_image_filtering)); |
| 345 DCHECK(!current_canvas_->getDrawFilter()); | 345 DCHECK(!current_canvas_->getDrawFilter()); |
| 346 current_canvas_->setDrawFilter(opacity_filter.get()); | 346 current_canvas_->setDrawFilter(opacity_filter.get()); |
| 347 | 347 |
| 348 TRACE_EVENT0("cc", | 348 TRACE_EVENT0("cc", |
| 349 "SoftwareRenderer::DrawPictureQuad"); | 349 "SoftwareRenderer::DrawPictureQuad"); |
| 350 | 350 |
| 351 quad->picture_pile->RasterDirect( | 351 quad->picture_pile->RasterDirect( |
| 352 current_canvas_, quad->content_rect, quad->contents_scale, NULL); | 352 current_canvas_, quad->content_rect, quad->contents_scale, nullptr); |
| 353 | 353 |
| 354 current_canvas_->setDrawFilter(NULL); | 354 current_canvas_->setDrawFilter(nullptr); |
| 355 } | 355 } |
| 356 | 356 |
| 357 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, | 357 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, |
| 358 const SolidColorDrawQuad* quad) { | 358 const SolidColorDrawQuad* quad) { |
| 359 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( | 359 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( |
| 360 QuadVertexRect(), quad->rect, quad->visible_rect); | 360 QuadVertexRect(), quad->rect, quad->visible_rect); |
| 361 current_paint_.setColor(quad->color); | 361 current_paint_.setColor(quad->color); |
| 362 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); | 362 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); |
| 363 current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect), | 363 current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect), |
| 364 current_paint_); | 364 current_paint_); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 419 quad_rect, | 419 quad_rect, |
| 420 ¤t_paint_); | 420 ¤t_paint_); |
| 421 } | 421 } |
| 422 | 422 |
| 423 if (needs_layer) | 423 if (needs_layer) |
| 424 current_canvas_->restore(); | 424 current_canvas_->restore(); |
| 425 } | 425 } |
| 426 | 426 |
| 427 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, | 427 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, |
| 428 const TileDrawQuad* quad) { | 428 const TileDrawQuad* quad) { |
| 429 // |resource_provider_| can be NULL in resourceless software draws, which | 429 // |resource_provider_| can be nullptr in resourceless software draws, which |
|
danakj
2014/10/10 17:28:45
just use null
| |
| 430 // should never produce tile quads in the first place. | 430 // should never produce tile quads in the first place. |
| 431 DCHECK(resource_provider_); | 431 DCHECK(resource_provider_); |
| 432 DCHECK(IsSoftwareResource(quad->resource_id)); | 432 DCHECK(IsSoftwareResource(quad->resource_id)); |
| 433 | 433 |
| 434 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 434 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
| 435 quad->resource_id); | 435 quad->resource_id); |
| 436 if (!lock.valid()) | 436 if (!lock.valid()) |
| 437 return; | 437 return; |
| 438 DCHECK_EQ(GL_CLAMP_TO_EDGE, lock.wrap_mode()); | 438 DCHECK_EQ(GL_CLAMP_TO_EDGE, lock.wrap_mode()); |
| 439 | 439 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 598 } | 598 } |
| 599 | 599 |
| 600 void SoftwareRenderer::DidChangeVisibility() { | 600 void SoftwareRenderer::DidChangeVisibility() { |
| 601 if (visible()) | 601 if (visible()) |
| 602 EnsureBackbuffer(); | 602 EnsureBackbuffer(); |
| 603 else | 603 else |
| 604 DiscardBackbuffer(); | 604 DiscardBackbuffer(); |
| 605 } | 605 } |
| 606 | 606 |
| 607 } // namespace cc | 607 } // namespace cc |
| OLD | NEW |