OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |