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

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

Issue 608523003: Implement mix-blend-mode=screen using glBlendFunc. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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
« no previous file with comments | « cc/output/gl_renderer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 682 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } 693 }
694 694
695 // Flush the GrContext to ensure all buffered GL calls are drawn to the 695 // Flush the GrContext to ensure all buffered GL calls are drawn to the
696 // backing store before we access and return it, and have cc begin using the 696 // backing store before we access and return it, and have cc begin using the
697 // GL context again. 697 // GL context again.
698 canvas->flush(); 698 canvas->flush();
699 699
700 return image; 700 return image;
701 } 701 }
702 702
703 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame,
enne (OOO) 2014/09/26 18:20:36 How is this related to this change?
Erik Dahlström (inactive) 2014/09/29 08:33:41 You're right, it's not really related, I'll drop t
704 const RenderPassDrawQuad* quad) {
705 if (quad->background_filters.IsEmpty())
706 return false;
707
708 // TODO(danakj): We only allow background filters on an opaque render surface
709 // because other surfaces may contain translucent pixels, and the contents
710 // behind those translucent pixels wouldn't have the filter applied.
711 if (frame->current_render_pass->has_transparent_background)
712 return false;
713
714 // TODO(ajuma): Add support for reference filters once
715 // FilterOperations::GetOutsets supports reference filters.
716 if (quad->background_filters.HasReferenceFilter())
717 return false;
718 return true;
719 }
720
721 bool GLRenderer::ShouldApplyBlendModeUsingBlendFunc(const DrawQuad* quad) {
722 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode;
723 return blend_mode == SkXfermode::kScreen_Mode;
724 }
725
726 void GLRenderer::ApplyBlendModeUsingBlendFunc(const DrawQuad* quad) {
727 DCHECK(ShouldApplyBlendModeUsingBlendFunc(quad));
728 if (quad->shared_quad_state->blend_mode == SkXfermode::kScreen_Mode) {
729 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE));
730 }
731 }
732
733 void GLRenderer::RestoreBlendFuncToDefault(const DrawQuad* quad) {
734 DCHECK(ShouldApplyBlendModeUsingBlendFunc(quad));
735 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
736 }
737
703 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( 738 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop(
704 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, 739 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
705 ResourceProvider* resource_provider, 740 ResourceProvider* resource_provider,
706 skia::RefPtr<SkImage> source_bitmap_with_filters, 741 skia::RefPtr<SkImage> source_bitmap_with_filters,
707 ScopedResource* source_texture_resource, 742 ScopedResource* source_texture_resource,
708 ScopedResource* background_texture_resource, 743 ScopedResource* background_texture_resource,
709 SkXfermode::Mode blend_mode) { 744 SkXfermode::Mode blend_mode) {
710 if (!use_gr_context) 745 if (!use_gr_context)
711 return source_bitmap_with_filters; 746 return source_bitmap_with_filters;
712 747
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 1001
967 UseRenderPass(frame, target_render_pass); 1002 UseRenderPass(frame, target_render_pass);
968 1003
969 if (!using_background_texture) 1004 if (!using_background_texture)
970 return scoped_ptr<ScopedResource>(); 1005 return scoped_ptr<ScopedResource>();
971 return background_texture.Pass(); 1006 return background_texture.Pass();
972 } 1007 }
973 1008
974 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, 1009 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
975 const RenderPassDrawQuad* quad) { 1010 const RenderPassDrawQuad* quad) {
976 SetBlendEnabled(quad->ShouldDrawWithBlending()); 1011 SetBlendEnabled(quad->ShouldDrawWithBlending() ||
1012 ShouldApplyBlendModeUsingBlendFunc(quad));
977 1013
978 ScopedResource* contents_texture = 1014 ScopedResource* contents_texture =
979 render_pass_textures_.get(quad->render_pass_id); 1015 render_pass_textures_.get(quad->render_pass_id);
980 if (!contents_texture || !contents_texture->id()) 1016 if (!contents_texture || !contents_texture->id())
981 return; 1017 return;
982 1018
983 gfx::Transform quad_rect_matrix; 1019 gfx::Transform quad_rect_matrix;
984 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); 1020 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect);
985 gfx::Transform contents_device_transform = 1021 gfx::Transform contents_device_transform =
986 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; 1022 frame->window_matrix * frame->projection_matrix * quad_rect_matrix;
987 contents_device_transform.FlattenTo2d(); 1023 contents_device_transform.FlattenTo2d();
988 1024
989 // Can only draw surface if device matrix is invertible. 1025 // Can only draw surface if device matrix is invertible.
990 gfx::Transform contents_device_transform_inverse( 1026 gfx::Transform contents_device_transform_inverse(
991 gfx::Transform::kSkipInitialization); 1027 gfx::Transform::kSkipInitialization);
992 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) 1028 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse))
993 return; 1029 return;
994 1030
995 bool need_background_texture = 1031 bool need_background_texture =
996 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode || 1032 (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode &&
997 !quad->background_filters.IsEmpty(); 1033 !ShouldApplyBlendModeUsingBlendFunc(quad)) ||
enne (OOO) 2014/09/26 18:20:36 Could you combine ShouldApplyBlendModeUsingBlendFu
Erik Dahlström (inactive) 2014/09/29 08:33:41 Done.
1034 ShouldApplyBackgroundFilters(frame, quad);
998 bool background_changed = false; 1035 bool background_changed = false;
999 scoped_ptr<ScopedResource> background_texture; 1036 scoped_ptr<ScopedResource> background_texture;
1000 if (need_background_texture) { 1037 if (need_background_texture) {
1001 // The pixels from the filtered background should completely replace the 1038 // The pixels from the filtered background should completely replace the
1002 // current pixel values. 1039 // current pixel values.
1003 bool disable_blending = blend_enabled(); 1040 bool disable_blending = blend_enabled();
1004 if (disable_blending) 1041 if (disable_blending)
1005 SetBlendEnabled(false); 1042 SetBlendEnabled(false);
1006 1043
1007 background_texture = 1044 background_texture =
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 resource_provider_, 1079 resource_provider_,
1043 quad->rect.origin(), 1080 quad->rect.origin(),
1044 quad->filters_scale, 1081 quad->filters_scale,
1045 filter.get(), 1082 filter.get(),
1046 contents_texture); 1083 contents_texture);
1047 } 1084 }
1048 } 1085 }
1049 } 1086 }
1050 1087
1051 if (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode && 1088 if (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode &&
1052 background_texture) { 1089 background_texture && !ShouldApplyBlendModeUsingBlendFunc(quad)) {
1053 filter_bitmap = 1090 filter_bitmap =
1054 ApplyBlendModeWithBackdrop(ScopedUseGrContext::Create(this, frame), 1091 ApplyBlendModeWithBackdrop(ScopedUseGrContext::Create(this, frame),
1055 resource_provider_, 1092 resource_provider_,
1056 filter_bitmap, 1093 filter_bitmap,
1057 contents_texture, 1094 contents_texture,
1058 background_texture.get(), 1095 background_texture.get(),
1059 quad->shared_quad_state->blend_mode); 1096 quad->shared_quad_state->blend_mode);
1060 } 1097 }
1061 1098
1062 // Draw the background texture if it has some filters applied. 1099 // Draw the background texture if it has some filters applied.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1110 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); 1147 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
1111 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); 1148 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle());
1112 } else { 1149 } else {
1113 contents_resource_lock = 1150 contents_resource_lock =
1114 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( 1151 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL(
1115 resource_provider_, contents_texture->id(), GL_LINEAR)); 1152 resource_provider_, contents_texture->id(), GL_LINEAR));
1116 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), 1153 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D),
1117 contents_resource_lock->target()); 1154 contents_resource_lock->target());
1118 } 1155 }
1119 1156
1157 if (ShouldApplyBlendModeUsingBlendFunc(quad))
1158 ApplyBlendModeUsingBlendFunc(quad);
1159
1120 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( 1160 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
1121 gl_, 1161 gl_,
1122 &highp_threshold_cache_, 1162 &highp_threshold_cache_,
1123 highp_threshold_min_, 1163 highp_threshold_min_,
1124 quad->shared_quad_state->visible_content_rect.bottom_right()); 1164 quad->shared_quad_state->visible_content_rect.bottom_right());
1125 1165
1126 int shader_quad_location = -1; 1166 int shader_quad_location = -1;
1127 int shader_edge_location = -1; 1167 int shader_edge_location = -1;
1128 int shader_viewport_location = -1; 1168 int shader_viewport_location = -1;
1129 int shader_mask_sampler_location = -1; 1169 int shader_mask_sampler_location = -1;
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 1396
1357 SetShaderOpacity(quad->opacity(), shader_alpha_location); 1397 SetShaderOpacity(quad->opacity(), shader_alpha_location);
1358 SetShaderQuadF(surface_quad, shader_quad_location); 1398 SetShaderQuadF(surface_quad, shader_quad_location);
1359 DrawQuadGeometry( 1399 DrawQuadGeometry(
1360 frame, quad->quadTransform(), quad->rect, shader_matrix_location); 1400 frame, quad->quadTransform(), quad->rect, shader_matrix_location);
1361 1401
1362 // Flush the compositor context before the filter bitmap goes out of 1402 // Flush the compositor context before the filter bitmap goes out of
1363 // scope, so the draw gets processed before the filter texture gets deleted. 1403 // scope, so the draw gets processed before the filter texture gets deleted.
1364 if (filter_bitmap) 1404 if (filter_bitmap)
1365 GLC(gl_, gl_->Flush()); 1405 GLC(gl_, gl_->Flush());
1406
1407 if (ShouldApplyBlendModeUsingBlendFunc(quad))
1408 RestoreBlendFuncToDefault(quad);
1366 } 1409 }
1367 1410
1368 struct SolidColorProgramUniforms { 1411 struct SolidColorProgramUniforms {
1369 unsigned program; 1412 unsigned program;
1370 unsigned matrix_location; 1413 unsigned matrix_location;
1371 unsigned viewport_location; 1414 unsigned viewport_location;
1372 unsigned quad_location; 1415 unsigned quad_location;
1373 unsigned edge_location; 1416 unsigned edge_location;
1374 unsigned color_location; 1417 unsigned color_location;
1375 }; 1418 };
(...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after
3202 context_support_->ScheduleOverlayPlane( 3245 context_support_->ScheduleOverlayPlane(
3203 overlay.plane_z_order, 3246 overlay.plane_z_order,
3204 overlay.transform, 3247 overlay.transform,
3205 pending_overlay_resources_.back()->texture_id(), 3248 pending_overlay_resources_.back()->texture_id(),
3206 overlay.display_rect, 3249 overlay.display_rect,
3207 overlay.uv_rect); 3250 overlay.uv_rect);
3208 } 3251 }
3209 } 3252 }
3210 3253
3211 } // namespace cc 3254 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/gl_renderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698