| 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/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
| 9 #include "cc/base/math_util.h" | 9 #include "cc/base/math_util.h" |
| 10 #include "cc/output/compositor_frame.h" | 10 #include "cc/output/compositor_frame.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 SkScalarNearlyZero(matrix[SkMatrix::kMSkewX]) && | 45 SkScalarNearlyZero(matrix[SkMatrix::kMSkewX]) && |
| 46 SkScalarNearlyZero(matrix[SkMatrix::kMSkewY]) && | 46 SkScalarNearlyZero(matrix[SkMatrix::kMSkewY]) && |
| 47 SkScalarNearlyZero(matrix[SkMatrix::kMPersp0]) && | 47 SkScalarNearlyZero(matrix[SkMatrix::kMPersp0]) && |
| 48 SkScalarNearlyZero(matrix[SkMatrix::kMPersp1]) && | 48 SkScalarNearlyZero(matrix[SkMatrix::kMPersp1]) && |
| 49 SkScalarNearlyZero(matrix[SkMatrix::kMPersp2] - 1.0f); | 49 SkScalarNearlyZero(matrix[SkMatrix::kMPersp2] - 1.0f); |
| 50 } | 50 } |
| 51 | 51 |
| 52 } // anonymous namespace | 52 } // anonymous namespace |
| 53 | 53 |
| 54 std::unique_ptr<SoftwareRenderer> SoftwareRenderer::Create( | 54 std::unique_ptr<SoftwareRenderer> SoftwareRenderer::Create( |
| 55 RendererClient* client, | 55 DirectRendererClient* client, |
| 56 const RendererSettings* settings, | 56 const RendererSettings* settings, |
| 57 OutputSurface* output_surface, | 57 OutputSurface* output_surface, |
| 58 ResourceProvider* resource_provider) { | 58 ResourceProvider* resource_provider) { |
| 59 return base::WrapUnique(new SoftwareRenderer(client, settings, output_surface, | 59 return base::WrapUnique(new SoftwareRenderer(client, settings, output_surface, |
| 60 resource_provider)); | 60 resource_provider)); |
| 61 } | 61 } |
| 62 | 62 |
| 63 SoftwareRenderer::SoftwareRenderer(RendererClient* client, | 63 SoftwareRenderer::SoftwareRenderer(DirectRendererClient* client, |
| 64 const RendererSettings* settings, | 64 const RendererSettings* settings, |
| 65 OutputSurface* output_surface, | 65 OutputSurface* output_surface, |
| 66 ResourceProvider* resource_provider) | 66 ResourceProvider* resource_provider) |
| 67 : DirectRenderer(client, settings, output_surface, resource_provider), | 67 : DirectRenderer(client, settings, output_surface, resource_provider), |
| 68 is_scissor_enabled_(false), | 68 is_scissor_enabled_(false), |
| 69 is_backbuffer_discarded_(false), | |
| 70 output_device_(output_surface->software_device()), | 69 output_device_(output_surface->software_device()), |
| 71 current_canvas_(nullptr) { | 70 current_canvas_(nullptr) { |
| 72 if (resource_provider_) { | 71 if (resource_provider_) { |
| 73 capabilities_.max_texture_size = resource_provider_->max_texture_size(); | 72 capabilities_.max_texture_size = resource_provider_->max_texture_size(); |
| 74 capabilities_.best_texture_format = | 73 capabilities_.best_texture_format = |
| 75 resource_provider_->best_texture_format(); | 74 resource_provider_->best_texture_format(); |
| 76 } | 75 } |
| 77 // The updater can access bitmaps while the SoftwareRenderer is using them. | 76 // The updater can access bitmaps while the SoftwareRenderer is using them. |
| 78 capabilities_.allow_partial_texture_updates = true; | 77 capabilities_.allow_partial_texture_updates = true; |
| 79 capabilities_.using_partial_swap = true; | 78 capabilities_.using_partial_swap = true; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 // rendering, but the underlying effect we want is to clear any existing | 124 // rendering, but the underlying effect we want is to clear any existing |
| 126 // clipRect on the current SkCanvas. This is done by setting clipRect to | 125 // clipRect on the current SkCanvas. This is done by setting clipRect to |
| 127 // the viewport's dimensions. | 126 // the viewport's dimensions. |
| 128 if (!current_canvas_) | 127 if (!current_canvas_) |
| 129 return; | 128 return; |
| 130 is_scissor_enabled_ = false; | 129 is_scissor_enabled_ = false; |
| 131 SkISize size = current_canvas_->getBaseLayerSize(); | 130 SkISize size = current_canvas_->getBaseLayerSize(); |
| 132 SetClipRect(gfx::Rect(size.width(), size.height())); | 131 SetClipRect(gfx::Rect(size.width(), size.height())); |
| 133 } | 132 } |
| 134 | 133 |
| 135 void SoftwareRenderer::Finish() {} | |
| 136 | |
| 137 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 134 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
| 138 DCHECK(!output_surface_->HasExternalStencilTest()); | 135 DCHECK(!output_surface_->HasExternalStencilTest()); |
| 139 current_framebuffer_lock_ = nullptr; | 136 current_framebuffer_lock_ = nullptr; |
| 140 current_framebuffer_canvas_.reset(); | 137 current_framebuffer_canvas_.reset(); |
| 141 current_canvas_ = root_canvas_; | 138 current_canvas_ = root_canvas_; |
| 142 } | 139 } |
| 143 | 140 |
| 144 bool SoftwareRenderer::BindFramebufferToTexture( | 141 bool SoftwareRenderer::BindFramebufferToTexture( |
| 145 DrawingFrame* frame, | 142 DrawingFrame* frame, |
| 146 const ScopedResource* texture) { | 143 const ScopedResource* texture) { |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 | 598 |
| 602 std::unique_ptr<SkBitmap> bitmap(new SkBitmap); | 599 std::unique_ptr<SkBitmap> bitmap(new SkBitmap); |
| 603 bitmap->setInfo(SkImageInfo::MakeN32Premul(window_copy_rect.width(), | 600 bitmap->setInfo(SkImageInfo::MakeN32Premul(window_copy_rect.width(), |
| 604 window_copy_rect.height())); | 601 window_copy_rect.height())); |
| 605 current_canvas_->readPixels( | 602 current_canvas_->readPixels( |
| 606 bitmap.get(), window_copy_rect.x(), window_copy_rect.y()); | 603 bitmap.get(), window_copy_rect.x(), window_copy_rect.y()); |
| 607 | 604 |
| 608 request->SendBitmapResult(std::move(bitmap)); | 605 request->SendBitmapResult(std::move(bitmap)); |
| 609 } | 606 } |
| 610 | 607 |
| 611 void SoftwareRenderer::DiscardBackbuffer() { | |
| 612 if (is_backbuffer_discarded_) | |
| 613 return; | |
| 614 | |
| 615 output_surface_->DiscardBackbuffer(); | |
| 616 | |
| 617 is_backbuffer_discarded_ = true; | |
| 618 | |
| 619 // Damage tracker needs a full reset every time framebuffer is discarded. | |
| 620 client_->SetFullRootLayerDamage(); | |
| 621 } | |
| 622 | |
| 623 void SoftwareRenderer::EnsureBackbuffer() { | |
| 624 if (!is_backbuffer_discarded_) | |
| 625 return; | |
| 626 | |
| 627 output_surface_->EnsureBackbuffer(); | |
| 628 is_backbuffer_discarded_ = false; | |
| 629 } | |
| 630 | |
| 631 void SoftwareRenderer::DidChangeVisibility() { | |
| 632 if (visible()) | |
| 633 EnsureBackbuffer(); | |
| 634 else | |
| 635 DiscardBackbuffer(); | |
| 636 } | |
| 637 | |
| 638 bool SoftwareRenderer::ShouldApplyBackgroundFilters( | 608 bool SoftwareRenderer::ShouldApplyBackgroundFilters( |
| 639 const RenderPassDrawQuad* quad) const { | 609 const RenderPassDrawQuad* quad) const { |
| 640 if (quad->background_filters.IsEmpty()) | 610 if (quad->background_filters.IsEmpty()) |
| 641 return false; | 611 return false; |
| 642 | 612 |
| 643 // TODO(hendrikw): Look into allowing background filters to see pixels from | 613 // TODO(hendrikw): Look into allowing background filters to see pixels from |
| 644 // other render targets. See crbug.com/314867. | 614 // other render targets. See crbug.com/314867. |
| 645 | 615 |
| 646 return true; | 616 return true; |
| 647 } | 617 } |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 ApplyImageFilter(filter.get(), quad, backdrop_bitmap, nullptr); | 723 ApplyImageFilter(filter.get(), quad, backdrop_bitmap, nullptr); |
| 754 | 724 |
| 755 if (!filter_backdrop_image) | 725 if (!filter_backdrop_image) |
| 756 return nullptr; | 726 return nullptr; |
| 757 | 727 |
| 758 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, | 728 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, |
| 759 &filter_backdrop_transform); | 729 &filter_backdrop_transform); |
| 760 } | 730 } |
| 761 | 731 |
| 762 } // namespace cc | 732 } // namespace cc |
| OLD | NEW |