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

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: fix feature_info_unittest 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') | content/common/gpu/gpu_messages.h » ('j') | 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 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 368
369 capabilities_.using_image = context_caps.gpu.image; 369 capabilities_.using_image = context_caps.gpu.image;
370 370
371 capabilities_.using_discard_framebuffer = 371 capabilities_.using_discard_framebuffer =
372 context_caps.gpu.discard_framebuffer; 372 context_caps.gpu.discard_framebuffer;
373 373
374 capabilities_.allow_rasterize_on_demand = true; 374 capabilities_.allow_rasterize_on_demand = true;
375 375
376 use_sync_query_ = context_caps.gpu.sync_query; 376 use_sync_query_ = context_caps.gpu.sync_query;
377 use_blend_minmax_ = context_caps.gpu.blend_minmax; 377 use_blend_minmax_ = context_caps.gpu.blend_minmax;
378 use_blend_equation_advanced_ = context_caps.gpu.blend_equation_advanced;
379 use_blend_equation_advanced_coherent_ =
380 context_caps.gpu.blend_equation_advanced_coherent;
378 381
379 InitializeSharedObjects(); 382 InitializeSharedObjects();
380 } 383 }
381 384
382 GLRenderer::~GLRenderer() { 385 GLRenderer::~GLRenderer() {
383 while (!pending_async_read_pixels_.empty()) { 386 while (!pending_async_read_pixels_.empty()) {
384 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back(); 387 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back();
385 pending_read->finished_read_pixels_callback.Cancel(); 388 pending_read->finished_read_pixels_callback.Cancel();
386 pending_async_read_pixels_.pop_back(); 389 pending_async_read_pixels_.pop_back();
387 } 390 }
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 731
729 // Flush the GrContext to ensure all buffered GL calls are drawn to the 732 // Flush the GrContext to ensure all buffered GL calls are drawn to the
730 // backing store before we access and return it, and have cc begin using the 733 // backing store before we access and return it, and have cc begin using the
731 // GL context again. 734 // GL context again.
732 canvas->flush(); 735 canvas->flush();
733 736
734 return image; 737 return image;
735 } 738 }
736 739
737 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { 740 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
738 return (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) || 741 return use_blend_equation_advanced_ ||
742 (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) ||
739 blend_mode == SkXfermode::kScreen_Mode || 743 blend_mode == SkXfermode::kScreen_Mode ||
740 blend_mode == SkXfermode::kSrcOver_Mode; 744 blend_mode == SkXfermode::kSrcOver_Mode;
741 } 745 }
742 746
743 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { 747 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
744 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); 748 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode));
745 749
746 // Any modes set here must be reset in RestoreBlendFuncToDefault 750 // Any modes set here must be reset in RestoreBlendFuncToDefault
747 if (blend_mode == SkXfermode::kScreen_Mode) { 751 if (use_blend_equation_advanced_) {
748 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); 752 GLenum equation = GL_FUNC_ADD;
749 } else if (blend_mode == SkXfermode::kLighten_Mode) { 753
750 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE)); 754 switch (blend_mode) {
751 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT)); 755 case SkXfermode::kScreen_Mode:
756 equation = GL_SCREEN_KHR;
757 break;
758 case SkXfermode::kOverlay_Mode:
759 equation = GL_OVERLAY_KHR;
760 break;
761 case SkXfermode::kDarken_Mode:
762 equation = GL_DARKEN_KHR;
763 break;
764 case SkXfermode::kLighten_Mode:
765 equation = GL_LIGHTEN_KHR;
766 break;
767 case SkXfermode::kColorDodge_Mode:
768 equation = GL_COLORDODGE_KHR;
769 break;
770 case SkXfermode::kColorBurn_Mode:
771 equation = GL_COLORBURN_KHR;
772 break;
773 case SkXfermode::kHardLight_Mode:
774 equation = GL_HARDLIGHT_KHR;
775 break;
776 case SkXfermode::kSoftLight_Mode:
777 equation = GL_SOFTLIGHT_KHR;
778 break;
779 case SkXfermode::kDifference_Mode:
780 equation = GL_DIFFERENCE_KHR;
781 break;
782 case SkXfermode::kExclusion_Mode:
783 equation = GL_EXCLUSION_KHR;
784 break;
785 case SkXfermode::kMultiply_Mode:
786 equation = GL_MULTIPLY_KHR;
787 break;
788 case SkXfermode::kHue_Mode:
789 equation = GL_HSL_HUE_KHR;
790 break;
791 case SkXfermode::kSaturation_Mode:
792 equation = GL_HSL_SATURATION_KHR;
793 break;
794 case SkXfermode::kColor_Mode:
795 equation = GL_HSL_COLOR_KHR;
796 break;
797 case SkXfermode::kLuminosity_Mode:
798 equation = GL_HSL_LUMINOSITY_KHR;
799 break;
800 default:
801 return;
802 }
803
804 GLC(gl_, gl_->BlendEquation(equation));
805 } else {
806 if (blend_mode == SkXfermode::kScreen_Mode) {
807 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE));
808 } else if (blend_mode == SkXfermode::kLighten_Mode) {
809 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE));
810 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT));
811 }
752 } 812 }
753 } 813 }
754 814
755 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { 815 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) {
756 if (blend_mode == SkXfermode::kSrcOver_Mode) 816 if (blend_mode == SkXfermode::kSrcOver_Mode)
757 return; 817 return;
758 818
759 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); 819 if (use_blend_equation_advanced_) {
820 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
821 } else {
822 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
760 823
761 if (blend_mode == SkXfermode::kLighten_Mode) 824 if (blend_mode == SkXfermode::kLighten_Mode)
762 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); 825 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
826 }
763 } 827 }
764 828
765 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame, 829 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame,
766 const RenderPassDrawQuad* quad) { 830 const RenderPassDrawQuad* quad) {
767 if (quad->background_filters.IsEmpty()) 831 if (quad->background_filters.IsEmpty())
768 return false; 832 return false;
769 833
770 // TODO(danakj): We only allow background filters on an opaque render surface 834 // TODO(danakj): We only allow background filters on an opaque render surface
771 // because other surfaces may contain translucent pixels, and the contents 835 // because other surfaces may contain translucent pixels, and the contents
772 // behind those translucent pixels wouldn't have the filter applied. 836 // behind those translucent pixels wouldn't have the filter applied.
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); 1152 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
1089 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); 1153 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle());
1090 } else { 1154 } else {
1091 contents_resource_lock = 1155 contents_resource_lock =
1092 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( 1156 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL(
1093 resource_provider_, contents_texture->id(), GL_LINEAR)); 1157 resource_provider_, contents_texture->id(), GL_LINEAR));
1094 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), 1158 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D),
1095 contents_resource_lock->target()); 1159 contents_resource_lock->target());
1096 } 1160 }
1097 1161
1098 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) 1162 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) {
1163 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_)
1164 GLC(gl_, gl_->BlendBarrierKHR());
1165
1099 ApplyBlendModeUsingBlendFunc(blend_mode); 1166 ApplyBlendModeUsingBlendFunc(blend_mode);
1167 }
1100 1168
1101 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( 1169 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
1102 gl_, 1170 gl_,
1103 &highp_threshold_cache_, 1171 &highp_threshold_cache_,
1104 highp_threshold_min_, 1172 highp_threshold_min_,
1105 quad->shared_quad_state->visible_content_rect.bottom_right()); 1173 quad->shared_quad_state->visible_content_rect.bottom_right());
1106 1174
1107 int shader_quad_location = -1; 1175 int shader_quad_location = -1;
1108 int shader_edge_location = -1; 1176 int shader_edge_location = -1;
1109 int shader_viewport_location = -1; 1177 int shader_viewport_location = -1;
(...skipping 2180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3290 context_support_->ScheduleOverlayPlane( 3358 context_support_->ScheduleOverlayPlane(
3291 overlay.plane_z_order, 3359 overlay.plane_z_order,
3292 overlay.transform, 3360 overlay.transform,
3293 pending_overlay_resources_.back()->texture_id(), 3361 pending_overlay_resources_.back()->texture_id(),
3294 overlay.display_rect, 3362 overlay.display_rect,
3295 overlay.uv_rect); 3363 overlay.uv_rect);
3296 } 3364 }
3297 } 3365 }
3298 3366
3299 } // namespace cc 3367 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/gl_renderer.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698