OLD | NEW |
1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 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/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 GLC(gl_, gl_->LineWidth(quad->width)); | 617 GLC(gl_, gl_->LineWidth(quad->width)); |
618 | 618 |
619 // The indices for the line are stored in the same array as the triangle | 619 // The indices for the line are stored in the same array as the triangle |
620 // indices. | 620 // indices. |
621 GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); | 621 GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); |
622 } | 622 } |
623 | 623 |
624 static skia::RefPtr<SkImage> ApplyImageFilter( | 624 static skia::RefPtr<SkImage> ApplyImageFilter( |
625 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, | 625 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
626 ResourceProvider* resource_provider, | 626 ResourceProvider* resource_provider, |
627 const gfx::Point& origin, | 627 const gfx::Rect& rect, |
628 const gfx::Vector2dF& scale, | 628 const gfx::Vector2dF& scale, |
629 SkImageFilter* filter, | 629 SkImageFilter* filter, |
630 ScopedResource* source_texture_resource) { | 630 ScopedResource* source_texture_resource) { |
631 if (!filter) | 631 if (!filter) |
632 return skia::RefPtr<SkImage>(); | 632 return skia::RefPtr<SkImage>(); |
633 | 633 |
634 if (!use_gr_context) | 634 if (!use_gr_context) |
635 return skia::RefPtr<SkImage>(); | 635 return skia::RefPtr<SkImage>(); |
636 | 636 |
637 ResourceProvider::ScopedReadLockGL lock(resource_provider, | 637 ResourceProvider::ScopedReadLockGL lock(resource_provider, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 // Create surface to draw into. | 686 // Create surface to draw into. |
687 skia::RefPtr<SkSurface> surface = skia::AdoptRef( | 687 skia::RefPtr<SkSurface> surface = skia::AdoptRef( |
688 SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget())); | 688 SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget())); |
689 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); | 689 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); |
690 | 690 |
691 // Draw the source bitmap through the filter to the canvas. | 691 // Draw the source bitmap through the filter to the canvas. |
692 SkPaint paint; | 692 SkPaint paint; |
693 paint.setImageFilter(filter); | 693 paint.setImageFilter(filter); |
694 canvas->clear(SK_ColorTRANSPARENT); | 694 canvas->clear(SK_ColorTRANSPARENT); |
695 | 695 |
696 canvas->translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y())); | 696 // The origin of the filter is top-left and the origin of the source is |
| 697 // bottom-left, but the orientation is the same, so we must translate the |
| 698 // filter so that it renders at the bottom of the texture to avoid |
| 699 // misregistration. |
| 700 int y_translate = source.height() - rect.height() - rect.origin().y(); |
| 701 canvas->translate(-rect.origin().x(), y_translate); |
697 canvas->scale(scale.x(), scale.y()); | 702 canvas->scale(scale.x(), scale.y()); |
698 canvas->drawSprite(source, 0, 0, &paint); | 703 canvas->drawSprite(source, 0, 0, &paint); |
699 | 704 |
700 skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); | 705 skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); |
701 if (!image || !image->getTexture()) { | 706 if (!image || !image->getTexture()) { |
702 return skia::RefPtr<SkImage>(); | 707 return skia::RefPtr<SkImage>(); |
703 } | 708 } |
704 | 709 |
705 // Flush the GrContext to ensure all buffered GL calls are drawn to the | 710 // Flush the GrContext to ensure all buffered GL calls are drawn to the |
706 // backing store before we access and return it, and have cc begin using the | 711 // backing store before we access and return it, and have cc begin using the |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 } | 856 } |
852 | 857 |
853 skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( | 858 skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( |
854 DrawingFrame* frame, | 859 DrawingFrame* frame, |
855 const RenderPassDrawQuad* quad, | 860 const RenderPassDrawQuad* quad, |
856 ScopedResource* background_texture) { | 861 ScopedResource* background_texture) { |
857 DCHECK(ShouldApplyBackgroundFilters(frame, quad)); | 862 DCHECK(ShouldApplyBackgroundFilters(frame, quad)); |
858 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 863 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
859 quad->background_filters, background_texture->size()); | 864 quad->background_filters, background_texture->size()); |
860 | 865 |
861 skia::RefPtr<SkImage> background_with_filters = | 866 skia::RefPtr<SkImage> background_with_filters = ApplyImageFilter( |
862 ApplyImageFilter(ScopedUseGrContext::Create(this, frame), | 867 ScopedUseGrContext::Create(this, frame), resource_provider_, quad->rect, |
863 resource_provider_, | 868 quad->filters_scale, filter.get(), background_texture); |
864 quad->rect.origin(), | |
865 quad->filters_scale, | |
866 filter.get(), | |
867 background_texture); | |
868 return background_with_filters; | 869 return background_with_filters; |
869 } | 870 } |
870 | 871 |
871 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, | 872 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
872 const RenderPassDrawQuad* quad) { | 873 const RenderPassDrawQuad* quad) { |
873 ScopedResource* contents_texture = | 874 ScopedResource* contents_texture = |
874 render_pass_textures_.get(quad->render_pass_id); | 875 render_pass_textures_.get(quad->render_pass_id); |
875 if (!contents_texture || !contents_texture->id()) | 876 if (!contents_texture || !contents_texture->id()) |
876 return; | 877 return; |
877 | 878 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 SkColorFilter* colorfilter_rawptr = NULL; | 964 SkColorFilter* colorfilter_rawptr = NULL; |
964 filter->asColorFilter(&colorfilter_rawptr); | 965 filter->asColorFilter(&colorfilter_rawptr); |
965 cf = skia::AdoptRef(colorfilter_rawptr); | 966 cf = skia::AdoptRef(colorfilter_rawptr); |
966 } | 967 } |
967 | 968 |
968 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { | 969 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { |
969 // We have a single color matrix as a filter; apply it locally | 970 // We have a single color matrix as a filter; apply it locally |
970 // in the compositor. | 971 // in the compositor. |
971 use_color_matrix = true; | 972 use_color_matrix = true; |
972 } else { | 973 } else { |
973 filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame), | 974 filter_image = ApplyImageFilter( |
974 resource_provider_, | 975 ScopedUseGrContext::Create(this, frame), resource_provider_, |
975 quad->rect.origin(), | 976 quad->rect, quad->filters_scale, filter.get(), contents_texture); |
976 quad->filters_scale, | |
977 filter.get(), | |
978 contents_texture); | |
979 } | 977 } |
980 } | 978 } |
981 } | 979 } |
982 | 980 |
983 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; | 981 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; |
984 unsigned mask_texture_id = 0; | 982 unsigned mask_texture_id = 0; |
985 SamplerType mask_sampler = SamplerTypeNA; | 983 SamplerType mask_sampler = SamplerTypeNA; |
986 if (quad->mask_resource_id) { | 984 if (quad->mask_resource_id) { |
987 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL( | 985 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL( |
988 resource_provider_, quad->mask_resource_id, GL_TEXTURE1, GL_LINEAR)); | 986 resource_provider_, quad->mask_resource_id, GL_TEXTURE1, GL_LINEAR)); |
(...skipping 1715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2704 } else { | 2702 } else { |
2705 SetStencilEnabled(false); | 2703 SetStencilEnabled(false); |
2706 } | 2704 } |
2707 } | 2705 } |
2708 | 2706 |
2709 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, | 2707 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, |
2710 const ScopedResource* texture, | 2708 const ScopedResource* texture, |
2711 const gfx::Rect& target_rect) { | 2709 const gfx::Rect& target_rect) { |
2712 DCHECK(texture->id()); | 2710 DCHECK(texture->id()); |
2713 | 2711 |
| 2712 // Explicitly release lock, otherwise we can crash when try to lock |
| 2713 // same texture again. |
2714 current_framebuffer_lock_ = nullptr; | 2714 current_framebuffer_lock_ = nullptr; |
2715 | 2715 |
2716 SetStencilEnabled(false); | 2716 SetStencilEnabled(false); |
2717 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_)); | 2717 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_)); |
2718 current_framebuffer_lock_ = | 2718 current_framebuffer_lock_ = |
2719 make_scoped_ptr(new ResourceProvider::ScopedWriteLockGL( | 2719 make_scoped_ptr(new ResourceProvider::ScopedWriteLockGL( |
2720 resource_provider_, texture->id())); | 2720 resource_provider_, texture->id())); |
2721 unsigned texture_id = current_framebuffer_lock_->texture_id(); | 2721 unsigned texture_id = current_framebuffer_lock_->texture_id(); |
2722 GLC(gl_, | 2722 GLC(gl_, |
2723 gl_->FramebufferTexture2D( | 2723 gl_->FramebufferTexture2D( |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3305 context_support_->ScheduleOverlayPlane( | 3305 context_support_->ScheduleOverlayPlane( |
3306 overlay.plane_z_order, | 3306 overlay.plane_z_order, |
3307 overlay.transform, | 3307 overlay.transform, |
3308 pending_overlay_resources_.back()->texture_id(), | 3308 pending_overlay_resources_.back()->texture_id(), |
3309 overlay.display_rect, | 3309 overlay.display_rect, |
3310 overlay.uv_rect); | 3310 overlay.uv_rect); |
3311 } | 3311 } |
3312 } | 3312 } |
3313 | 3313 |
3314 } // namespace cc | 3314 } // namespace cc |
OLD | NEW |