| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 case GL_TEXTURE_RECTANGLE_ARB: | 98 case GL_TEXTURE_RECTANGLE_ARB: |
| 99 return SAMPLER_TYPE_2D_RECT; | 99 return SAMPLER_TYPE_2D_RECT; |
| 100 case GL_TEXTURE_EXTERNAL_OES: | 100 case GL_TEXTURE_EXTERNAL_OES: |
| 101 return SAMPLER_TYPE_EXTERNAL_OES; | 101 return SAMPLER_TYPE_EXTERNAL_OES; |
| 102 default: | 102 default: |
| 103 NOTREACHED(); | 103 NOTREACHED(); |
| 104 return SAMPLER_TYPE_2D; | 104 return SAMPLER_TYPE_2D; |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 | 107 |
| 108 BlendMode BlendModeFromSkXfermode(SkXfermode::Mode mode) { | 108 BlendMode BlendModeFromSkXfermode(SkBlendMode mode) { |
| 109 switch (mode) { | 109 switch (mode) { |
| 110 case SkXfermode::kSrcOver_Mode: | 110 case SkBlendMode::kSrcOver: |
| 111 return BLEND_MODE_NORMAL; | 111 return BLEND_MODE_NORMAL; |
| 112 case SkXfermode::kScreen_Mode: | 112 case SkBlendMode::kScreen: |
| 113 return BLEND_MODE_SCREEN; | 113 return BLEND_MODE_SCREEN; |
| 114 case SkXfermode::kOverlay_Mode: | 114 case SkBlendMode::kOverlay: |
| 115 return BLEND_MODE_OVERLAY; | 115 return BLEND_MODE_OVERLAY; |
| 116 case SkXfermode::kDarken_Mode: | 116 case SkBlendMode::kDarken: |
| 117 return BLEND_MODE_DARKEN; | 117 return BLEND_MODE_DARKEN; |
| 118 case SkXfermode::kLighten_Mode: | 118 case SkBlendMode::kLighten: |
| 119 return BLEND_MODE_LIGHTEN; | 119 return BLEND_MODE_LIGHTEN; |
| 120 case SkXfermode::kColorDodge_Mode: | 120 case SkBlendMode::kColorDodge: |
| 121 return BLEND_MODE_COLOR_DODGE; | 121 return BLEND_MODE_COLOR_DODGE; |
| 122 case SkXfermode::kColorBurn_Mode: | 122 case SkBlendMode::kColorBurn: |
| 123 return BLEND_MODE_COLOR_BURN; | 123 return BLEND_MODE_COLOR_BURN; |
| 124 case SkXfermode::kHardLight_Mode: | 124 case SkBlendMode::kHardLight: |
| 125 return BLEND_MODE_HARD_LIGHT; | 125 return BLEND_MODE_HARD_LIGHT; |
| 126 case SkXfermode::kSoftLight_Mode: | 126 case SkBlendMode::kSoftLight: |
| 127 return BLEND_MODE_SOFT_LIGHT; | 127 return BLEND_MODE_SOFT_LIGHT; |
| 128 case SkXfermode::kDifference_Mode: | 128 case SkBlendMode::kDifference: |
| 129 return BLEND_MODE_DIFFERENCE; | 129 return BLEND_MODE_DIFFERENCE; |
| 130 case SkXfermode::kExclusion_Mode: | 130 case SkBlendMode::kExclusion: |
| 131 return BLEND_MODE_EXCLUSION; | 131 return BLEND_MODE_EXCLUSION; |
| 132 case SkXfermode::kMultiply_Mode: | 132 case SkBlendMode::kMultiply: |
| 133 return BLEND_MODE_MULTIPLY; | 133 return BLEND_MODE_MULTIPLY; |
| 134 case SkXfermode::kHue_Mode: | 134 case SkBlendMode::kHue: |
| 135 return BLEND_MODE_HUE; | 135 return BLEND_MODE_HUE; |
| 136 case SkXfermode::kSaturation_Mode: | 136 case SkBlendMode::kSaturation: |
| 137 return BLEND_MODE_SATURATION; | 137 return BLEND_MODE_SATURATION; |
| 138 case SkXfermode::kColor_Mode: | 138 case SkBlendMode::kColor: |
| 139 return BLEND_MODE_COLOR; | 139 return BLEND_MODE_COLOR; |
| 140 case SkXfermode::kLuminosity_Mode: | 140 case SkBlendMode::kLuminosity: |
| 141 return BLEND_MODE_LUMINOSITY; | 141 return BLEND_MODE_LUMINOSITY; |
| 142 default: | 142 default: |
| 143 NOTREACHED(); | 143 NOTREACHED(); |
| 144 return BLEND_MODE_NONE; | 144 return BLEND_MODE_NONE; |
| 145 } | 145 } |
| 146 } | 146 } |
| 147 | 147 |
| 148 // Smallest unit that impact anti-aliasing output. We use this to | 148 // Smallest unit that impact anti-aliasing output. We use this to |
| 149 // determine when anti-aliasing is unnecessary. | 149 // determine when anti-aliasing is unnecessary. |
| 150 const float kAntiAliasingEpsilon = 1.0f / 1024.0f; | 150 const float kAntiAliasingEpsilon = 1.0f / 1024.0f; |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 return nullptr; | 705 return nullptr; |
| 706 } | 706 } |
| 707 | 707 |
| 708 // Force a flush of the Skia pipeline before we switch back to the compositor | 708 // Force a flush of the Skia pipeline before we switch back to the compositor |
| 709 // context. | 709 // context. |
| 710 image->getTextureHandle(true); | 710 image->getTextureHandle(true); |
| 711 CHECK(image->isTextureBacked()); | 711 CHECK(image->isTextureBacked()); |
| 712 return image; | 712 return image; |
| 713 } | 713 } |
| 714 | 714 |
| 715 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { | 715 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) { |
| 716 return use_blend_equation_advanced_ || | 716 return use_blend_equation_advanced_ || blend_mode == SkBlendMode::kScreen || |
| 717 blend_mode == SkXfermode::kScreen_Mode || | 717 blend_mode == SkBlendMode::kSrcOver; |
| 718 blend_mode == SkXfermode::kSrcOver_Mode; | |
| 719 } | 718 } |
| 720 | 719 |
| 721 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { | 720 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) { |
| 722 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); | 721 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); |
| 723 | 722 |
| 724 // Any modes set here must be reset in RestoreBlendFuncToDefault | 723 // Any modes set here must be reset in RestoreBlendFuncToDefault |
| 725 if (use_blend_equation_advanced_) { | 724 if (use_blend_equation_advanced_) { |
| 726 GLenum equation = GL_FUNC_ADD; | 725 GLenum equation = GL_FUNC_ADD; |
| 727 | 726 |
| 728 switch (blend_mode) { | 727 switch (blend_mode) { |
| 729 case SkXfermode::kScreen_Mode: | 728 case SkBlendMode::kScreen: |
| 730 equation = GL_SCREEN_KHR; | 729 equation = GL_SCREEN_KHR; |
| 731 break; | 730 break; |
| 732 case SkXfermode::kOverlay_Mode: | 731 case SkBlendMode::kOverlay: |
| 733 equation = GL_OVERLAY_KHR; | 732 equation = GL_OVERLAY_KHR; |
| 734 break; | 733 break; |
| 735 case SkXfermode::kDarken_Mode: | 734 case SkBlendMode::kDarken: |
| 736 equation = GL_DARKEN_KHR; | 735 equation = GL_DARKEN_KHR; |
| 737 break; | 736 break; |
| 738 case SkXfermode::kLighten_Mode: | 737 case SkBlendMode::kLighten: |
| 739 equation = GL_LIGHTEN_KHR; | 738 equation = GL_LIGHTEN_KHR; |
| 740 break; | 739 break; |
| 741 case SkXfermode::kColorDodge_Mode: | 740 case SkBlendMode::kColorDodge: |
| 742 equation = GL_COLORDODGE_KHR; | 741 equation = GL_COLORDODGE_KHR; |
| 743 break; | 742 break; |
| 744 case SkXfermode::kColorBurn_Mode: | 743 case SkBlendMode::kColorBurn: |
| 745 equation = GL_COLORBURN_KHR; | 744 equation = GL_COLORBURN_KHR; |
| 746 break; | 745 break; |
| 747 case SkXfermode::kHardLight_Mode: | 746 case SkBlendMode::kHardLight: |
| 748 equation = GL_HARDLIGHT_KHR; | 747 equation = GL_HARDLIGHT_KHR; |
| 749 break; | 748 break; |
| 750 case SkXfermode::kSoftLight_Mode: | 749 case SkBlendMode::kSoftLight: |
| 751 equation = GL_SOFTLIGHT_KHR; | 750 equation = GL_SOFTLIGHT_KHR; |
| 752 break; | 751 break; |
| 753 case SkXfermode::kDifference_Mode: | 752 case SkBlendMode::kDifference: |
| 754 equation = GL_DIFFERENCE_KHR; | 753 equation = GL_DIFFERENCE_KHR; |
| 755 break; | 754 break; |
| 756 case SkXfermode::kExclusion_Mode: | 755 case SkBlendMode::kExclusion: |
| 757 equation = GL_EXCLUSION_KHR; | 756 equation = GL_EXCLUSION_KHR; |
| 758 break; | 757 break; |
| 759 case SkXfermode::kMultiply_Mode: | 758 case SkBlendMode::kMultiply: |
| 760 equation = GL_MULTIPLY_KHR; | 759 equation = GL_MULTIPLY_KHR; |
| 761 break; | 760 break; |
| 762 case SkXfermode::kHue_Mode: | 761 case SkBlendMode::kHue: |
| 763 equation = GL_HSL_HUE_KHR; | 762 equation = GL_HSL_HUE_KHR; |
| 764 break; | 763 break; |
| 765 case SkXfermode::kSaturation_Mode: | 764 case SkBlendMode::kSaturation: |
| 766 equation = GL_HSL_SATURATION_KHR; | 765 equation = GL_HSL_SATURATION_KHR; |
| 767 break; | 766 break; |
| 768 case SkXfermode::kColor_Mode: | 767 case SkBlendMode::kColor: |
| 769 equation = GL_HSL_COLOR_KHR; | 768 equation = GL_HSL_COLOR_KHR; |
| 770 break; | 769 break; |
| 771 case SkXfermode::kLuminosity_Mode: | 770 case SkBlendMode::kLuminosity: |
| 772 equation = GL_HSL_LUMINOSITY_KHR; | 771 equation = GL_HSL_LUMINOSITY_KHR; |
| 773 break; | 772 break; |
| 774 default: | 773 default: |
| 775 return; | 774 return; |
| 776 } | 775 } |
| 777 | 776 |
| 778 gl_->BlendEquation(equation); | 777 gl_->BlendEquation(equation); |
| 779 } else { | 778 } else { |
| 780 if (blend_mode == SkXfermode::kScreen_Mode) { | 779 if (blend_mode == SkBlendMode::kScreen) { |
| 781 gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE); | 780 gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE); |
| 782 } | 781 } |
| 783 } | 782 } |
| 784 } | 783 } |
| 785 | 784 |
| 786 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { | 785 void GLRenderer::RestoreBlendFuncToDefault(SkBlendMode blend_mode) { |
| 787 if (blend_mode == SkXfermode::kSrcOver_Mode) | 786 if (blend_mode == SkBlendMode::kSrcOver) |
| 788 return; | 787 return; |
| 789 | 788 |
| 790 if (use_blend_equation_advanced_) { | 789 if (use_blend_equation_advanced_) { |
| 791 gl_->BlendEquation(GL_FUNC_ADD); | 790 gl_->BlendEquation(GL_FUNC_ADD); |
| 792 } else { | 791 } else { |
| 793 gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); | 792 gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); |
| 794 } | 793 } |
| 795 } | 794 } |
| 796 | 795 |
| 797 bool GLRenderer::ShouldApplyBackgroundFilters(const RenderPassDrawQuad* quad) { | 796 bool GLRenderer::ShouldApplyBackgroundFilters(const RenderPassDrawQuad* quad) { |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 SetupRenderPassQuadForClippingAndAntialiasing( | 1120 SetupRenderPassQuadForClippingAndAntialiasing( |
| 1122 params->contents_device_transform, quad, aa_quad, params->clip_region, | 1121 params->contents_device_transform, quad, aa_quad, params->clip_region, |
| 1123 ¶ms->surface_quad, params->edge); | 1122 ¶ms->surface_quad, params->edge); |
| 1124 | 1123 |
| 1125 return true; | 1124 return true; |
| 1126 } | 1125 } |
| 1127 | 1126 |
| 1128 void GLRenderer::UpdateRPDQShadersForBlending( | 1127 void GLRenderer::UpdateRPDQShadersForBlending( |
| 1129 DrawRenderPassDrawQuadParams* params) { | 1128 DrawRenderPassDrawQuadParams* params) { |
| 1130 const RenderPassDrawQuad* quad = params->quad; | 1129 const RenderPassDrawQuad* quad = params->quad; |
| 1131 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; | 1130 SkBlendMode blend_mode = quad->shared_quad_state->blend_mode; |
| 1132 params->use_shaders_for_blending = | 1131 params->use_shaders_for_blending = |
| 1133 !CanApplyBlendModeUsingBlendFunc(blend_mode) || | 1132 !CanApplyBlendModeUsingBlendFunc(blend_mode) || |
| 1134 ShouldApplyBackgroundFilters(quad) || | 1133 ShouldApplyBackgroundFilters(quad) || |
| 1135 settings_->force_blending_with_shaders; | 1134 settings_->force_blending_with_shaders; |
| 1136 | 1135 |
| 1137 if (params->use_shaders_for_blending) { | 1136 if (params->use_shaders_for_blending) { |
| 1138 DCHECK(params->frame); | 1137 DCHECK(params->frame); |
| 1139 // Compute a bounding box around the pixels that will be visible through | 1138 // Compute a bounding box around the pixels that will be visible through |
| 1140 // the quad. | 1139 // the quad. |
| 1141 gfx::Rect unclipped_rect; | 1140 gfx::Rect unclipped_rect; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 params->contents_resource_lock = | 1272 params->contents_resource_lock = |
| 1274 base::MakeUnique<ResourceProvider::ScopedSamplerGL>( | 1273 base::MakeUnique<ResourceProvider::ScopedSamplerGL>( |
| 1275 resource_provider_, params->contents_texture->id(), GL_LINEAR); | 1274 resource_provider_, params->contents_texture->id(), GL_LINEAR); |
| 1276 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), | 1275 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
| 1277 params->contents_resource_lock->target()); | 1276 params->contents_resource_lock->target()); |
| 1278 params->source_needs_flip = params->flip_texture; | 1277 params->source_needs_flip = params->flip_texture; |
| 1279 } | 1278 } |
| 1280 } | 1279 } |
| 1281 | 1280 |
| 1282 void GLRenderer::UpdateRPDQBlendMode(DrawRenderPassDrawQuadParams* params) { | 1281 void GLRenderer::UpdateRPDQBlendMode(DrawRenderPassDrawQuadParams* params) { |
| 1283 SkXfermode::Mode blend_mode = params->quad->shared_quad_state->blend_mode; | 1282 SkBlendMode blend_mode = params->quad->shared_quad_state->blend_mode; |
| 1284 SetBlendEnabled(!params->use_shaders_for_blending && | 1283 SetBlendEnabled(!params->use_shaders_for_blending && |
| 1285 (params->quad->ShouldDrawWithBlending() || | 1284 (params->quad->ShouldDrawWithBlending() || |
| 1286 !IsDefaultBlendMode(blend_mode))); | 1285 !IsDefaultBlendMode(blend_mode))); |
| 1287 if (!params->use_shaders_for_blending) { | 1286 if (!params->use_shaders_for_blending) { |
| 1288 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_) | 1287 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_) |
| 1289 gl_->BlendBarrierKHR(); | 1288 gl_->BlendBarrierKHR(); |
| 1290 | 1289 |
| 1291 ApplyBlendModeUsingBlendFunc(blend_mode); | 1290 ApplyBlendModeUsingBlendFunc(blend_mode); |
| 1292 } | 1291 } |
| 1293 } | 1292 } |
| (...skipping 2751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4045 // The alpha has already been applied when copying the RPDQ to an IOSurface. | 4044 // The alpha has already been applied when copying the RPDQ to an IOSurface. |
| 4046 GLfloat alpha = 1; | 4045 GLfloat alpha = 1; |
| 4047 gl_->ScheduleCALayerSharedStateCHROMIUM(alpha, is_clipped, clip_rect, | 4046 gl_->ScheduleCALayerSharedStateCHROMIUM(alpha, is_clipped, clip_rect, |
| 4048 sorting_context_id, gl_transform); | 4047 sorting_context_id, gl_transform); |
| 4049 gl_->ScheduleCALayerCHROMIUM( | 4048 gl_->ScheduleCALayerCHROMIUM( |
| 4050 texture_id, contents_rect, ca_layer_overlay->background_color, | 4049 texture_id, contents_rect, ca_layer_overlay->background_color, |
| 4051 ca_layer_overlay->edge_aa_mask, bounds_rect, filter); | 4050 ca_layer_overlay->edge_aa_mask, bounds_rect, filter); |
| 4052 } | 4051 } |
| 4053 | 4052 |
| 4054 } // namespace cc | 4053 } // namespace cc |
| OLD | NEW |