Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(550)

Side by Side Diff: cc/output/gl_renderer.cc

Issue 658483003: Implement mix-blend-mode in GL renderer using shaders. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: adjusting the pixel comparator for linux and mac Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 case GL_TEXTURE_RECTANGLE_ARB: 117 case GL_TEXTURE_RECTANGLE_ARB:
118 return SamplerType2DRect; 118 return SamplerType2DRect;
119 case GL_TEXTURE_EXTERNAL_OES: 119 case GL_TEXTURE_EXTERNAL_OES:
120 return SamplerTypeExternalOES; 120 return SamplerTypeExternalOES;
121 default: 121 default:
122 NOTREACHED(); 122 NOTREACHED();
123 return SamplerType2D; 123 return SamplerType2D;
124 } 124 }
125 } 125 }
126 126
127 BlendMode BlendModeFromSkXfermode(SkXfermode::Mode mode) {
128 switch (mode) {
129 case SkXfermode::kSrcOver_Mode:
130 return BlendModeNormal;
131 case SkXfermode::kOverlay_Mode:
132 return BlendModeOverlay;
133 case SkXfermode::kDarken_Mode:
134 return BlendModeDarken;
135 case SkXfermode::kLighten_Mode:
136 return BlendModeLighten;
137 case SkXfermode::kColorDodge_Mode:
138 return BlendModeColorDodge;
139 case SkXfermode::kColorBurn_Mode:
140 return BlendModeColorBurn;
141 case SkXfermode::kHardLight_Mode:
142 return BlendModeHardLight;
143 case SkXfermode::kSoftLight_Mode:
144 return BlendModeSoftLight;
145 case SkXfermode::kDifference_Mode:
146 return BlendModeDifference;
147 case SkXfermode::kExclusion_Mode:
148 return BlendModeExclusion;
149 case SkXfermode::kMultiply_Mode:
150 return BlendModeMultiply;
151 case SkXfermode::kHue_Mode:
152 return BlendModeHue;
153 case SkXfermode::kSaturation_Mode:
154 return BlendModeSaturation;
155 case SkXfermode::kColor_Mode:
156 return BlendModeColor;
157 case SkXfermode::kLuminosity_Mode:
158 return BlendModeLuminosity;
159 default:
160 NOTREACHED();
161 return BlendModeNormal;
162 }
163 }
164
127 // Smallest unit that impact anti-aliasing output. We use this to 165 // Smallest unit that impact anti-aliasing output. We use this to
128 // determine when anti-aliasing is unnecessary. 166 // determine when anti-aliasing is unnecessary.
129 const float kAntiAliasingEpsilon = 1.0f / 1024.0f; 167 const float kAntiAliasingEpsilon = 1.0f / 1024.0f;
130 168
131 // Block or crash if the number of pending sync queries reach this high as 169 // Block or crash if the number of pending sync queries reach this high as
132 // something is seriously wrong on the service side if this happens. 170 // something is seriously wrong on the service side if this happens.
133 const size_t kMaxPendingSyncQueries = 16; 171 const size_t kMaxPendingSyncQueries = 16;
134 172
135 } // anonymous namespace 173 } // anonymous namespace
136 174
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { 757 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) {
720 if (blend_mode == SkXfermode::kSrcOver_Mode) 758 if (blend_mode == SkXfermode::kSrcOver_Mode)
721 return; 759 return;
722 760
723 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); 761 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
724 762
725 if (blend_mode == SkXfermode::kLighten_Mode) 763 if (blend_mode == SkXfermode::kLighten_Mode)
726 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); 764 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
727 } 765 }
728 766
729 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop(
730 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
731 ResourceProvider* resource_provider,
732 skia::RefPtr<SkImage> source_bitmap_with_filters,
733 ScopedResource* source_texture_resource,
734 ScopedResource* background_texture_resource,
735 SkXfermode::Mode blend_mode) {
736 if (!use_gr_context)
737 return source_bitmap_with_filters;
738
739 DCHECK(background_texture_resource);
740 DCHECK(source_texture_resource);
741
742 gfx::Size source_size = source_texture_resource->size();
743 gfx::Size background_size = background_texture_resource->size();
744
745 DCHECK_LE(background_size.width(), source_size.width());
746 DCHECK_LE(background_size.height(), source_size.height());
747
748 int source_texture_with_filters_id;
749 scoped_ptr<ResourceProvider::ScopedReadLockGL> lock;
750 if (source_bitmap_with_filters) {
751 DCHECK_EQ(source_size.width(), source_bitmap_with_filters->width());
752 DCHECK_EQ(source_size.height(), source_bitmap_with_filters->height());
753 GrTexture* texture =
754 reinterpret_cast<GrTexture*>(source_bitmap_with_filters->getTexture());
755 source_texture_with_filters_id = texture->getTextureHandle();
756 } else {
757 lock.reset(new ResourceProvider::ScopedReadLockGL(
758 resource_provider, source_texture_resource->id()));
759 source_texture_with_filters_id = lock->texture_id();
760 }
761
762 ResourceProvider::ScopedReadLockGL lock_background(
763 resource_provider, background_texture_resource->id());
764
765 // Wrap the source texture in a Ganesh platform texture.
766 GrBackendTextureDesc backend_texture_description;
767 backend_texture_description.fConfig = kSkia8888_GrPixelConfig;
768 backend_texture_description.fOrigin = kBottomLeft_GrSurfaceOrigin;
769
770 backend_texture_description.fWidth = source_size.width();
771 backend_texture_description.fHeight = source_size.height();
772 backend_texture_description.fTextureHandle = source_texture_with_filters_id;
773 skia::RefPtr<GrTexture> source_texture =
774 skia::AdoptRef(use_gr_context->context()->wrapBackendTexture(
775 backend_texture_description));
776 if (!source_texture) {
777 TRACE_EVENT_INSTANT0(
778 "cc",
779 "ApplyBlendModeWithBackdrop wrap source texture failed",
780 TRACE_EVENT_SCOPE_THREAD);
781 return skia::RefPtr<SkImage>();
782 }
783
784 backend_texture_description.fWidth = background_size.width();
785 backend_texture_description.fHeight = background_size.height();
786 backend_texture_description.fTextureHandle = lock_background.texture_id();
787 skia::RefPtr<GrTexture> background_texture =
788 skia::AdoptRef(use_gr_context->context()->wrapBackendTexture(
789 backend_texture_description));
790 if (!background_texture) {
791 TRACE_EVENT_INSTANT0(
792 "cc",
793 "ApplyBlendModeWithBackdrop wrap background texture failed",
794 TRACE_EVENT_SCOPE_THREAD);
795 return skia::RefPtr<SkImage>();
796 }
797
798 SkImageInfo source_info =
799 SkImageInfo::MakeN32Premul(source_size.width(), source_size.height());
800 // Place the platform texture inside an SkBitmap.
801 SkBitmap source;
802 source.setInfo(source_info);
803 skia::RefPtr<SkGrPixelRef> source_pixel_ref =
804 skia::AdoptRef(new SkGrPixelRef(source_info, source_texture.get()));
805 source.setPixelRef(source_pixel_ref.get());
806
807 SkImageInfo background_info = SkImageInfo::MakeN32Premul(
808 background_size.width(), background_size.height());
809
810 SkBitmap background;
811 background.setInfo(background_info);
812 skia::RefPtr<SkGrPixelRef> background_pixel_ref =
813 skia::AdoptRef(new SkGrPixelRef(
814 background_info, background_texture.get()));
815 background.setPixelRef(background_pixel_ref.get());
816
817 // Create a scratch texture for backing store.
818 GrTextureDesc desc;
819 desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit;
820 desc.fSampleCnt = 0;
821 desc.fWidth = source.width();
822 desc.fHeight = source.height();
823 desc.fConfig = kSkia8888_GrPixelConfig;
824 desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
825 skia::RefPtr<GrTexture> backing_store =
826 skia::AdoptRef(use_gr_context->context()->refScratchTexture(
827 desc, GrContext::kExact_ScratchTexMatch));
828 if (!backing_store) {
829 TRACE_EVENT_INSTANT0(
830 "cc",
831 "ApplyBlendModeWithBackdrop scratch texture allocation failed",
832 TRACE_EVENT_SCOPE_THREAD);
833 return source_bitmap_with_filters;
834 }
835
836 // Create a device and canvas using that backing store.
837 skia::RefPtr<SkSurface> surface = skia::AdoptRef(
838 SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget()));
839 if (!surface)
840 return skia::RefPtr<SkImage>();
841 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas());
842
843 // Draw the source bitmap through the filter to the canvas.
844 canvas->clear(SK_ColorTRANSPARENT);
845 canvas->drawSprite(background, 0, 0);
846 SkPaint paint;
847 paint.setXfermodeMode(blend_mode);
848 canvas->drawSprite(source, 0, 0, &paint);
849
850 skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot());
851 if (!image || !image->getTexture()) {
852 return skia::RefPtr<SkImage>();
853 }
854
855 // Flush the GrContext to ensure all buffered GL calls are drawn to the
856 // backing store before we access and return it, and have cc begin using the
857 // GL context again.
858 canvas->flush();
859
860 return image;
861 }
862
863 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame, 767 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame,
864 const RenderPassDrawQuad* quad) { 768 const RenderPassDrawQuad* quad) {
865 if (quad->background_filters.IsEmpty()) 769 if (quad->background_filters.IsEmpty())
866 return false; 770 return false;
867 771
868 // TODO(danakj): We only allow background filters on an opaque render surface 772 // TODO(danakj): We only allow background filters on an opaque render surface
869 // because other surfaces may contain translucent pixels, and the contents 773 // because other surfaces may contain translucent pixels, and the contents
870 // behind those translucent pixels wouldn't have the filter applied. 774 // behind those translucent pixels wouldn't have the filter applied.
871 if (frame->current_render_pass->has_transparent_background) 775 if (frame->current_render_pass->has_transparent_background)
872 return false; 776 return false;
873 777
874 // TODO(ajuma): Add support for reference filters once 778 // TODO(ajuma): Add support for reference filters once
875 // FilterOperations::GetOutsets supports reference filters. 779 // FilterOperations::GetOutsets supports reference filters.
876 if (quad->background_filters.HasReferenceFilter()) 780 if (quad->background_filters.HasReferenceFilter())
877 return false; 781 return false;
878 return true; 782 return true;
879 } 783 }
880 784
881 gfx::Rect GLRenderer::GetBackdropBoundingBoxForRenderPassQuad( 785 gfx::Rect GLRenderer::GetBackdropBoundingBoxForRenderPassQuad(
882 DrawingFrame* frame, 786 DrawingFrame* frame,
883 const RenderPassDrawQuad* quad, 787 const RenderPassDrawQuad* quad,
884 const gfx::Transform& contents_device_transform) { 788 const gfx::Transform& contents_device_transform,
789 bool use_aa) {
885 gfx::Rect backdrop_rect = gfx::ToEnclosingRect(MathUtil::MapClippedRect( 790 gfx::Rect backdrop_rect = gfx::ToEnclosingRect(MathUtil::MapClippedRect(
886 contents_device_transform, SharedGeometryQuad().BoundingBox())); 791 contents_device_transform, SharedGeometryQuad().BoundingBox()));
887 792
888 if (ShouldApplyBackgroundFilters(frame, quad)) { 793 if (ShouldApplyBackgroundFilters(frame, quad)) {
889 int top, right, bottom, left; 794 int top, right, bottom, left;
890 quad->background_filters.GetOutsets(&top, &right, &bottom, &left); 795 quad->background_filters.GetOutsets(&top, &right, &bottom, &left);
891 backdrop_rect.Inset(-left, -top, -right, -bottom); 796 backdrop_rect.Inset(-left, -top, -right, -bottom);
892 } 797 }
893 798
799 if (!backdrop_rect.IsEmpty() && use_aa) {
800 const int kOutsetForAntialiasing = 1;
801 backdrop_rect.Inset(-kOutsetForAntialiasing, -kOutsetForAntialiasing);
802 }
803
894 backdrop_rect.Intersect( 804 backdrop_rect.Intersect(
895 MoveFromDrawToWindowSpace(frame->current_render_pass->output_rect)); 805 MoveFromDrawToWindowSpace(frame->current_render_pass->output_rect));
896 return backdrop_rect; 806 return backdrop_rect;
897 } 807 }
898 808
899 scoped_ptr<ScopedResource> GLRenderer::GetBackdropTexture( 809 scoped_ptr<ScopedResource> GLRenderer::GetBackdropTexture(
900 const gfx::Rect& bounding_rect) { 810 const gfx::Rect& bounding_rect) {
901 scoped_ptr<ScopedResource> device_background_texture = 811 scoped_ptr<ScopedResource> device_background_texture =
902 ScopedResource::Create(resource_provider_); 812 ScopedResource::Create(resource_provider_);
903 // CopyTexImage2D fails when called on a texture having immutable storage. 813 // CopyTexImage2D fails when called on a texture having immutable storage.
(...skipping 24 matching lines...) Expand all
928 filter.get(), 838 filter.get(),
929 background_texture); 839 background_texture);
930 return background_with_filters; 840 return background_with_filters;
931 } 841 }
932 842
933 scoped_ptr<ScopedResource> 843 scoped_ptr<ScopedResource>
934 GLRenderer::ApplyInverseTransformForBackgroundFilters( 844 GLRenderer::ApplyInverseTransformForBackgroundFilters(
935 DrawingFrame* frame, 845 DrawingFrame* frame,
936 const RenderPassDrawQuad* quad, 846 const RenderPassDrawQuad* quad,
937 const gfx::Transform& contents_device_transform_inverse, 847 const gfx::Transform& contents_device_transform_inverse,
938 ScopedResource* device_background_texture,
939 skia::RefPtr<SkImage> filtered_device_background, 848 skia::RefPtr<SkImage> filtered_device_background,
940 const gfx::Rect& backdrop_bounding_rect) { 849 const gfx::Rect& backdrop_bounding_rect) {
941 // This method draws a background filter, which applies a filter to any pixels 850 // This method draws a background filter, which applies a filter to any pixels
942 // behind the quad and seen through its background. The algorithm works as 851 // behind the quad and seen through its background. The algorithm works as
943 // follows: 852 // follows:
944 // 1. Read the pixels in the bounding box into a buffer. 853 // 1. Read the pixels in the bounding box into a buffer.
945 // Moved to GLRenderer::GetBackdropBoundingBoxForRenderPassQuad(). 854 // Moved to GLRenderer::GetBackdropBoundingBoxForRenderPassQuad().
946 // 2. Read the pixels in the bounding box into a buffer R. 855 // 2. Read the pixels in the bounding box into a buffer R.
947 // Moved to GLRenderer::GetBackdropTexture(). 856 // Moved to GLRenderer::GetBackdropTexture().
948 // 3. Apply the background filter to R, so that it is applied in the pixels' 857 // 3. Apply the background filter to R, so that it is applied in the pixels'
949 // coordinate space. Moved to GLRenderer::ApplyBackgroundFilters(). 858 // coordinate space. Moved to GLRenderer::ApplyBackgroundFilters().
950 // 4. Apply the quad's inverse transform to map the pixels in R into the 859 // 4. Apply the quad's inverse transform to map the pixels in R into the
951 // quad's content space. This implicitly clips R by the content bounds of the 860 // quad's content space. This implicitly clips R by the content bounds of the
952 // quad since the destination texture has bounds matching the quad's content. 861 // quad since the destination texture has bounds matching the quad's content.
953 // 5. Draw the background texture for the contents using the same transform as 862 // 5. Draw the background texture for the contents using the same transform as
954 // used to draw the contents itself. This is done without blending to replace 863 // used to draw the contents itself. This is done without blending to replace
955 // the current background pixels with the new filtered background. 864 // the current background pixels with the new filtered background.
956 // 6. Draw the contents of the quad over drop of the new background with 865 // 6. Draw the contents of the quad over drop of the new background with
957 // blending, as per usual. The filtered background pixels will show through 866 // blending, as per usual. The filtered background pixels will show through
958 // any non-opaque pixels in this draws. 867 // any non-opaque pixels in this draws.
959 // 868 //
960 // Pixel copies in this algorithm occur at steps 2, 3, 4, and 5. 869 // Pixel copies in this algorithm occur at steps 2, 3, 4, and 5.
961 870
962 // TODO(danakj): When this algorithm changes, update 871 // TODO(danakj): When this algorithm changes, update
963 // LayerTreeHost::PrioritizeTextures() accordingly. 872 // LayerTreeHost::PrioritizeTextures() accordingly.
964 873
965 DCHECK(device_background_texture); 874 DCHECK(filtered_device_background);
966 875
967 int filtered_device_background_texture_id = 0; 876 GrTexture* texture = filtered_device_background->getTexture();
968 scoped_ptr<ResourceProvider::ScopedReadLockGL> lock;
969 if (filtered_device_background) {
970 GrTexture* texture = filtered_device_background->getTexture();
971 filtered_device_background_texture_id = texture->getTextureHandle();
972 } else {
973 lock.reset(new ResourceProvider::ScopedReadLockGL(
974 resource_provider_, device_background_texture->id()));
975 filtered_device_background_texture_id = lock->texture_id();
976 }
977 877
978 scoped_ptr<ScopedResource> background_texture = 878 scoped_ptr<ScopedResource> background_texture =
979 ScopedResource::Create(resource_provider_); 879 ScopedResource::Create(resource_provider_);
980 background_texture->Allocate( 880 background_texture->Allocate(
981 quad->rect.size(), 881 quad->rect.size(),
982 ResourceProvider::TextureHintImmutableFramebuffer, 882 ResourceProvider::TextureHintImmutableFramebuffer,
983 RGBA_8888); 883 RGBA_8888);
984 884
985 const RenderPass* target_render_pass = frame->current_render_pass; 885 const RenderPass* target_render_pass = frame->current_render_pass;
986 bool using_background_texture = 886 bool using_background_texture =
(...skipping 13 matching lines...) Expand all
1000 gl_->Clear(GL_COLOR_BUFFER_BIT); 900 gl_->Clear(GL_COLOR_BUFFER_BIT);
1001 #endif 901 #endif
1002 902
1003 // The background_texture is oriented the same as the frame buffer. 903 // The background_texture is oriented the same as the frame buffer.
1004 // The transform we are copying with has a vertical flip, as well as 904 // The transform we are copying with has a vertical flip, as well as
1005 // the |device_to_framebuffer_transform|, which cancel each other out. So do 905 // the |device_to_framebuffer_transform|, which cancel each other out. So do
1006 // not flip the contents in the shader to maintain orientation. 906 // not flip the contents in the shader to maintain orientation.
1007 bool flip_vertically = false; 907 bool flip_vertically = false;
1008 908
1009 CopyTextureToFramebuffer(frame, 909 CopyTextureToFramebuffer(frame,
1010 filtered_device_background_texture_id, 910 texture->getTextureHandle(),
1011 backdrop_bounding_rect, 911 backdrop_bounding_rect,
1012 device_to_framebuffer_transform, 912 device_to_framebuffer_transform,
1013 flip_vertically); 913 flip_vertically);
1014 } 914 }
1015 915
1016 UseRenderPass(frame, target_render_pass); 916 UseRenderPass(frame, target_render_pass);
1017 917
1018 if (!using_background_texture) 918 if (!using_background_texture)
1019 return nullptr; 919 return nullptr;
1020 return background_texture.Pass(); 920 return background_texture.Pass();
1021 } 921 }
1022 922
1023 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, 923 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
1024 const RenderPassDrawQuad* quad) { 924 const RenderPassDrawQuad* quad) {
1025 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; 925 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode;
1026 SetBlendEnabled(quad->ShouldDrawWithBlending() || 926 SetBlendEnabled(
1027 (!IsDefaultBlendMode(blend_mode) && 927 CanApplyBlendModeUsingBlendFunc(blend_mode) &&
1028 CanApplyBlendModeUsingBlendFunc(blend_mode))); 928 (quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode)));
1029 929
1030 ScopedResource* contents_texture = 930 ScopedResource* contents_texture =
1031 render_pass_textures_.get(quad->render_pass_id); 931 render_pass_textures_.get(quad->render_pass_id);
1032 if (!contents_texture || !contents_texture->id()) 932 if (!contents_texture || !contents_texture->id())
1033 return; 933 return;
1034 934
1035 gfx::Transform quad_rect_matrix; 935 gfx::Transform quad_rect_matrix;
1036 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); 936 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect);
1037 gfx::Transform contents_device_transform = 937 gfx::Transform contents_device_transform =
1038 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; 938 frame->window_matrix * frame->projection_matrix * quad_rect_matrix;
1039 contents_device_transform.FlattenTo2d(); 939 contents_device_transform.FlattenTo2d();
1040 940
1041 // Can only draw surface if device matrix is invertible. 941 // Can only draw surface if device matrix is invertible.
1042 gfx::Transform contents_device_transform_inverse( 942 gfx::Transform contents_device_transform_inverse(
1043 gfx::Transform::kSkipInitialization); 943 gfx::Transform::kSkipInitialization);
1044 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) 944 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse))
1045 return; 945 return;
1046 946
947 bool clipped = false;
948 gfx::QuadF device_quad = MathUtil::MapQuad(
949 contents_device_transform, SharedGeometryQuad(), &clipped);
950 // Use anti-aliasing programs only when necessary.
951 bool use_aa =
952 !clipped &&
953 (settings_->force_antialiasing || !device_quad.IsRectilinear() ||
954 !gfx::IsNearestRectWithinDistance(device_quad.BoundingBox(),
955 kAntiAliasingEpsilon));
956
1047 bool need_background_texture = !CanApplyBlendModeUsingBlendFunc(blend_mode) || 957 bool need_background_texture = !CanApplyBlendModeUsingBlendFunc(blend_mode) ||
1048 ShouldApplyBackgroundFilters(frame, quad); 958 ShouldApplyBackgroundFilters(frame, quad);
1049 959
1050 scoped_ptr<ScopedResource> background_texture; 960 scoped_ptr<ScopedResource> background_texture;
961 skia::RefPtr<SkImage> background_image;
962 gfx::Rect background_rect;
1051 if (need_background_texture) { 963 if (need_background_texture) {
964 // Compute a bounding box around the pixels that will be visible through
965 // the quad.
966 background_rect = GetBackdropBoundingBoxForRenderPassQuad(
967 frame, quad, contents_device_transform, use_aa);
968 }
969
970 if (!background_rect.IsEmpty()) {
1052 // The pixels from the filtered background should completely replace the 971 // The pixels from the filtered background should completely replace the
1053 // current pixel values. 972 // current pixel values.
1054 bool disable_blending = blend_enabled(); 973 bool disable_blending = blend_enabled();
1055 if (disable_blending) 974 if (disable_blending)
1056 SetBlendEnabled(false); 975 SetBlendEnabled(false);
1057 976
1058 // Compute a bounding box around the pixels that will be visible through
1059 // the quad.
1060 gfx::Rect backdrop_rect = GetBackdropBoundingBoxForRenderPassQuad(
1061 frame, quad, contents_device_transform);
1062
1063 // Read the pixels in the bounding box into a buffer R. 977 // Read the pixels in the bounding box into a buffer R.
1064 scoped_ptr<ScopedResource> scoped_background_texture = 978 scoped_ptr<ScopedResource> scoped_background_texture =
1065 GetBackdropTexture(backdrop_rect); 979 GetBackdropTexture(background_rect);
1066 980
1067 skia::RefPtr<SkImage> background_with_filters; 981 skia::RefPtr<SkImage> background_with_filters;
1068 if (ShouldApplyBackgroundFilters(frame, quad)) { 982 if (ShouldApplyBackgroundFilters(frame, quad) &&
983 scoped_background_texture) {
1069 // Apply the background filters to R, so that it is applied in the pixels' 984 // Apply the background filters to R, so that it is applied in the pixels'
1070 // coordinate space. 985 // coordinate space.
1071 background_with_filters = 986 background_with_filters =
1072 ApplyBackgroundFilters(frame, quad, scoped_background_texture.get()); 987 ApplyBackgroundFilters(frame, quad, scoped_background_texture.get());
1073 } 988 }
1074 // Apply the quad's inverse transform to map the pixels in R into the 989
1075 // quad's content space. This implicitly clips R by the content bounds of 990 if (CanApplyBlendModeUsingBlendFunc(blend_mode) &&
1076 // the quad since the destination texture has bounds matching the quad's 991 background_with_filters) {
1077 // content. 992 // The background with filters will be copied to the frame buffer.
1078 background_texture = ApplyInverseTransformForBackgroundFilters( 993 // Apply the quad's inverse transform to map the pixels in R into the
1079 frame, 994 // quad's content space. This implicitly clips R by the content bounds of
1080 quad, 995 // the quad since the destination texture has bounds matching the quad's
1081 contents_device_transform_inverse, 996 // content.
1082 scoped_background_texture.get(), 997 background_texture = ApplyInverseTransformForBackgroundFilters(
1083 background_with_filters, 998 frame,
1084 backdrop_rect); 999 quad,
1000 contents_device_transform_inverse,
1001 background_with_filters,
1002 background_rect);
1003 } else if (!CanApplyBlendModeUsingBlendFunc(blend_mode)) {
1004 if (background_with_filters) {
1005 // The background with filters will be used as backdrop for blending.
1006 background_image = background_with_filters;
1007 } else {
1008 background_texture = scoped_background_texture.Pass();
1009 }
1010 }
1085 1011
1086 if (disable_blending) 1012 if (disable_blending)
1087 SetBlendEnabled(true); 1013 SetBlendEnabled(true);
1088 } 1014 }
1089 1015
1090 // TODO(senorblanco): Cache this value so that we don't have to do it for both 1016 // TODO(senorblanco): Cache this value so that we don't have to do it for both
1091 // the surface and its replica. Apply filters to the contents texture. 1017 // the surface and its replica. Apply filters to the contents texture.
1092 skia::RefPtr<SkImage> filter_image; 1018 skia::RefPtr<SkImage> filter_image;
1093 SkScalar color_matrix[20]; 1019 SkScalar color_matrix[20];
1094 bool use_color_matrix = false; 1020 bool use_color_matrix = false;
(...skipping 17 matching lines...) Expand all
1112 filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame), 1038 filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame),
1113 resource_provider_, 1039 resource_provider_,
1114 quad->rect.origin(), 1040 quad->rect.origin(),
1115 quad->filters_scale, 1041 quad->filters_scale,
1116 filter.get(), 1042 filter.get(),
1117 contents_texture); 1043 contents_texture);
1118 } 1044 }
1119 } 1045 }
1120 } 1046 }
1121 1047
1122 if (background_texture) { 1048 if (background_texture && ShouldApplyBackgroundFilters(frame, quad)) {
1123 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) { 1049 // Draw the background texture if it has some filters applied.
1124 // Draw the background texture if it has some filters applied. 1050 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode));
1125 DCHECK(ShouldApplyBackgroundFilters(frame, quad)); 1051 DCHECK(background_texture->size() == quad->rect.size());
1126 DCHECK(background_texture->size() == quad->rect.size()); 1052 ResourceProvider::ScopedReadLockGL lock(resource_provider_,
1127 ResourceProvider::ScopedReadLockGL lock(resource_provider_, 1053 background_texture->id());
1128 background_texture->id());
1129 1054
1130 // The background_texture is oriented the same as the frame buffer. The 1055 // The background_texture is oriented the same as the frame buffer. The
1131 // transform we are copying with has a vertical flip, so flip the contents 1056 // transform we are copying with has a vertical flip, so flip the contents
1132 // in the shader to maintain orientation 1057 // in the shader to maintain orientation
1133 bool flip_vertically = true; 1058 bool flip_vertically = true;
1134 1059
1135 CopyTextureToFramebuffer(frame, 1060 CopyTextureToFramebuffer(frame,
1136 lock.texture_id(), 1061 lock.texture_id(),
1137 quad->rect, 1062 quad->rect,
1138 quad->quadTransform(), 1063 quad->quadTransform(),
1139 flip_vertically); 1064 flip_vertically);
1140 } else {
1141 // If blending is applied using shaders, the background texture with
1142 // filters will be used as backdrop for blending operation, so we don't
1143 // need to copy it to the frame buffer.
1144 filter_image =
1145 ApplyBlendModeWithBackdrop(ScopedUseGrContext::Create(this, frame),
1146 resource_provider_,
1147 filter_image,
1148 contents_texture,
1149 background_texture.get(),
1150 quad->shared_quad_state->blend_mode);
1151 }
1152 } 1065 }
1153 1066
1154 bool clipped = false;
1155 gfx::QuadF device_quad = MathUtil::MapQuad(
1156 contents_device_transform, SharedGeometryQuad(), &clipped);
1157 LayerQuad device_layer_bounds(gfx::QuadF(device_quad.BoundingBox())); 1067 LayerQuad device_layer_bounds(gfx::QuadF(device_quad.BoundingBox()));
1158 LayerQuad device_layer_edges(device_quad); 1068 LayerQuad device_layer_edges(device_quad);
1159
1160 // Use anti-aliasing programs only when necessary.
1161 bool use_aa =
1162 !clipped && (!device_quad.IsRectilinear() ||
1163 !gfx::IsNearestRectWithinDistance(device_quad.BoundingBox(),
1164 kAntiAliasingEpsilon));
1165 if (use_aa) { 1069 if (use_aa) {
1166 device_layer_bounds.InflateAntiAliasingDistance(); 1070 device_layer_bounds.InflateAntiAliasingDistance();
1167 device_layer_edges.InflateAntiAliasingDistance(); 1071 device_layer_edges.InflateAntiAliasingDistance();
1168 } 1072 }
1169 1073
1170 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; 1074 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock;
1171 unsigned mask_texture_id = 0; 1075 unsigned mask_texture_id = 0;
1172 SamplerType mask_sampler = SamplerTypeNA; 1076 SamplerType mask_sampler = SamplerTypeNA;
1173 if (quad->mask_resource_id) { 1077 if (quad->mask_resource_id) {
1174 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL( 1078 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 int shader_edge_location = -1; 1110 int shader_edge_location = -1;
1207 int shader_viewport_location = -1; 1111 int shader_viewport_location = -1;
1208 int shader_mask_sampler_location = -1; 1112 int shader_mask_sampler_location = -1;
1209 int shader_mask_tex_coord_scale_location = -1; 1113 int shader_mask_tex_coord_scale_location = -1;
1210 int shader_mask_tex_coord_offset_location = -1; 1114 int shader_mask_tex_coord_offset_location = -1;
1211 int shader_matrix_location = -1; 1115 int shader_matrix_location = -1;
1212 int shader_alpha_location = -1; 1116 int shader_alpha_location = -1;
1213 int shader_color_matrix_location = -1; 1117 int shader_color_matrix_location = -1;
1214 int shader_color_offset_location = -1; 1118 int shader_color_offset_location = -1;
1215 int shader_tex_transform_location = -1; 1119 int shader_tex_transform_location = -1;
1120 int shader_backdrop_location = -1;
1121 int shader_backdrop_rect_location = -1;
1122
1123 BlendMode shader_blend_mode = ((background_texture || background_image) &&
1124 !CanApplyBlendModeUsingBlendFunc(blend_mode))
1125 ? BlendModeFromSkXfermode(blend_mode)
1126 : BlendModeNormal;
1216 1127
1217 if (use_aa && mask_texture_id && !use_color_matrix) { 1128 if (use_aa && mask_texture_id && !use_color_matrix) {
1218 const RenderPassMaskProgramAA* program = 1129 const RenderPassMaskProgramAA* program =
1219 GetRenderPassMaskProgramAA(tex_coord_precision); 1130 GetRenderPassMaskProgramAA(tex_coord_precision, shader_blend_mode);
1220 SetUseProgram(program->program()); 1131 SetUseProgram(program->program());
1221 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1132 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1222 1133
1223 shader_quad_location = program->vertex_shader().quad_location(); 1134 shader_quad_location = program->vertex_shader().quad_location();
1224 shader_edge_location = program->vertex_shader().edge_location(); 1135 shader_edge_location = program->vertex_shader().edge_location();
1225 shader_viewport_location = program->vertex_shader().viewport_location(); 1136 shader_viewport_location = program->vertex_shader().viewport_location();
1226 shader_mask_sampler_location = 1137 shader_mask_sampler_location =
1227 program->fragment_shader().mask_sampler_location(); 1138 program->fragment_shader().mask_sampler_location();
1228 shader_mask_tex_coord_scale_location = 1139 shader_mask_tex_coord_scale_location =
1229 program->fragment_shader().mask_tex_coord_scale_location(); 1140 program->fragment_shader().mask_tex_coord_scale_location();
1230 shader_mask_tex_coord_offset_location = 1141 shader_mask_tex_coord_offset_location =
1231 program->fragment_shader().mask_tex_coord_offset_location(); 1142 program->fragment_shader().mask_tex_coord_offset_location();
1232 shader_matrix_location = program->vertex_shader().matrix_location(); 1143 shader_matrix_location = program->vertex_shader().matrix_location();
1233 shader_alpha_location = program->fragment_shader().alpha_location(); 1144 shader_alpha_location = program->fragment_shader().alpha_location();
1234 shader_tex_transform_location = 1145 shader_tex_transform_location =
1235 program->vertex_shader().tex_transform_location(); 1146 program->vertex_shader().tex_transform_location();
1147 shader_backdrop_location = program->fragment_shader().backdrop_location();
1148 shader_backdrop_rect_location =
1149 program->fragment_shader().backdrop_rect_location();
1236 } else if (!use_aa && mask_texture_id && !use_color_matrix) { 1150 } else if (!use_aa && mask_texture_id && !use_color_matrix) {
1237 const RenderPassMaskProgram* program = 1151 const RenderPassMaskProgram* program =
1238 GetRenderPassMaskProgram(tex_coord_precision); 1152 GetRenderPassMaskProgram(tex_coord_precision, shader_blend_mode);
1239 SetUseProgram(program->program()); 1153 SetUseProgram(program->program());
1240 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1154 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1241 1155
1242 shader_mask_sampler_location = 1156 shader_mask_sampler_location =
1243 program->fragment_shader().mask_sampler_location(); 1157 program->fragment_shader().mask_sampler_location();
1244 shader_mask_tex_coord_scale_location = 1158 shader_mask_tex_coord_scale_location =
1245 program->fragment_shader().mask_tex_coord_scale_location(); 1159 program->fragment_shader().mask_tex_coord_scale_location();
1246 shader_mask_tex_coord_offset_location = 1160 shader_mask_tex_coord_offset_location =
1247 program->fragment_shader().mask_tex_coord_offset_location(); 1161 program->fragment_shader().mask_tex_coord_offset_location();
1248 shader_matrix_location = program->vertex_shader().matrix_location(); 1162 shader_matrix_location = program->vertex_shader().matrix_location();
1249 shader_alpha_location = program->fragment_shader().alpha_location(); 1163 shader_alpha_location = program->fragment_shader().alpha_location();
1250 shader_tex_transform_location = 1164 shader_tex_transform_location =
1251 program->vertex_shader().tex_transform_location(); 1165 program->vertex_shader().tex_transform_location();
1166 shader_backdrop_location = program->fragment_shader().backdrop_location();
1167 shader_backdrop_rect_location =
1168 program->fragment_shader().backdrop_rect_location();
1252 } else if (use_aa && !mask_texture_id && !use_color_matrix) { 1169 } else if (use_aa && !mask_texture_id && !use_color_matrix) {
1253 const RenderPassProgramAA* program = 1170 const RenderPassProgramAA* program =
1254 GetRenderPassProgramAA(tex_coord_precision); 1171 GetRenderPassProgramAA(tex_coord_precision, shader_blend_mode);
1255 SetUseProgram(program->program()); 1172 SetUseProgram(program->program());
1256 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1173 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1257 1174
1258 shader_quad_location = program->vertex_shader().quad_location(); 1175 shader_quad_location = program->vertex_shader().quad_location();
1259 shader_edge_location = program->vertex_shader().edge_location(); 1176 shader_edge_location = program->vertex_shader().edge_location();
1260 shader_viewport_location = program->vertex_shader().viewport_location(); 1177 shader_viewport_location = program->vertex_shader().viewport_location();
1261 shader_matrix_location = program->vertex_shader().matrix_location(); 1178 shader_matrix_location = program->vertex_shader().matrix_location();
1262 shader_alpha_location = program->fragment_shader().alpha_location(); 1179 shader_alpha_location = program->fragment_shader().alpha_location();
1263 shader_tex_transform_location = 1180 shader_tex_transform_location =
1264 program->vertex_shader().tex_transform_location(); 1181 program->vertex_shader().tex_transform_location();
1182 shader_backdrop_location = program->fragment_shader().backdrop_location();
1183 shader_backdrop_rect_location =
1184 program->fragment_shader().backdrop_rect_location();
1265 } else if (use_aa && mask_texture_id && use_color_matrix) { 1185 } else if (use_aa && mask_texture_id && use_color_matrix) {
1266 const RenderPassMaskColorMatrixProgramAA* program = 1186 const RenderPassMaskColorMatrixProgramAA* program =
1267 GetRenderPassMaskColorMatrixProgramAA(tex_coord_precision); 1187 GetRenderPassMaskColorMatrixProgramAA(tex_coord_precision,
1188 shader_blend_mode);
1268 SetUseProgram(program->program()); 1189 SetUseProgram(program->program());
1269 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1190 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1270 1191
1271 shader_matrix_location = program->vertex_shader().matrix_location(); 1192 shader_matrix_location = program->vertex_shader().matrix_location();
1272 shader_quad_location = program->vertex_shader().quad_location(); 1193 shader_quad_location = program->vertex_shader().quad_location();
1273 shader_tex_transform_location = 1194 shader_tex_transform_location =
1274 program->vertex_shader().tex_transform_location(); 1195 program->vertex_shader().tex_transform_location();
1275 shader_edge_location = program->vertex_shader().edge_location(); 1196 shader_edge_location = program->vertex_shader().edge_location();
1276 shader_viewport_location = program->vertex_shader().viewport_location(); 1197 shader_viewport_location = program->vertex_shader().viewport_location();
1277 shader_alpha_location = program->fragment_shader().alpha_location(); 1198 shader_alpha_location = program->fragment_shader().alpha_location();
1278 shader_mask_sampler_location = 1199 shader_mask_sampler_location =
1279 program->fragment_shader().mask_sampler_location(); 1200 program->fragment_shader().mask_sampler_location();
1280 shader_mask_tex_coord_scale_location = 1201 shader_mask_tex_coord_scale_location =
1281 program->fragment_shader().mask_tex_coord_scale_location(); 1202 program->fragment_shader().mask_tex_coord_scale_location();
1282 shader_mask_tex_coord_offset_location = 1203 shader_mask_tex_coord_offset_location =
1283 program->fragment_shader().mask_tex_coord_offset_location(); 1204 program->fragment_shader().mask_tex_coord_offset_location();
1284 shader_color_matrix_location = 1205 shader_color_matrix_location =
1285 program->fragment_shader().color_matrix_location(); 1206 program->fragment_shader().color_matrix_location();
1286 shader_color_offset_location = 1207 shader_color_offset_location =
1287 program->fragment_shader().color_offset_location(); 1208 program->fragment_shader().color_offset_location();
1209 shader_backdrop_location = program->fragment_shader().backdrop_location();
1210 shader_backdrop_rect_location =
1211 program->fragment_shader().backdrop_rect_location();
1288 } else if (use_aa && !mask_texture_id && use_color_matrix) { 1212 } else if (use_aa && !mask_texture_id && use_color_matrix) {
1289 const RenderPassColorMatrixProgramAA* program = 1213 const RenderPassColorMatrixProgramAA* program =
1290 GetRenderPassColorMatrixProgramAA(tex_coord_precision); 1214 GetRenderPassColorMatrixProgramAA(tex_coord_precision,
1215 shader_blend_mode);
1291 SetUseProgram(program->program()); 1216 SetUseProgram(program->program());
1292 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1217 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1293 1218
1294 shader_matrix_location = program->vertex_shader().matrix_location(); 1219 shader_matrix_location = program->vertex_shader().matrix_location();
1295 shader_quad_location = program->vertex_shader().quad_location(); 1220 shader_quad_location = program->vertex_shader().quad_location();
1296 shader_tex_transform_location = 1221 shader_tex_transform_location =
1297 program->vertex_shader().tex_transform_location(); 1222 program->vertex_shader().tex_transform_location();
1298 shader_edge_location = program->vertex_shader().edge_location(); 1223 shader_edge_location = program->vertex_shader().edge_location();
1299 shader_viewport_location = program->vertex_shader().viewport_location(); 1224 shader_viewport_location = program->vertex_shader().viewport_location();
1300 shader_alpha_location = program->fragment_shader().alpha_location(); 1225 shader_alpha_location = program->fragment_shader().alpha_location();
1301 shader_color_matrix_location = 1226 shader_color_matrix_location =
1302 program->fragment_shader().color_matrix_location(); 1227 program->fragment_shader().color_matrix_location();
1303 shader_color_offset_location = 1228 shader_color_offset_location =
1304 program->fragment_shader().color_offset_location(); 1229 program->fragment_shader().color_offset_location();
1230 shader_backdrop_location = program->fragment_shader().backdrop_location();
1231 shader_backdrop_rect_location =
1232 program->fragment_shader().backdrop_rect_location();
1305 } else if (!use_aa && mask_texture_id && use_color_matrix) { 1233 } else if (!use_aa && mask_texture_id && use_color_matrix) {
1306 const RenderPassMaskColorMatrixProgram* program = 1234 const RenderPassMaskColorMatrixProgram* program =
1307 GetRenderPassMaskColorMatrixProgram(tex_coord_precision); 1235 GetRenderPassMaskColorMatrixProgram(tex_coord_precision,
1236 shader_blend_mode);
1308 SetUseProgram(program->program()); 1237 SetUseProgram(program->program());
1309 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1238 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1310 1239
1311 shader_matrix_location = program->vertex_shader().matrix_location(); 1240 shader_matrix_location = program->vertex_shader().matrix_location();
1312 shader_tex_transform_location = 1241 shader_tex_transform_location =
1313 program->vertex_shader().tex_transform_location(); 1242 program->vertex_shader().tex_transform_location();
1314 shader_mask_sampler_location = 1243 shader_mask_sampler_location =
1315 program->fragment_shader().mask_sampler_location(); 1244 program->fragment_shader().mask_sampler_location();
1316 shader_mask_tex_coord_scale_location = 1245 shader_mask_tex_coord_scale_location =
1317 program->fragment_shader().mask_tex_coord_scale_location(); 1246 program->fragment_shader().mask_tex_coord_scale_location();
1318 shader_mask_tex_coord_offset_location = 1247 shader_mask_tex_coord_offset_location =
1319 program->fragment_shader().mask_tex_coord_offset_location(); 1248 program->fragment_shader().mask_tex_coord_offset_location();
1320 shader_alpha_location = program->fragment_shader().alpha_location(); 1249 shader_alpha_location = program->fragment_shader().alpha_location();
1321 shader_color_matrix_location = 1250 shader_color_matrix_location =
1322 program->fragment_shader().color_matrix_location(); 1251 program->fragment_shader().color_matrix_location();
1323 shader_color_offset_location = 1252 shader_color_offset_location =
1324 program->fragment_shader().color_offset_location(); 1253 program->fragment_shader().color_offset_location();
1254 shader_backdrop_location = program->fragment_shader().backdrop_location();
1255 shader_backdrop_rect_location =
1256 program->fragment_shader().backdrop_rect_location();
1325 } else if (!use_aa && !mask_texture_id && use_color_matrix) { 1257 } else if (!use_aa && !mask_texture_id && use_color_matrix) {
1326 const RenderPassColorMatrixProgram* program = 1258 const RenderPassColorMatrixProgram* program =
1327 GetRenderPassColorMatrixProgram(tex_coord_precision); 1259 GetRenderPassColorMatrixProgram(tex_coord_precision, shader_blend_mode);
1328 SetUseProgram(program->program()); 1260 SetUseProgram(program->program());
1329 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1261 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1330 1262
1331 shader_matrix_location = program->vertex_shader().matrix_location(); 1263 shader_matrix_location = program->vertex_shader().matrix_location();
1332 shader_tex_transform_location = 1264 shader_tex_transform_location =
1333 program->vertex_shader().tex_transform_location(); 1265 program->vertex_shader().tex_transform_location();
1334 shader_alpha_location = program->fragment_shader().alpha_location(); 1266 shader_alpha_location = program->fragment_shader().alpha_location();
1335 shader_color_matrix_location = 1267 shader_color_matrix_location =
1336 program->fragment_shader().color_matrix_location(); 1268 program->fragment_shader().color_matrix_location();
1337 shader_color_offset_location = 1269 shader_color_offset_location =
1338 program->fragment_shader().color_offset_location(); 1270 program->fragment_shader().color_offset_location();
1271 shader_backdrop_location = program->fragment_shader().backdrop_location();
1272 shader_backdrop_rect_location =
1273 program->fragment_shader().backdrop_rect_location();
1339 } else { 1274 } else {
1340 const RenderPassProgram* program = 1275 const RenderPassProgram* program =
1341 GetRenderPassProgram(tex_coord_precision); 1276 GetRenderPassProgram(tex_coord_precision, shader_blend_mode);
1342 SetUseProgram(program->program()); 1277 SetUseProgram(program->program());
1343 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 1278 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
1344 1279
1345 shader_matrix_location = program->vertex_shader().matrix_location(); 1280 shader_matrix_location = program->vertex_shader().matrix_location();
1346 shader_alpha_location = program->fragment_shader().alpha_location(); 1281 shader_alpha_location = program->fragment_shader().alpha_location();
1347 shader_tex_transform_location = 1282 shader_tex_transform_location =
1348 program->vertex_shader().tex_transform_location(); 1283 program->vertex_shader().tex_transform_location();
1284 shader_backdrop_location = program->fragment_shader().backdrop_location();
1285 shader_backdrop_rect_location =
1286 program->fragment_shader().backdrop_rect_location();
1349 } 1287 }
1350 float tex_scale_x = 1288 float tex_scale_x =
1351 quad->rect.width() / static_cast<float>(contents_texture->size().width()); 1289 quad->rect.width() / static_cast<float>(contents_texture->size().width());
1352 float tex_scale_y = quad->rect.height() / 1290 float tex_scale_y = quad->rect.height() /
1353 static_cast<float>(contents_texture->size().height()); 1291 static_cast<float>(contents_texture->size().height());
1354 DCHECK_LE(tex_scale_x, 1.0f); 1292 DCHECK_LE(tex_scale_x, 1.0f);
1355 DCHECK_LE(tex_scale_y, 1.0f); 1293 DCHECK_LE(tex_scale_y, 1.0f);
1356 1294
1357 DCHECK(shader_tex_transform_location != -1 || IsContextLost()); 1295 DCHECK(shader_tex_transform_location != -1 || IsContextLost());
1358 // Flip the content vertically in the shader, as the RenderPass input 1296 // Flip the content vertically in the shader, as the RenderPass input
1359 // texture is already oriented the same way as the framebuffer, but the 1297 // texture is already oriented the same way as the framebuffer, but the
1360 // projection transform does a flip. 1298 // projection transform does a flip.
1361 GLC(gl_, 1299 GLC(gl_,
1362 gl_->Uniform4f(shader_tex_transform_location, 1300 gl_->Uniform4f(shader_tex_transform_location,
1363 0.0f, 1301 0.0f,
1364 tex_scale_y, 1302 tex_scale_y,
1365 tex_scale_x, 1303 tex_scale_x,
1366 -tex_scale_y)); 1304 -tex_scale_y));
1367 1305
1306 GLint last_texture_unit = 0;
1368 scoped_ptr<ResourceProvider::ScopedSamplerGL> shader_mask_sampler_lock; 1307 scoped_ptr<ResourceProvider::ScopedSamplerGL> shader_mask_sampler_lock;
1369 if (shader_mask_sampler_location != -1) { 1308 if (shader_mask_sampler_location != -1) {
1370 DCHECK_NE(shader_mask_tex_coord_scale_location, 1); 1309 DCHECK_NE(shader_mask_tex_coord_scale_location, 1);
1371 DCHECK_NE(shader_mask_tex_coord_offset_location, 1); 1310 DCHECK_NE(shader_mask_tex_coord_offset_location, 1);
1372 DCHECK_EQ(SamplerType2D, mask_sampler); 1311 DCHECK_EQ(SamplerType2D, mask_sampler);
1373 GLC(gl_, gl_->Uniform1i(shader_mask_sampler_location, 1)); 1312 GLC(gl_, gl_->Uniform1i(shader_mask_sampler_location, 1));
1374 1313
1375 gfx::RectF mask_uv_rect = quad->MaskUVRect(); 1314 gfx::RectF mask_uv_rect = quad->MaskUVRect();
1376 1315
1377 // Mask textures are oriented vertically flipped relative to the framebuffer 1316 // Mask textures are oriented vertically flipped relative to the framebuffer
1378 // and the RenderPass contents texture, so we flip the tex coords from the 1317 // and the RenderPass contents texture, so we flip the tex coords from the
1379 // RenderPass texture to find the mask texture coords. 1318 // RenderPass texture to find the mask texture coords.
1380 GLC(gl_, 1319 GLC(gl_,
1381 gl_->Uniform2f(shader_mask_tex_coord_offset_location, 1320 gl_->Uniform2f(shader_mask_tex_coord_offset_location,
1382 mask_uv_rect.x(), 1321 mask_uv_rect.x(),
1383 mask_uv_rect.bottom())); 1322 mask_uv_rect.bottom()));
1384 GLC(gl_, 1323 GLC(gl_,
1385 gl_->Uniform2f(shader_mask_tex_coord_scale_location, 1324 gl_->Uniform2f(shader_mask_tex_coord_scale_location,
1386 mask_uv_rect.width() / tex_scale_x, 1325 mask_uv_rect.width() / tex_scale_x,
1387 -mask_uv_rect.height() / tex_scale_y)); 1326 -mask_uv_rect.height() / tex_scale_y));
1327
1328 last_texture_unit = 1;
1388 } 1329 }
1389 1330
1390 if (shader_edge_location != -1) { 1331 if (shader_edge_location != -1) {
1391 float edge[24]; 1332 float edge[24];
1392 device_layer_edges.ToFloatArray(edge); 1333 device_layer_edges.ToFloatArray(edge);
1393 device_layer_bounds.ToFloatArray(&edge[12]); 1334 device_layer_bounds.ToFloatArray(&edge[12]);
1394 GLC(gl_, gl_->Uniform3fv(shader_edge_location, 8, edge)); 1335 GLC(gl_, gl_->Uniform3fv(shader_edge_location, 8, edge));
1395 } 1336 }
1396 1337
1397 if (shader_viewport_location != -1) { 1338 if (shader_viewport_location != -1) {
(...skipping 15 matching lines...) Expand all
1413 } 1354 }
1414 static const float kScale = 1.0f / 255.0f; 1355 static const float kScale = 1.0f / 255.0f;
1415 if (shader_color_offset_location != -1) { 1356 if (shader_color_offset_location != -1) {
1416 float offset[4]; 1357 float offset[4];
1417 for (int i = 0; i < 4; ++i) 1358 for (int i = 0; i < 4; ++i)
1418 offset[i] = SkScalarToFloat(color_matrix[i * 5 + 4]) * kScale; 1359 offset[i] = SkScalarToFloat(color_matrix[i * 5 + 4]) * kScale;
1419 1360
1420 GLC(gl_, gl_->Uniform4fv(shader_color_offset_location, 1, offset)); 1361 GLC(gl_, gl_->Uniform4fv(shader_color_offset_location, 1, offset));
1421 } 1362 }
1422 1363
1364 scoped_ptr<ResourceProvider::ScopedSamplerGL> shader_background_sampler_lock;
1365 if (shader_backdrop_location != -1) {
1366 DCHECK(background_texture || background_image);
1367 DCHECK_NE(shader_backdrop_location, 0);
1368 DCHECK_NE(shader_backdrop_rect_location, 0);
1369
1370 GLC(gl_, gl_->Uniform1i(shader_backdrop_location, ++last_texture_unit));
1371
1372 GLC(gl_,
1373 gl_->Uniform4f(shader_backdrop_rect_location,
1374 background_rect.x(),
1375 background_rect.y(),
1376 background_rect.width(),
1377 background_rect.height()));
1378
1379 if (background_image) {
1380 GrTexture* texture = background_image->getTexture();
1381 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit));
1382 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle());
1383 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0));
1384 } else {
1385 shader_background_sampler_lock = make_scoped_ptr(
1386 new ResourceProvider::ScopedSamplerGL(resource_provider_,
1387 background_texture->id(),
1388 GL_TEXTURE0 + last_texture_unit,
1389 GL_LINEAR));
1390 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D),
1391 shader_background_sampler_lock->target());
1392 }
1393 }
1394
1423 // Map device space quad to surface space. contents_device_transform has no 3d 1395 // Map device space quad to surface space. contents_device_transform has no 3d
1424 // component since it was flattened, so we don't need to project. 1396 // component since it was flattened, so we don't need to project.
1425 gfx::QuadF surface_quad = MathUtil::MapQuad(contents_device_transform_inverse, 1397 gfx::QuadF surface_quad = MathUtil::MapQuad(contents_device_transform_inverse,
1426 device_layer_edges.ToQuadF(), 1398 device_layer_edges.ToQuadF(),
1427 &clipped); 1399 &clipped);
1428 1400
1429 SetShaderOpacity(quad->opacity(), shader_alpha_location); 1401 SetShaderOpacity(quad->opacity(), shader_alpha_location);
1430 SetShaderQuadF(surface_quad, shader_quad_location); 1402 SetShaderQuadF(surface_quad, shader_quad_location);
1431 DrawQuadGeometry( 1403 DrawQuadGeometry(
1432 frame, quad->quadTransform(), quad->rect, shader_matrix_location); 1404 frame, quad->quadTransform(), quad->rect, shader_matrix_location);
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 } 2320 }
2349 2321
2350 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, 2322 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame,
2351 int texture_id, 2323 int texture_id,
2352 const gfx::Rect& rect, 2324 const gfx::Rect& rect,
2353 const gfx::Transform& draw_matrix, 2325 const gfx::Transform& draw_matrix,
2354 bool flip_vertically) { 2326 bool flip_vertically) {
2355 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( 2327 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
2356 gl_, &highp_threshold_cache_, highp_threshold_min_, rect.bottom_right()); 2328 gl_, &highp_threshold_cache_, highp_threshold_min_, rect.bottom_right());
2357 2329
2358 const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); 2330 const RenderPassProgram* program =
2331 GetRenderPassProgram(tex_coord_precision, BlendModeNormal);
2359 SetUseProgram(program->program()); 2332 SetUseProgram(program->program());
2360 2333
2361 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); 2334 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
2362 2335
2363 if (flip_vertically) { 2336 if (flip_vertically) {
2364 GLC(gl_, 2337 GLC(gl_,
2365 gl_->Uniform4f(program->vertex_shader().tex_transform_location(), 2338 gl_->Uniform4f(program->vertex_shader().tex_transform_location(),
2366 0.f, 2339 0.f,
2367 1.f, 2340 1.f,
2368 1.f, 2341 1.f,
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
2827 if (!solid_color_program_aa_.initialized()) { 2800 if (!solid_color_program_aa_.initialized()) {
2828 TRACE_EVENT0("cc", "GLRenderer::solidColorProgramAA::initialize"); 2801 TRACE_EVENT0("cc", "GLRenderer::solidColorProgramAA::initialize");
2829 solid_color_program_aa_.Initialize(output_surface_->context_provider(), 2802 solid_color_program_aa_.Initialize(output_surface_->context_provider(),
2830 TexCoordPrecisionNA, 2803 TexCoordPrecisionNA,
2831 SamplerTypeNA); 2804 SamplerTypeNA);
2832 } 2805 }
2833 return &solid_color_program_aa_; 2806 return &solid_color_program_aa_;
2834 } 2807 }
2835 2808
2836 const GLRenderer::RenderPassProgram* GLRenderer::GetRenderPassProgram( 2809 const GLRenderer::RenderPassProgram* GLRenderer::GetRenderPassProgram(
2837 TexCoordPrecision precision) { 2810 TexCoordPrecision precision,
2811 BlendMode blend_mode) {
2838 DCHECK_GE(precision, 0); 2812 DCHECK_GE(precision, 0);
2839 DCHECK_LT(precision, NumTexCoordPrecisions); 2813 DCHECK_LT(precision, NumTexCoordPrecisions);
2840 RenderPassProgram* program = &render_pass_program_[precision]; 2814 DCHECK_GE(blend_mode, 0);
2815 DCHECK_LT(blend_mode, NumBlendModes);
2816 RenderPassProgram* program = &render_pass_program_[precision][blend_mode];
2841 if (!program->initialized()) { 2817 if (!program->initialized()) {
2842 TRACE_EVENT0("cc", "GLRenderer::renderPassProgram::initialize"); 2818 TRACE_EVENT0("cc", "GLRenderer::renderPassProgram::initialize");
2843 program->Initialize( 2819 program->Initialize(output_surface_->context_provider(),
2844 output_surface_->context_provider(), precision, SamplerType2D); 2820 precision,
2821 SamplerType2D,
2822 blend_mode);
2845 } 2823 }
2846 return program; 2824 return program;
2847 } 2825 }
2848 2826
2849 const GLRenderer::RenderPassProgramAA* GLRenderer::GetRenderPassProgramAA( 2827 const GLRenderer::RenderPassProgramAA* GLRenderer::GetRenderPassProgramAA(
2850 TexCoordPrecision precision) { 2828 TexCoordPrecision precision,
2829 BlendMode blend_mode) {
2851 DCHECK_GE(precision, 0); 2830 DCHECK_GE(precision, 0);
2852 DCHECK_LT(precision, NumTexCoordPrecisions); 2831 DCHECK_LT(precision, NumTexCoordPrecisions);
2853 RenderPassProgramAA* program = &render_pass_program_aa_[precision]; 2832 DCHECK_GE(blend_mode, 0);
2833 DCHECK_LT(blend_mode, NumBlendModes);
2834 RenderPassProgramAA* program =
2835 &render_pass_program_aa_[precision][blend_mode];
2854 if (!program->initialized()) { 2836 if (!program->initialized()) {
2855 TRACE_EVENT0("cc", "GLRenderer::renderPassProgramAA::initialize"); 2837 TRACE_EVENT0("cc", "GLRenderer::renderPassProgramAA::initialize");
2856 program->Initialize( 2838 program->Initialize(output_surface_->context_provider(),
2857 output_surface_->context_provider(), precision, SamplerType2D); 2839 precision,
2840 SamplerType2D,
2841 blend_mode);
2858 } 2842 }
2859 return program; 2843 return program;
2860 } 2844 }
2861 2845
2862 const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram( 2846 const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram(
2863 TexCoordPrecision precision) { 2847 TexCoordPrecision precision,
2848 BlendMode blend_mode) {
2864 DCHECK_GE(precision, 0); 2849 DCHECK_GE(precision, 0);
2865 DCHECK_LT(precision, NumTexCoordPrecisions); 2850 DCHECK_LT(precision, NumTexCoordPrecisions);
2866 RenderPassMaskProgram* program = &render_pass_mask_program_[precision]; 2851 DCHECK_GE(blend_mode, 0);
2852 DCHECK_LT(blend_mode, NumBlendModes);
2853 RenderPassMaskProgram* program =
2854 &render_pass_mask_program_[precision][blend_mode];
2867 if (!program->initialized()) { 2855 if (!program->initialized()) {
2868 TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgram::initialize"); 2856 TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgram::initialize");
2869 program->Initialize( 2857 program->Initialize(output_surface_->context_provider(),
2870 output_surface_->context_provider(), precision, SamplerType2D); 2858 precision,
2859 SamplerType2D,
2860 blend_mode);
2871 } 2861 }
2872 return program; 2862 return program;
2873 } 2863 }
2874 2864
2875 const GLRenderer::RenderPassMaskProgramAA* 2865 const GLRenderer::RenderPassMaskProgramAA*
2876 GLRenderer::GetRenderPassMaskProgramAA(TexCoordPrecision precision) { 2866 GLRenderer::GetRenderPassMaskProgramAA(TexCoordPrecision precision,
2867 BlendMode blend_mode) {
2877 DCHECK_GE(precision, 0); 2868 DCHECK_GE(precision, 0);
2878 DCHECK_LT(precision, NumTexCoordPrecisions); 2869 DCHECK_LT(precision, NumTexCoordPrecisions);
2879 RenderPassMaskProgramAA* program = &render_pass_mask_program_aa_[precision]; 2870 DCHECK_GE(blend_mode, 0);
2871 DCHECK_LT(blend_mode, NumBlendModes);
2872 RenderPassMaskProgramAA* program =
2873 &render_pass_mask_program_aa_[precision][blend_mode];
2880 if (!program->initialized()) { 2874 if (!program->initialized()) {
2881 TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgramAA::initialize"); 2875 TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgramAA::initialize");
2882 program->Initialize( 2876 program->Initialize(output_surface_->context_provider(),
2883 output_surface_->context_provider(), precision, SamplerType2D); 2877 precision,
2878 SamplerType2D,
2879 blend_mode);
2884 } 2880 }
2885 return program; 2881 return program;
2886 } 2882 }
2887 2883
2888 const GLRenderer::RenderPassColorMatrixProgram* 2884 const GLRenderer::RenderPassColorMatrixProgram*
2889 GLRenderer::GetRenderPassColorMatrixProgram(TexCoordPrecision precision) { 2885 GLRenderer::GetRenderPassColorMatrixProgram(TexCoordPrecision precision,
2886 BlendMode blend_mode) {
2890 DCHECK_GE(precision, 0); 2887 DCHECK_GE(precision, 0);
2891 DCHECK_LT(precision, NumTexCoordPrecisions); 2888 DCHECK_LT(precision, NumTexCoordPrecisions);
2889 DCHECK_GE(blend_mode, 0);
2890 DCHECK_LT(blend_mode, NumBlendModes);
2892 RenderPassColorMatrixProgram* program = 2891 RenderPassColorMatrixProgram* program =
2893 &render_pass_color_matrix_program_[precision]; 2892 &render_pass_color_matrix_program_[precision][blend_mode];
2894 if (!program->initialized()) { 2893 if (!program->initialized()) {
2895 TRACE_EVENT0("cc", "GLRenderer::renderPassColorMatrixProgram::initialize"); 2894 TRACE_EVENT0("cc", "GLRenderer::renderPassColorMatrixProgram::initialize");
2896 program->Initialize( 2895 program->Initialize(output_surface_->context_provider(),
2897 output_surface_->context_provider(), precision, SamplerType2D); 2896 precision,
2897 SamplerType2D,
2898 blend_mode);
2898 } 2899 }
2899 return program; 2900 return program;
2900 } 2901 }
2901 2902
2902 const GLRenderer::RenderPassColorMatrixProgramAA* 2903 const GLRenderer::RenderPassColorMatrixProgramAA*
2903 GLRenderer::GetRenderPassColorMatrixProgramAA(TexCoordPrecision precision) { 2904 GLRenderer::GetRenderPassColorMatrixProgramAA(TexCoordPrecision precision,
2905 BlendMode blend_mode) {
2904 DCHECK_GE(precision, 0); 2906 DCHECK_GE(precision, 0);
2905 DCHECK_LT(precision, NumTexCoordPrecisions); 2907 DCHECK_LT(precision, NumTexCoordPrecisions);
2908 DCHECK_GE(blend_mode, 0);
2909 DCHECK_LT(blend_mode, NumBlendModes);
2906 RenderPassColorMatrixProgramAA* program = 2910 RenderPassColorMatrixProgramAA* program =
2907 &render_pass_color_matrix_program_aa_[precision]; 2911 &render_pass_color_matrix_program_aa_[precision][blend_mode];
2908 if (!program->initialized()) { 2912 if (!program->initialized()) {
2909 TRACE_EVENT0("cc", 2913 TRACE_EVENT0("cc",
2910 "GLRenderer::renderPassColorMatrixProgramAA::initialize"); 2914 "GLRenderer::renderPassColorMatrixProgramAA::initialize");
2911 program->Initialize( 2915 program->Initialize(output_surface_->context_provider(),
2912 output_surface_->context_provider(), precision, SamplerType2D); 2916 precision,
2917 SamplerType2D,
2918 blend_mode);
2913 } 2919 }
2914 return program; 2920 return program;
2915 } 2921 }
2916 2922
2917 const GLRenderer::RenderPassMaskColorMatrixProgram* 2923 const GLRenderer::RenderPassMaskColorMatrixProgram*
2918 GLRenderer::GetRenderPassMaskColorMatrixProgram(TexCoordPrecision precision) { 2924 GLRenderer::GetRenderPassMaskColorMatrixProgram(TexCoordPrecision precision,
2925 BlendMode blend_mode) {
2919 DCHECK_GE(precision, 0); 2926 DCHECK_GE(precision, 0);
2920 DCHECK_LT(precision, NumTexCoordPrecisions); 2927 DCHECK_LT(precision, NumTexCoordPrecisions);
2928 DCHECK_GE(blend_mode, 0);
2929 DCHECK_LT(blend_mode, NumBlendModes);
2921 RenderPassMaskColorMatrixProgram* program = 2930 RenderPassMaskColorMatrixProgram* program =
2922 &render_pass_mask_color_matrix_program_[precision]; 2931 &render_pass_mask_color_matrix_program_[precision][blend_mode];
2923 if (!program->initialized()) { 2932 if (!program->initialized()) {
2924 TRACE_EVENT0("cc", 2933 TRACE_EVENT0("cc",
2925 "GLRenderer::renderPassMaskColorMatrixProgram::initialize"); 2934 "GLRenderer::renderPassMaskColorMatrixProgram::initialize");
2926 program->Initialize( 2935 program->Initialize(output_surface_->context_provider(),
2927 output_surface_->context_provider(), precision, SamplerType2D); 2936 precision,
2937 SamplerType2D,
2938 blend_mode);
2928 } 2939 }
2929 return program; 2940 return program;
2930 } 2941 }
2931 2942
2932 const GLRenderer::RenderPassMaskColorMatrixProgramAA* 2943 const GLRenderer::RenderPassMaskColorMatrixProgramAA*
2933 GLRenderer::GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision) { 2944 GLRenderer::GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision,
2945 BlendMode blend_mode) {
2934 DCHECK_GE(precision, 0); 2946 DCHECK_GE(precision, 0);
2935 DCHECK_LT(precision, NumTexCoordPrecisions); 2947 DCHECK_LT(precision, NumTexCoordPrecisions);
2948 DCHECK_GE(blend_mode, 0);
2949 DCHECK_LT(blend_mode, NumBlendModes);
2936 RenderPassMaskColorMatrixProgramAA* program = 2950 RenderPassMaskColorMatrixProgramAA* program =
2937 &render_pass_mask_color_matrix_program_aa_[precision]; 2951 &render_pass_mask_color_matrix_program_aa_[precision][blend_mode];
2938 if (!program->initialized()) { 2952 if (!program->initialized()) {
2939 TRACE_EVENT0("cc", 2953 TRACE_EVENT0("cc",
2940 "GLRenderer::renderPassMaskColorMatrixProgramAA::initialize"); 2954 "GLRenderer::renderPassMaskColorMatrixProgramAA::initialize");
2941 program->Initialize( 2955 program->Initialize(output_surface_->context_provider(),
2942 output_surface_->context_provider(), precision, SamplerType2D); 2956 precision,
2957 SamplerType2D,
2958 blend_mode);
2943 } 2959 }
2944 return program; 2960 return program;
2945 } 2961 }
2946 2962
2947 const GLRenderer::TileProgram* GLRenderer::GetTileProgram( 2963 const GLRenderer::TileProgram* GLRenderer::GetTileProgram(
2948 TexCoordPrecision precision, 2964 TexCoordPrecision precision,
2949 SamplerType sampler) { 2965 SamplerType sampler) {
2950 DCHECK_GE(precision, 0); 2966 DCHECK_GE(precision, 0);
2951 DCHECK_LT(precision, NumTexCoordPrecisions); 2967 DCHECK_LT(precision, NumTexCoordPrecisions);
2952 DCHECK_GE(sampler, 0); 2968 DCHECK_GE(sampler, 0);
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
3158 3174
3159 for (int i = 0; i < NumTexCoordPrecisions; ++i) { 3175 for (int i = 0; i < NumTexCoordPrecisions; ++i) {
3160 for (int j = 0; j < NumSamplerTypes; ++j) { 3176 for (int j = 0; j < NumSamplerTypes; ++j) {
3161 tile_program_[i][j].Cleanup(gl_); 3177 tile_program_[i][j].Cleanup(gl_);
3162 tile_program_opaque_[i][j].Cleanup(gl_); 3178 tile_program_opaque_[i][j].Cleanup(gl_);
3163 tile_program_swizzle_[i][j].Cleanup(gl_); 3179 tile_program_swizzle_[i][j].Cleanup(gl_);
3164 tile_program_swizzle_opaque_[i][j].Cleanup(gl_); 3180 tile_program_swizzle_opaque_[i][j].Cleanup(gl_);
3165 tile_program_aa_[i][j].Cleanup(gl_); 3181 tile_program_aa_[i][j].Cleanup(gl_);
3166 tile_program_swizzle_aa_[i][j].Cleanup(gl_); 3182 tile_program_swizzle_aa_[i][j].Cleanup(gl_);
3167 } 3183 }
3168 3184 for (int j = 0; j < NumBlendModes; j++) {
3169 render_pass_mask_program_[i].Cleanup(gl_); 3185 render_pass_mask_program_[i][j].Cleanup(gl_);
3170 render_pass_program_[i].Cleanup(gl_); 3186 render_pass_program_[i][j].Cleanup(gl_);
3171 render_pass_mask_program_aa_[i].Cleanup(gl_); 3187 render_pass_mask_program_aa_[i][j].Cleanup(gl_);
3172 render_pass_program_aa_[i].Cleanup(gl_); 3188 render_pass_program_aa_[i][j].Cleanup(gl_);
3173 render_pass_color_matrix_program_[i].Cleanup(gl_); 3189 render_pass_color_matrix_program_[i][j].Cleanup(gl_);
3174 render_pass_mask_color_matrix_program_aa_[i].Cleanup(gl_); 3190 render_pass_mask_color_matrix_program_aa_[i][j].Cleanup(gl_);
3175 render_pass_color_matrix_program_aa_[i].Cleanup(gl_); 3191 render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_);
3176 render_pass_mask_color_matrix_program_[i].Cleanup(gl_); 3192 render_pass_mask_color_matrix_program_[i][j].Cleanup(gl_);
3193 }
3177 3194
3178 texture_program_[i].Cleanup(gl_); 3195 texture_program_[i].Cleanup(gl_);
3179 nonpremultiplied_texture_program_[i].Cleanup(gl_); 3196 nonpremultiplied_texture_program_[i].Cleanup(gl_);
3180 texture_background_program_[i].Cleanup(gl_); 3197 texture_background_program_[i].Cleanup(gl_);
3181 nonpremultiplied_texture_background_program_[i].Cleanup(gl_); 3198 nonpremultiplied_texture_background_program_[i].Cleanup(gl_);
3182 texture_io_surface_program_[i].Cleanup(gl_); 3199 texture_io_surface_program_[i].Cleanup(gl_);
3183 3200
3184 video_yuv_program_[i].Cleanup(gl_); 3201 video_yuv_program_[i].Cleanup(gl_);
3185 video_yuva_program_[i].Cleanup(gl_); 3202 video_yuva_program_[i].Cleanup(gl_);
3186 video_stream_texture_program_[i].Cleanup(gl_); 3203 video_stream_texture_program_[i].Cleanup(gl_);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
3275 context_support_->ScheduleOverlayPlane( 3292 context_support_->ScheduleOverlayPlane(
3276 overlay.plane_z_order, 3293 overlay.plane_z_order,
3277 overlay.transform, 3294 overlay.transform,
3278 pending_overlay_resources_.back()->texture_id(), 3295 pending_overlay_resources_.back()->texture_id(),
3279 overlay.display_rect, 3296 overlay.display_rect,
3280 overlay.uv_rect); 3297 overlay.uv_rect);
3281 } 3298 }
3282 } 3299 }
3283 3300
3284 } // namespace cc 3301 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/gl_renderer.h ('k') | cc/output/gl_renderer_unittest.cc » ('j') | cc/output/shader.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698