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

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: codereview fixes 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_ =
343 context_caps.gpu.blend_equation_advanced ||
344 context_caps.gpu.blend_equation_advanced_coherent;
345 use_blend_equation_advanced_coherent_ =
346 context_caps.gpu.blend_equation_advanced_coherent;
342 347
343 InitializeSharedObjects(); 348 InitializeSharedObjects();
344 } 349 }
345 350
346 GLRenderer::~GLRenderer() { 351 GLRenderer::~GLRenderer() {
347 while (!pending_async_read_pixels_.empty()) { 352 while (!pending_async_read_pixels_.empty()) {
348 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back(); 353 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back();
349 pending_read->finished_read_pixels_callback.Cancel(); 354 pending_read->finished_read_pixels_callback.Cancel();
350 pending_async_read_pixels_.pop_back(); 355 pending_async_read_pixels_.pop_back();
351 } 356 }
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 698
694 // Flush the GrContext to ensure all buffered GL calls are drawn to the 699 // 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 700 // backing store before we access and return it, and have cc begin using the
696 // GL context again. 701 // GL context again.
697 canvas->flush(); 702 canvas->flush();
698 703
699 return image; 704 return image;
700 } 705 }
701 706
702 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { 707 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
703 return (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) || 708 return use_blend_equation_advanced_ ||
709 (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) ||
704 blend_mode == SkXfermode::kScreen_Mode || 710 blend_mode == SkXfermode::kScreen_Mode ||
705 blend_mode == SkXfermode::kSrcOver_Mode; 711 blend_mode == SkXfermode::kSrcOver_Mode;
706 } 712 }
707 713
708 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { 714 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
709 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); 715 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode));
710 716
711 // Any modes set here must be reset in RestoreBlendFuncToDefault 717 // Any modes set here must be reset in RestoreBlendFuncToDefault
712 if (blend_mode == SkXfermode::kScreen_Mode) { 718 if (use_blend_equation_advanced_) {
713 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); 719 GLenum equation = GL_FUNC_ADD;
714 } else if (blend_mode == SkXfermode::kLighten_Mode) { 720
715 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE)); 721 switch (blend_mode) {
716 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT)); 722 case SkXfermode::kScreen_Mode:
723 equation = GL_SCREEN_KHR;
724 break;
725 case SkXfermode::kOverlay_Mode:
726 equation = GL_OVERLAY_KHR;
727 break;
728 case SkXfermode::kDarken_Mode:
729 equation = GL_DARKEN_KHR;
730 break;
731 case SkXfermode::kLighten_Mode:
732 equation = GL_LIGHTEN_KHR;
733 break;
734 case SkXfermode::kColorDodge_Mode:
735 equation = GL_COLORDODGE_KHR;
736 break;
737 case SkXfermode::kColorBurn_Mode:
738 equation = GL_COLORBURN_KHR;
739 break;
740 case SkXfermode::kHardLight_Mode:
741 equation = GL_HARDLIGHT_KHR;
742 break;
743 case SkXfermode::kSoftLight_Mode:
744 equation = GL_SOFTLIGHT_KHR;
745 break;
746 case SkXfermode::kDifference_Mode:
747 equation = GL_DIFFERENCE_KHR;
748 break;
749 case SkXfermode::kExclusion_Mode:
750 equation = GL_EXCLUSION_KHR;
751 break;
752 case SkXfermode::kMultiply_Mode:
753 equation = GL_MULTIPLY_KHR;
754 break;
755 case SkXfermode::kHue_Mode:
756 equation = GL_HSL_HUE_KHR;
757 break;
758 case SkXfermode::kSaturation_Mode:
759 equation = GL_HSL_SATURATION_KHR;
760 break;
761 case SkXfermode::kColor_Mode:
762 equation = GL_HSL_COLOR_KHR;
763 break;
764 case SkXfermode::kLuminosity_Mode:
765 equation = GL_HSL_LUMINOSITY_KHR;
766 break;
767 default:
768 return;
769 }
770
771 GLC(gl_, gl_->BlendEquation(equation));
772 } else {
773 if (blend_mode == SkXfermode::kScreen_Mode) {
774 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE));
775 } else if (blend_mode == SkXfermode::kLighten_Mode) {
776 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE));
777 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT));
778 }
717 } 779 }
718 } 780 }
719 781
720 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { 782 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) {
721 if (blend_mode == SkXfermode::kSrcOver_Mode) 783 if (blend_mode == SkXfermode::kSrcOver_Mode)
722 return; 784 return;
723 785
724 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); 786 if (use_blend_equation_advanced_) {
787 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
788 } else {
789 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
725 790
726 if (blend_mode == SkXfermode::kLighten_Mode) 791 if (blend_mode == SkXfermode::kLighten_Mode)
727 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); 792 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
793 }
728 } 794 }
729 795
730 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( 796 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop(
731 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, 797 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
732 ResourceProvider* resource_provider, 798 ResourceProvider* resource_provider,
733 skia::RefPtr<SkImage> source_bitmap_with_filters, 799 skia::RefPtr<SkImage> source_bitmap_with_filters,
734 ScopedResource* source_texture_resource, 800 ScopedResource* source_texture_resource,
735 ScopedResource* background_texture_resource, 801 ScopedResource* background_texture_resource,
736 SkXfermode::Mode blend_mode) { 802 SkXfermode::Mode blend_mode) {
737 if (!use_gr_context) 803 if (!use_gr_context)
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); 1253 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
1188 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); 1254 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle());
1189 } else { 1255 } else {
1190 contents_resource_lock = 1256 contents_resource_lock =
1191 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( 1257 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL(
1192 resource_provider_, contents_texture->id(), GL_LINEAR)); 1258 resource_provider_, contents_texture->id(), GL_LINEAR));
1193 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), 1259 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D),
1194 contents_resource_lock->target()); 1260 contents_resource_lock->target());
1195 } 1261 }
1196 1262
1197 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) 1263 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) {
1264 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_)
1265 GLC(gl_, gl_->BlendBarrierKHR());
1266
1198 ApplyBlendModeUsingBlendFunc(blend_mode); 1267 ApplyBlendModeUsingBlendFunc(blend_mode);
1268 }
1199 1269
1200 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( 1270 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
1201 gl_, 1271 gl_,
1202 &highp_threshold_cache_, 1272 &highp_threshold_cache_,
1203 highp_threshold_min_, 1273 highp_threshold_min_,
1204 quad->shared_quad_state->visible_content_rect.bottom_right()); 1274 quad->shared_quad_state->visible_content_rect.bottom_right());
1205 1275
1206 int shader_quad_location = -1; 1276 int shader_quad_location = -1;
1207 int shader_edge_location = -1; 1277 int shader_edge_location = -1;
1208 int shader_viewport_location = -1; 1278 int shader_viewport_location = -1;
(...skipping 2074 matching lines...) Expand 10 before | Expand all | Expand 10 after
3283 context_support_->ScheduleOverlayPlane( 3353 context_support_->ScheduleOverlayPlane(
3284 overlay.plane_z_order, 3354 overlay.plane_z_order,
3285 overlay.transform, 3355 overlay.transform,
3286 pending_overlay_resources_.back()->texture_id(), 3356 pending_overlay_resources_.back()->texture_id(),
3287 overlay.display_rect, 3357 overlay.display_rect,
3288 overlay.uv_rect); 3358 overlay.uv_rect);
3289 } 3359 }
3290 } 3360 }
3291 3361
3292 } // namespace cc 3362 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698