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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 IsScalarNearlyInteger(matrix[SkMatrix::kMTransY]) && | 44 IsScalarNearlyInteger(matrix[SkMatrix::kMTransY]) && |
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 SoftwareRenderer::SoftwareRenderer(RendererClient* client, | 54 SoftwareRenderer::SoftwareRenderer(const RendererSettings* settings, |
55 const RendererSettings* settings, | |
56 OutputSurface* output_surface, | 55 OutputSurface* output_surface, |
57 ResourceProvider* resource_provider) | 56 ResourceProvider* resource_provider) |
58 : DirectRenderer(client, settings, output_surface, resource_provider), | 57 : DirectRenderer(settings, output_surface, resource_provider), |
59 is_scissor_enabled_(false), | 58 output_device_(output_surface->software_device()) { |
60 is_backbuffer_discarded_(false), | |
61 output_device_(output_surface->software_device()), | |
62 current_canvas_(nullptr) { | |
63 if (resource_provider_) { | 59 if (resource_provider_) { |
64 capabilities_.max_texture_size = resource_provider_->max_texture_size(); | 60 capabilities_.max_texture_size = resource_provider_->max_texture_size(); |
65 capabilities_.best_texture_format = | 61 capabilities_.best_texture_format = |
66 resource_provider_->best_texture_format(); | 62 resource_provider_->best_texture_format(); |
67 } | 63 } |
68 // The updater can access bitmaps while the SoftwareRenderer is using them. | 64 // The updater can access bitmaps while the SoftwareRenderer is using them. |
69 capabilities_.allow_partial_texture_updates = true; | 65 capabilities_.allow_partial_texture_updates = true; |
70 capabilities_.using_partial_swap = true; | 66 capabilities_.using_partial_swap = true; |
71 | 67 |
72 capabilities_.using_shared_memory_resources = true; | 68 capabilities_.using_shared_memory_resources = true; |
73 | 69 |
74 capabilities_.allow_rasterize_on_demand = true; | 70 capabilities_.allow_rasterize_on_demand = true; |
75 } | 71 } |
76 | 72 |
77 SoftwareRenderer::~SoftwareRenderer() {} | 73 SoftwareRenderer::~SoftwareRenderer() {} |
78 | 74 |
79 const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const { | 75 const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const { |
80 return capabilities_; | 76 return capabilities_; |
81 } | 77 } |
82 | 78 |
83 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { | 79 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
84 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); | 80 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); |
85 root_canvas_ = output_device_->BeginPaint(frame->root_damage_rect); | 81 root_canvas_ = output_device_->BeginPaint(frame->root_damage_rect); |
86 } | 82 } |
87 | 83 |
88 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { | 84 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
89 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); | 85 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); |
90 current_framebuffer_lock_ = nullptr; | 86 current_framebuffer_lock_ = nullptr; |
91 current_framebuffer_canvas_.reset(); | 87 current_framebuffer_canvas_.reset(); |
92 current_canvas_ = NULL; | 88 current_canvas_ = nullptr; |
93 root_canvas_ = NULL; | 89 root_canvas_ = nullptr; |
94 | 90 |
95 output_device_->EndPaint(); | 91 output_device_->EndPaint(); |
96 } | 92 } |
97 | 93 |
98 void SoftwareRenderer::SwapBuffers(CompositorFrameMetadata metadata) { | 94 void SoftwareRenderer::SwapBuffers(CompositorFrameMetadata metadata) { |
| 95 DCHECK(visible()); |
99 TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers"); | 96 TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers"); |
100 CompositorFrame compositor_frame; | 97 CompositorFrame compositor_frame; |
101 compositor_frame.metadata = std::move(metadata); | 98 compositor_frame.metadata = std::move(metadata); |
102 output_surface_->SwapBuffers(std::move(compositor_frame)); | 99 output_surface_->SwapBuffers(std::move(compositor_frame)); |
103 } | 100 } |
104 | 101 |
105 bool SoftwareRenderer::FlippedFramebuffer(const DrawingFrame* frame) const { | 102 bool SoftwareRenderer::FlippedFramebuffer(const DrawingFrame* frame) const { |
106 return false; | 103 return false; |
107 } | 104 } |
108 | 105 |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 | 587 |
591 std::unique_ptr<SkBitmap> bitmap(new SkBitmap); | 588 std::unique_ptr<SkBitmap> bitmap(new SkBitmap); |
592 bitmap->setInfo(SkImageInfo::MakeN32Premul(window_copy_rect.width(), | 589 bitmap->setInfo(SkImageInfo::MakeN32Premul(window_copy_rect.width(), |
593 window_copy_rect.height())); | 590 window_copy_rect.height())); |
594 current_canvas_->readPixels( | 591 current_canvas_->readPixels( |
595 bitmap.get(), window_copy_rect.x(), window_copy_rect.y()); | 592 bitmap.get(), window_copy_rect.x(), window_copy_rect.y()); |
596 | 593 |
597 request->SendBitmapResult(std::move(bitmap)); | 594 request->SendBitmapResult(std::move(bitmap)); |
598 } | 595 } |
599 | 596 |
600 void SoftwareRenderer::DiscardBackbuffer() { | |
601 if (is_backbuffer_discarded_) | |
602 return; | |
603 | |
604 output_surface_->DiscardBackbuffer(); | |
605 | |
606 is_backbuffer_discarded_ = true; | |
607 | |
608 // Damage tracker needs a full reset every time framebuffer is discarded. | |
609 client_->SetFullRootLayerDamage(); | |
610 } | |
611 | |
612 void SoftwareRenderer::EnsureBackbuffer() { | |
613 if (!is_backbuffer_discarded_) | |
614 return; | |
615 | |
616 output_surface_->EnsureBackbuffer(); | |
617 is_backbuffer_discarded_ = false; | |
618 } | |
619 | |
620 void SoftwareRenderer::DidChangeVisibility() { | 597 void SoftwareRenderer::DidChangeVisibility() { |
621 if (visible()) | 598 if (visible()) |
622 EnsureBackbuffer(); | 599 output_surface_->EnsureBackbuffer(); |
623 else | 600 else |
624 DiscardBackbuffer(); | 601 output_surface_->DiscardBackbuffer(); |
625 } | 602 } |
626 | 603 |
627 bool SoftwareRenderer::ShouldApplyBackgroundFilters( | 604 bool SoftwareRenderer::ShouldApplyBackgroundFilters( |
628 const RenderPassDrawQuad* quad) const { | 605 const RenderPassDrawQuad* quad) const { |
629 if (quad->background_filters.IsEmpty()) | 606 if (quad->background_filters.IsEmpty()) |
630 return false; | 607 return false; |
631 | 608 |
632 // TODO(hendrikw): Look into allowing background filters to see pixels from | 609 // TODO(hendrikw): Look into allowing background filters to see pixels from |
633 // other render targets. See crbug.com/314867. | 610 // other render targets. See crbug.com/314867. |
634 | 611 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 ApplyImageFilter(filter.get(), quad, backdrop_bitmap, nullptr); | 719 ApplyImageFilter(filter.get(), quad, backdrop_bitmap, nullptr); |
743 | 720 |
744 if (!filter_backdrop_image) | 721 if (!filter_backdrop_image) |
745 return nullptr; | 722 return nullptr; |
746 | 723 |
747 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, | 724 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, |
748 &filter_backdrop_transform); | 725 &filter_backdrop_transform); |
749 } | 726 } |
750 | 727 |
751 } // namespace cc | 728 } // namespace cc |
OLD | NEW |