| 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 |