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

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

Issue 643373003: Add support for all blendmodes if we have GL_KHR_blend_equation_advanced. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add missing test 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 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 332
333 capabilities_.using_image = context_caps.gpu.image; 333 capabilities_.using_image = context_caps.gpu.image;
334 334
335 capabilities_.using_discard_framebuffer = 335 capabilities_.using_discard_framebuffer =
336 context_caps.gpu.discard_framebuffer; 336 context_caps.gpu.discard_framebuffer;
337 337
338 capabilities_.allow_rasterize_on_demand = true; 338 capabilities_.allow_rasterize_on_demand = true;
339 339
340 use_sync_query_ = context_caps.gpu.sync_query; 340 use_sync_query_ = context_caps.gpu.sync_query;
341 use_blend_minmax_ = context_caps.gpu.blend_minmax; 341 use_blend_minmax_ = context_caps.gpu.blend_minmax;
342 use_blend_equation_advanced_ = context_caps.gpu.blend_equation_advanced;
342 343
343 InitializeSharedObjects(); 344 InitializeSharedObjects();
344 } 345 }
345 346
346 GLRenderer::~GLRenderer() { 347 GLRenderer::~GLRenderer() {
347 while (!pending_async_read_pixels_.empty()) { 348 while (!pending_async_read_pixels_.empty()) {
348 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back(); 349 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back();
349 pending_read->finished_read_pixels_callback.Cancel(); 350 pending_read->finished_read_pixels_callback.Cancel();
350 pending_async_read_pixels_.pop_back(); 351 pending_async_read_pixels_.pop_back();
351 } 352 }
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 694
694 // 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
695 // 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
696 // GL context again. 697 // GL context again.
697 canvas->flush(); 698 canvas->flush();
698 699
699 return image; 700 return image;
700 } 701 }
701 702
702 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { 703 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
703 return (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) || 704 return use_blend_equation_advanced_ ||
704 blend_mode == SkXfermode::kScreen_Mode || 705 (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) ||
705 blend_mode == SkXfermode::kSrcOver_Mode; 706 blend_mode == SkXfermode::kScreen_Mode ||
707 blend_mode == SkXfermode::kSrcOver_Mode;
706 } 708 }
707 709
708 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { 710 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
709 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); 711 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode));
710 712
711 // Any modes set here must be reset in RestoreBlendFuncToDefault 713 // Any modes set here must be reset in RestoreBlendFuncToDefault
712 if (blend_mode == SkXfermode::kScreen_Mode) { 714 if (use_blend_equation_advanced_) {
713 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); 715 GLenum equation = GL_SRC_OVER_NV;
714 } else if (blend_mode == SkXfermode::kLighten_Mode) { 716
715 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE)); 717 switch (blend_mode) {
716 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT)); 718 case SkXfermode::kScreen_Mode:
piman 2014/10/16 20:13:28 nit: indent style (run git cl format?)
Erik Dahlström (inactive) 2014/10/17 15:33:17 Done.
719 equation = GL_SCREEN_NV;
720 break;
721 case SkXfermode::kOverlay_Mode:
722 equation = GL_OVERLAY_NV;
723 break;
724 case SkXfermode::kDarken_Mode:
725 equation = GL_DARKEN_NV;
726 break;
727 case SkXfermode::kLighten_Mode:
728 equation = GL_LIGHTEN_NV;
729 break;
730 case SkXfermode::kColorDodge_Mode:
731 equation = GL_COLORDODGE_NV;
732 break;
733 case SkXfermode::kColorBurn_Mode:
734 equation = GL_COLORBURN_NV;
735 break;
736 case SkXfermode::kHardLight_Mode:
737 equation = GL_HARDLIGHT_NV;
738 break;
739 case SkXfermode::kSoftLight_Mode:
740 equation = GL_SOFTLIGHT_NV;
741 break;
742 case SkXfermode::kDifference_Mode:
743 equation = GL_DIFFERENCE_NV;
744 break;
745 case SkXfermode::kExclusion_Mode:
746 equation = GL_EXCLUSION_NV;
747 break;
748 case SkXfermode::kMultiply_Mode:
749 equation = GL_MULTIPLY_NV;
750 break;
751 case SkXfermode::kHue_Mode:
752 equation = GL_HSL_HUE_NV;
753 break;
754 case SkXfermode::kSaturation_Mode:
755 equation = GL_HSL_SATURATION_NV;
756 break;
757 case SkXfermode::kColor_Mode:
758 equation = GL_HSL_COLOR_NV;
759 break;
760 case SkXfermode::kLuminosity_Mode:
761 equation = GL_HSL_LUMINOSITY_NV;
762 break;
763 default:
764 return;
765 }
766
767 GLC(gl_, gl_->BlendEquation(equation));
768 } else {
769 if (blend_mode == SkXfermode::kScreen_Mode) {
770 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE));
771 } else if (blend_mode == SkXfermode::kLighten_Mode) {
772 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE));
773 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT));
774 }
717 } 775 }
718 } 776 }
719 777
720 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { 778 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) {
721 if (blend_mode == SkXfermode::kSrcOver_Mode) 779 if (blend_mode == SkXfermode::kSrcOver_Mode)
722 return; 780 return;
723 781
724 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); 782 if (use_blend_equation_advanced_) {
783 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
784 } else {
785 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
725 786
726 if (blend_mode == SkXfermode::kLighten_Mode) 787 if (blend_mode == SkXfermode::kLighten_Mode)
727 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); 788 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
789 }
728 } 790 }
729 791
730 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( 792 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop(
731 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, 793 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
732 ResourceProvider* resource_provider, 794 ResourceProvider* resource_provider,
733 skia::RefPtr<SkImage> source_bitmap_with_filters, 795 skia::RefPtr<SkImage> source_bitmap_with_filters,
734 ScopedResource* source_texture_resource, 796 ScopedResource* source_texture_resource,
735 ScopedResource* background_texture_resource, 797 ScopedResource* background_texture_resource,
736 SkXfermode::Mode blend_mode) { 798 SkXfermode::Mode blend_mode) {
737 if (!use_gr_context) 799 if (!use_gr_context)
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); 1249 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
1188 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); 1250 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle());
1189 } else { 1251 } else {
1190 contents_resource_lock = 1252 contents_resource_lock =
1191 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( 1253 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL(
1192 resource_provider_, contents_texture->id(), GL_LINEAR)); 1254 resource_provider_, contents_texture->id(), GL_LINEAR));
1193 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), 1255 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D),
1194 contents_resource_lock->target()); 1256 contents_resource_lock->target());
1195 } 1257 }
1196 1258
1197 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) 1259 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) {
1198 ApplyBlendModeUsingBlendFunc(blend_mode); 1260 if (use_blend_equation_advanced_)
1261 GLC(gl_, gl_->BlendBarrierNV());
piman 2014/10/16 20:13:29 Is it worth skipping this if we have GL_*_blend_eq
Erik Dahlström (inactive) 2014/10/17 15:33:17 Perhaps, my current card/driver setup doesn't supp
1262
1263 ApplyBlendModeUsingBlendFunc(blend_mode);
1264 }
1199 1265
1200 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( 1266 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
1201 gl_, 1267 gl_,
1202 &highp_threshold_cache_, 1268 &highp_threshold_cache_,
1203 highp_threshold_min_, 1269 highp_threshold_min_,
1204 quad->shared_quad_state->visible_content_rect.bottom_right()); 1270 quad->shared_quad_state->visible_content_rect.bottom_right());
1205 1271
1206 int shader_quad_location = -1; 1272 int shader_quad_location = -1;
1207 int shader_edge_location = -1; 1273 int shader_edge_location = -1;
1208 int shader_viewport_location = -1; 1274 int shader_viewport_location = -1;
(...skipping 2074 matching lines...) Expand 10 before | Expand all | Expand 10 after
3283 context_support_->ScheduleOverlayPlane( 3349 context_support_->ScheduleOverlayPlane(
3284 overlay.plane_z_order, 3350 overlay.plane_z_order,
3285 overlay.transform, 3351 overlay.transform,
3286 pending_overlay_resources_.back()->texture_id(), 3352 pending_overlay_resources_.back()->texture_id(),
3287 overlay.display_rect, 3353 overlay.display_rect,
3288 overlay.uv_rect); 3354 overlay.uv_rect);
3289 } 3355 }
3290 } 3356 }
3291 3357
3292 } // namespace cc 3358 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698