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 |