| 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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 default: | 91 default: |
| 92 NOTREACHED(); | 92 NOTREACHED(); |
| 93 return SamplerType2D; | 93 return SamplerType2D; |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 | 96 |
| 97 BlendMode BlendModeFromSkXfermode(SkXfermode::Mode mode) { | 97 BlendMode BlendModeFromSkXfermode(SkXfermode::Mode mode) { |
| 98 switch (mode) { | 98 switch (mode) { |
| 99 case SkXfermode::kSrcOver_Mode: | 99 case SkXfermode::kSrcOver_Mode: |
| 100 return BlendModeNormal; | 100 return BlendModeNormal; |
| 101 case SkXfermode::kScreen_Mode: |
| 102 return BlendModeScreen; |
| 101 case SkXfermode::kOverlay_Mode: | 103 case SkXfermode::kOverlay_Mode: |
| 102 return BlendModeOverlay; | 104 return BlendModeOverlay; |
| 103 case SkXfermode::kDarken_Mode: | 105 case SkXfermode::kDarken_Mode: |
| 104 return BlendModeDarken; | 106 return BlendModeDarken; |
| 105 case SkXfermode::kLighten_Mode: | 107 case SkXfermode::kLighten_Mode: |
| 106 return BlendModeLighten; | 108 return BlendModeLighten; |
| 107 case SkXfermode::kColorDodge_Mode: | 109 case SkXfermode::kColorDodge_Mode: |
| 108 return BlendModeColorDodge; | 110 return BlendModeColorDodge; |
| 109 case SkXfermode::kColorBurn_Mode: | 111 case SkXfermode::kColorBurn_Mode: |
| 110 return BlendModeColorBurn; | 112 return BlendModeColorBurn; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 121 case SkXfermode::kHue_Mode: | 123 case SkXfermode::kHue_Mode: |
| 122 return BlendModeHue; | 124 return BlendModeHue; |
| 123 case SkXfermode::kSaturation_Mode: | 125 case SkXfermode::kSaturation_Mode: |
| 124 return BlendModeSaturation; | 126 return BlendModeSaturation; |
| 125 case SkXfermode::kColor_Mode: | 127 case SkXfermode::kColor_Mode: |
| 126 return BlendModeColor; | 128 return BlendModeColor; |
| 127 case SkXfermode::kLuminosity_Mode: | 129 case SkXfermode::kLuminosity_Mode: |
| 128 return BlendModeLuminosity; | 130 return BlendModeLuminosity; |
| 129 default: | 131 default: |
| 130 NOTREACHED(); | 132 NOTREACHED(); |
| 131 return BlendModeNormal; | 133 return BlendModeNone; |
| 132 } | 134 } |
| 133 } | 135 } |
| 134 | 136 |
| 135 // Smallest unit that impact anti-aliasing output. We use this to | 137 // Smallest unit that impact anti-aliasing output. We use this to |
| 136 // determine when anti-aliasing is unnecessary. | 138 // determine when anti-aliasing is unnecessary. |
| 137 const float kAntiAliasingEpsilon = 1.0f / 1024.0f; | 139 const float kAntiAliasingEpsilon = 1.0f / 1024.0f; |
| 138 | 140 |
| 139 // Block or crash if the number of pending sync queries reach this high as | 141 // Block or crash if the number of pending sync queries reach this high as |
| 140 // something is seriously wrong on the service side if this happens. | 142 // something is seriously wrong on the service side if this happens. |
| 141 const size_t kMaxPendingSyncQueries = 16; | 143 const size_t kMaxPendingSyncQueries = 16; |
| (...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 skia::RefPtr<SkImage> background_with_filters = | 860 skia::RefPtr<SkImage> background_with_filters = |
| 859 ApplyImageFilter(ScopedUseGrContext::Create(this, frame), | 861 ApplyImageFilter(ScopedUseGrContext::Create(this, frame), |
| 860 resource_provider_, | 862 resource_provider_, |
| 861 quad->rect.origin(), | 863 quad->rect.origin(), |
| 862 quad->filters_scale, | 864 quad->filters_scale, |
| 863 filter.get(), | 865 filter.get(), |
| 864 background_texture); | 866 background_texture); |
| 865 return background_with_filters; | 867 return background_with_filters; |
| 866 } | 868 } |
| 867 | 869 |
| 868 scoped_ptr<ScopedResource> | |
| 869 GLRenderer::ApplyInverseTransformForBackgroundFilters( | |
| 870 DrawingFrame* frame, | |
| 871 const RenderPassDrawQuad* quad, | |
| 872 const gfx::Transform& contents_device_transform, | |
| 873 skia::RefPtr<SkImage> filtered_device_background, | |
| 874 const gfx::Rect& backdrop_bounding_rect) { | |
| 875 // This method draws a background filter, which applies a filter to any pixels | |
| 876 // behind the quad and seen through its background. The algorithm works as | |
| 877 // follows: | |
| 878 // 1. Read the pixels in the bounding box into a buffer. | |
| 879 // Moved to GLRenderer::GetBackdropBoundingBoxForRenderPassQuad(). | |
| 880 // 2. Read the pixels in the bounding box into a buffer R. | |
| 881 // Moved to GLRenderer::GetBackdropTexture(). | |
| 882 // 3. Apply the background filter to R, so that it is applied in the pixels' | |
| 883 // coordinate space. Moved to GLRenderer::ApplyBackgroundFilters(). | |
| 884 // 4. Apply the quad's inverse transform to map the pixels in R into the | |
| 885 // quad's content space. This implicitly clips R by the content bounds of the | |
| 886 // quad since the destination texture has bounds matching the quad's content. | |
| 887 // 5. Draw the background texture for the contents using the same transform as | |
| 888 // used to draw the contents itself. This is done without blending to replace | |
| 889 // the current background pixels with the new filtered background. | |
| 890 // 6. Draw the contents of the quad over drop of the new background with | |
| 891 // blending, as per usual. The filtered background pixels will show through | |
| 892 // any non-opaque pixels in this draws. | |
| 893 // | |
| 894 // Pixel copies in this algorithm occur at steps 2, 3, 4, and 5. | |
| 895 | |
| 896 // TODO(danakj): When this algorithm changes, update | |
| 897 // LayerTreeHost::PrioritizeTextures() accordingly. | |
| 898 | |
| 899 DCHECK(filtered_device_background); | |
| 900 | |
| 901 GrTexture* texture = filtered_device_background->getTexture(); | |
| 902 | |
| 903 scoped_ptr<ScopedResource> background_texture = | |
| 904 ScopedResource::Create(resource_provider_); | |
| 905 background_texture->Allocate( | |
| 906 quad->rect.size(), | |
| 907 ResourceProvider::TextureHintImmutableFramebuffer, | |
| 908 RGBA_8888); | |
| 909 | |
| 910 const RenderPass* target_render_pass = frame->current_render_pass; | |
| 911 bool using_background_texture = | |
| 912 UseScopedTexture(frame, background_texture.get(), quad->rect); | |
| 913 | |
| 914 if (using_background_texture) { | |
| 915 // Copy the readback pixels from device to the background texture for the | |
| 916 // surface. | |
| 917 | |
| 918 gfx::Transform contents_device_transform_inverse( | |
| 919 gfx::Transform::kSkipInitialization); | |
| 920 bool did_invert = contents_device_transform.GetInverse( | |
| 921 &contents_device_transform_inverse); | |
| 922 DCHECK(did_invert); | |
| 923 gfx::Transform device_to_framebuffer_transform; | |
| 924 QuadRectTransform( | |
| 925 &device_to_framebuffer_transform, gfx::Transform(), quad->rect); | |
| 926 device_to_framebuffer_transform.PreconcatTransform( | |
| 927 contents_device_transform_inverse); | |
| 928 | |
| 929 #ifndef NDEBUG | |
| 930 GLC(gl_, gl_->ClearColor(0, 0, 1, 1)); | |
| 931 gl_->Clear(GL_COLOR_BUFFER_BIT); | |
| 932 #endif | |
| 933 | |
| 934 // The background_texture is oriented the same as the frame buffer. | |
| 935 // The transform we are copying with has a vertical flip, as well as | |
| 936 // the |device_to_framebuffer_transform|, which cancel each other out. So do | |
| 937 // not flip the contents in the shader to maintain orientation. | |
| 938 bool flip_vertically = false; | |
| 939 | |
| 940 CopyTextureToFramebuffer(frame, | |
| 941 texture->getTextureHandle(), | |
| 942 backdrop_bounding_rect, | |
| 943 device_to_framebuffer_transform, | |
| 944 flip_vertically); | |
| 945 } | |
| 946 | |
| 947 UseRenderPass(frame, target_render_pass); | |
| 948 | |
| 949 if (!using_background_texture) | |
| 950 return nullptr; | |
| 951 return background_texture.Pass(); | |
| 952 } | |
| 953 | |
| 954 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, | 870 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
| 955 const RenderPassDrawQuad* quad) { | 871 const RenderPassDrawQuad* quad) { |
| 956 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; | |
| 957 SetBlendEnabled( | |
| 958 CanApplyBlendModeUsingBlendFunc(blend_mode) && | |
| 959 (quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode))); | |
| 960 | |
| 961 ScopedResource* contents_texture = | 872 ScopedResource* contents_texture = |
| 962 render_pass_textures_.get(quad->render_pass_id); | 873 render_pass_textures_.get(quad->render_pass_id); |
| 963 if (!contents_texture || !contents_texture->id()) | 874 if (!contents_texture || !contents_texture->id()) |
| 964 return; | 875 return; |
| 965 | 876 |
| 966 gfx::Transform quad_rect_matrix; | 877 gfx::Transform quad_rect_matrix; |
| 967 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); | 878 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); |
| 968 gfx::Transform contents_device_transform = | 879 gfx::Transform contents_device_transform = |
| 969 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; | 880 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
| 970 contents_device_transform.FlattenTo2d(); | 881 contents_device_transform.FlattenTo2d(); |
| 971 | 882 |
| 972 // Can only draw surface if device matrix is invertible. | 883 // Can only draw surface if device matrix is invertible. |
| 973 if (!contents_device_transform.IsInvertible()) | 884 if (!contents_device_transform.IsInvertible()) |
| 974 return; | 885 return; |
| 975 | 886 |
| 976 gfx::QuadF surface_quad = SharedGeometryQuad(); | 887 gfx::QuadF surface_quad = SharedGeometryQuad(); |
| 977 float edge[24]; | 888 float edge[24]; |
| 978 bool use_aa = settings_->allow_antialiasing && | 889 bool use_aa = settings_->allow_antialiasing && |
| 979 ShouldAntialiasQuad(contents_device_transform, quad, | 890 ShouldAntialiasQuad(contents_device_transform, quad, |
| 980 settings_->force_antialiasing); | 891 settings_->force_antialiasing); |
| 981 | 892 |
| 982 if (use_aa) | 893 if (use_aa) |
| 983 SetupQuadForAntialiasing(contents_device_transform, quad, | 894 SetupQuadForAntialiasing(contents_device_transform, quad, |
| 984 &surface_quad, edge); | 895 &surface_quad, edge); |
| 985 | 896 |
| 986 bool need_background_texture = !CanApplyBlendModeUsingBlendFunc(blend_mode) || | 897 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; |
| 987 ShouldApplyBackgroundFilters(frame, quad); | 898 bool use_shaders_for_blending = |
| 899 !CanApplyBlendModeUsingBlendFunc(blend_mode) || |
| 900 ShouldApplyBackgroundFilters(frame, quad) || |
| 901 settings_->force_blending_with_shaders; |
| 988 | 902 |
| 989 scoped_ptr<ScopedResource> background_texture; | 903 scoped_ptr<ScopedResource> background_texture; |
| 990 skia::RefPtr<SkImage> background_image; | 904 skia::RefPtr<SkImage> background_image; |
| 991 gfx::Rect background_rect; | 905 gfx::Rect background_rect; |
| 992 if (need_background_texture) { | 906 if (use_shaders_for_blending) { |
| 993 // Compute a bounding box around the pixels that will be visible through | 907 // Compute a bounding box around the pixels that will be visible through |
| 994 // the quad. | 908 // the quad. |
| 995 background_rect = GetBackdropBoundingBoxForRenderPassQuad( | 909 background_rect = GetBackdropBoundingBoxForRenderPassQuad( |
| 996 frame, quad, contents_device_transform, use_aa); | 910 frame, quad, contents_device_transform, use_aa); |
| 997 } | |
| 998 | 911 |
| 999 if (!background_rect.IsEmpty()) { | 912 if (!background_rect.IsEmpty()) { |
| 1000 // The pixels from the filtered background should completely replace the | 913 // The pixels from the filtered background should completely replace the |
| 1001 // current pixel values. | 914 // current pixel values. |
| 1002 bool disable_blending = blend_enabled(); | 915 if (blend_enabled()) |
| 1003 if (disable_blending) | 916 SetBlendEnabled(false); |
| 1004 SetBlendEnabled(false); | |
| 1005 | 917 |
| 1006 // Read the pixels in the bounding box into a buffer R. | 918 // Read the pixels in the bounding box into a buffer R. |
| 1007 scoped_ptr<ScopedResource> scoped_background_texture = | 919 // This function allocates a texture, which should contribute to the |
| 1008 GetBackdropTexture(background_rect); | 920 // amount of memory used by render surfaces: |
| 921 // LayerTreeHost::CalculateMemoryForRenderSurfaces. |
| 922 background_texture = GetBackdropTexture(background_rect); |
| 1009 | 923 |
| 1010 skia::RefPtr<SkImage> background_with_filters; | 924 if (ShouldApplyBackgroundFilters(frame, quad) && background_texture) { |
| 1011 if (ShouldApplyBackgroundFilters(frame, quad) && | 925 // Apply the background filters to R, so that it is applied in the |
| 1012 scoped_background_texture) { | 926 // pixels' coordinate space. |
| 1013 // Apply the background filters to R, so that it is applied in the pixels' | 927 background_image = |
| 1014 // coordinate space. | 928 ApplyBackgroundFilters(frame, quad, background_texture.get()); |
| 1015 background_with_filters = | |
| 1016 ApplyBackgroundFilters(frame, quad, scoped_background_texture.get()); | |
| 1017 } | |
| 1018 | |
| 1019 if (CanApplyBlendModeUsingBlendFunc(blend_mode) && | |
| 1020 background_with_filters) { | |
| 1021 // The background with filters will be copied to the frame buffer. | |
| 1022 // Apply the quad's inverse transform to map the pixels in R into the | |
| 1023 // quad's content space. This implicitly clips R by the content bounds of | |
| 1024 // the quad since the destination texture has bounds matching the quad's | |
| 1025 // content. | |
| 1026 background_texture = ApplyInverseTransformForBackgroundFilters( | |
| 1027 frame, quad, contents_device_transform, background_with_filters, | |
| 1028 background_rect); | |
| 1029 } else if (!CanApplyBlendModeUsingBlendFunc(blend_mode)) { | |
| 1030 if (background_with_filters) { | |
| 1031 // The background with filters will be used as backdrop for blending. | |
| 1032 background_image = background_with_filters; | |
| 1033 } else { | |
| 1034 background_texture = scoped_background_texture.Pass(); | |
| 1035 } | 929 } |
| 1036 } | 930 } |
| 1037 | 931 |
| 1038 if (disable_blending) | 932 if (!background_texture) { |
| 1039 SetBlendEnabled(true); | 933 // Something went wrong with reading the backdrop. |
| 934 DCHECK(!background_image); |
| 935 use_shaders_for_blending = false; |
| 936 } else if (background_image) { |
| 937 background_texture.reset(); |
| 938 } else if (CanApplyBlendModeUsingBlendFunc(blend_mode) && |
| 939 ShouldApplyBackgroundFilters(frame, quad)) { |
| 940 // Something went wrong with applying background filters to the backdrop. |
| 941 use_shaders_for_blending = false; |
| 942 background_texture.reset(); |
| 943 } |
| 1040 } | 944 } |
| 1041 | 945 |
| 946 SetBlendEnabled( |
| 947 !use_shaders_for_blending && |
| 948 (quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode))); |
| 949 |
| 1042 // TODO(senorblanco): Cache this value so that we don't have to do it for both | 950 // TODO(senorblanco): Cache this value so that we don't have to do it for both |
| 1043 // the surface and its replica. Apply filters to the contents texture. | 951 // the surface and its replica. Apply filters to the contents texture. |
| 1044 skia::RefPtr<SkImage> filter_image; | 952 skia::RefPtr<SkImage> filter_image; |
| 1045 SkScalar color_matrix[20]; | 953 SkScalar color_matrix[20]; |
| 1046 bool use_color_matrix = false; | 954 bool use_color_matrix = false; |
| 1047 if (!quad->filters.IsEmpty()) { | 955 if (!quad->filters.IsEmpty()) { |
| 1048 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 956 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
| 1049 quad->filters, contents_texture->size()); | 957 quad->filters, contents_texture->size()); |
| 1050 if (filter) { | 958 if (filter) { |
| 1051 skia::RefPtr<SkColorFilter> cf; | 959 skia::RefPtr<SkColorFilter> cf; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1064 filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame), | 972 filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame), |
| 1065 resource_provider_, | 973 resource_provider_, |
| 1066 quad->rect.origin(), | 974 quad->rect.origin(), |
| 1067 quad->filters_scale, | 975 quad->filters_scale, |
| 1068 filter.get(), | 976 filter.get(), |
| 1069 contents_texture); | 977 contents_texture); |
| 1070 } | 978 } |
| 1071 } | 979 } |
| 1072 } | 980 } |
| 1073 | 981 |
| 1074 if (background_texture && ShouldApplyBackgroundFilters(frame, quad)) { | |
| 1075 // Draw the background texture if it has some filters applied. | |
| 1076 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); | |
| 1077 DCHECK(background_texture->size() == quad->rect.size()); | |
| 1078 ResourceProvider::ScopedReadLockGL lock(resource_provider_, | |
| 1079 background_texture->id()); | |
| 1080 | |
| 1081 // The background_texture is oriented the same as the frame buffer. The | |
| 1082 // transform we are copying with has a vertical flip, so flip the contents | |
| 1083 // in the shader to maintain orientation | |
| 1084 bool flip_vertically = true; | |
| 1085 | |
| 1086 CopyTextureToFramebuffer(frame, | |
| 1087 lock.texture_id(), | |
| 1088 quad->rect, | |
| 1089 quad->quadTransform(), | |
| 1090 flip_vertically); | |
| 1091 } | |
| 1092 | |
| 1093 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; | 982 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; |
| 1094 unsigned mask_texture_id = 0; | 983 unsigned mask_texture_id = 0; |
| 1095 SamplerType mask_sampler = SamplerTypeNA; | 984 SamplerType mask_sampler = SamplerTypeNA; |
| 1096 if (quad->mask_resource_id) { | 985 if (quad->mask_resource_id) { |
| 1097 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL( | 986 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL( |
| 1098 resource_provider_, quad->mask_resource_id, GL_TEXTURE1, GL_LINEAR)); | 987 resource_provider_, quad->mask_resource_id, GL_TEXTURE1, GL_LINEAR)); |
| 1099 mask_texture_id = mask_resource_lock->texture_id(); | 988 mask_texture_id = mask_resource_lock->texture_id(); |
| 1100 mask_sampler = SamplerTypeFromTextureTarget(mask_resource_lock->target()); | 989 mask_sampler = SamplerTypeFromTextureTarget(mask_resource_lock->target()); |
| 1101 } | 990 } |
| 1102 | 991 |
| 1103 // TODO(danakj): use the background_texture and blend the background in with | |
| 1104 // this draw instead of having a separate copy of the background texture. | |
| 1105 | |
| 1106 scoped_ptr<ResourceProvider::ScopedSamplerGL> contents_resource_lock; | 992 scoped_ptr<ResourceProvider::ScopedSamplerGL> contents_resource_lock; |
| 1107 if (filter_image) { | 993 if (filter_image) { |
| 1108 GrTexture* texture = filter_image->getTexture(); | 994 GrTexture* texture = filter_image->getTexture(); |
| 1109 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | 995 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); |
| 1110 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); | 996 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); |
| 1111 } else { | 997 } else { |
| 1112 contents_resource_lock = | 998 contents_resource_lock = |
| 1113 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( | 999 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( |
| 1114 resource_provider_, contents_texture->id(), GL_LINEAR)); | 1000 resource_provider_, contents_texture->id(), GL_LINEAR)); |
| 1115 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), | 1001 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
| 1116 contents_resource_lock->target()); | 1002 contents_resource_lock->target()); |
| 1117 } | 1003 } |
| 1118 | 1004 |
| 1119 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) { | 1005 if (!use_shaders_for_blending) { |
| 1120 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_) | 1006 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_) |
| 1121 GLC(gl_, gl_->BlendBarrierKHR()); | 1007 GLC(gl_, gl_->BlendBarrierKHR()); |
| 1122 | 1008 |
| 1123 ApplyBlendModeUsingBlendFunc(blend_mode); | 1009 ApplyBlendModeUsingBlendFunc(blend_mode); |
| 1124 } | 1010 } |
| 1125 | 1011 |
| 1126 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1012 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1127 gl_, | 1013 gl_, |
| 1128 &highp_threshold_cache_, | 1014 &highp_threshold_cache_, |
| 1129 highp_threshold_min_, | 1015 highp_threshold_min_, |
| 1130 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1016 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1131 | 1017 |
| 1132 int shader_quad_location = -1; | 1018 int shader_quad_location = -1; |
| 1133 int shader_edge_location = -1; | 1019 int shader_edge_location = -1; |
| 1134 int shader_viewport_location = -1; | 1020 int shader_viewport_location = -1; |
| 1135 int shader_mask_sampler_location = -1; | 1021 int shader_mask_sampler_location = -1; |
| 1136 int shader_mask_tex_coord_scale_location = -1; | 1022 int shader_mask_tex_coord_scale_location = -1; |
| 1137 int shader_mask_tex_coord_offset_location = -1; | 1023 int shader_mask_tex_coord_offset_location = -1; |
| 1138 int shader_matrix_location = -1; | 1024 int shader_matrix_location = -1; |
| 1139 int shader_alpha_location = -1; | 1025 int shader_alpha_location = -1; |
| 1140 int shader_color_matrix_location = -1; | 1026 int shader_color_matrix_location = -1; |
| 1141 int shader_color_offset_location = -1; | 1027 int shader_color_offset_location = -1; |
| 1142 int shader_tex_transform_location = -1; | 1028 int shader_tex_transform_location = -1; |
| 1143 int shader_backdrop_location = -1; | 1029 int shader_backdrop_location = -1; |
| 1144 int shader_backdrop_rect_location = -1; | 1030 int shader_backdrop_rect_location = -1; |
| 1145 | 1031 |
| 1146 BlendMode shader_blend_mode = ((background_texture || background_image) && | 1032 DCHECK_EQ(background_texture || background_image, use_shaders_for_blending); |
| 1147 !CanApplyBlendModeUsingBlendFunc(blend_mode)) | 1033 BlendMode shader_blend_mode = use_shaders_for_blending |
| 1148 ? BlendModeFromSkXfermode(blend_mode) | 1034 ? BlendModeFromSkXfermode(blend_mode) |
| 1149 : BlendModeNormal; | 1035 : BlendModeNone; |
| 1150 | 1036 |
| 1151 if (use_aa && mask_texture_id && !use_color_matrix) { | 1037 if (use_aa && mask_texture_id && !use_color_matrix) { |
| 1152 const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA( | 1038 const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA( |
| 1153 tex_coord_precision, mask_sampler, shader_blend_mode); | 1039 tex_coord_precision, mask_sampler, shader_blend_mode); |
| 1154 SetUseProgram(program->program()); | 1040 SetUseProgram(program->program()); |
| 1155 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); | 1041 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); |
| 1156 | 1042 |
| 1157 shader_quad_location = program->vertex_shader().quad_location(); | 1043 shader_quad_location = program->vertex_shader().quad_location(); |
| 1158 shader_edge_location = program->vertex_shader().edge_location(); | 1044 shader_edge_location = program->vertex_shader().edge_location(); |
| 1159 shader_viewport_location = program->vertex_shader().viewport_location(); | 1045 shader_viewport_location = program->vertex_shader().viewport_location(); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1416 SetShaderOpacity(quad->opacity(), shader_alpha_location); | 1302 SetShaderOpacity(quad->opacity(), shader_alpha_location); |
| 1417 SetShaderQuadF(surface_quad, shader_quad_location); | 1303 SetShaderQuadF(surface_quad, shader_quad_location); |
| 1418 DrawQuadGeometry( | 1304 DrawQuadGeometry( |
| 1419 frame, quad->quadTransform(), quad->rect, shader_matrix_location); | 1305 frame, quad->quadTransform(), quad->rect, shader_matrix_location); |
| 1420 | 1306 |
| 1421 // Flush the compositor context before the filter bitmap goes out of | 1307 // Flush the compositor context before the filter bitmap goes out of |
| 1422 // scope, so the draw gets processed before the filter texture gets deleted. | 1308 // scope, so the draw gets processed before the filter texture gets deleted. |
| 1423 if (filter_image) | 1309 if (filter_image) |
| 1424 GLC(gl_, gl_->Flush()); | 1310 GLC(gl_, gl_->Flush()); |
| 1425 | 1311 |
| 1426 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) | 1312 if (!use_shaders_for_blending) |
| 1427 RestoreBlendFuncToDefault(blend_mode); | 1313 RestoreBlendFuncToDefault(blend_mode); |
| 1428 } | 1314 } |
| 1429 | 1315 |
| 1430 struct SolidColorProgramUniforms { | 1316 struct SolidColorProgramUniforms { |
| 1431 unsigned program; | 1317 unsigned program; |
| 1432 unsigned matrix_location; | 1318 unsigned matrix_location; |
| 1433 unsigned viewport_location; | 1319 unsigned viewport_location; |
| 1434 unsigned quad_location; | 1320 unsigned quad_location; |
| 1435 unsigned edge_location; | 1321 unsigned edge_location; |
| 1436 unsigned color_location; | 1322 unsigned color_location; |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2089 on_demand_tile_raster_resource_id_ = resource_provider_->CreateGLTexture( | 1975 on_demand_tile_raster_resource_id_ = resource_provider_->CreateGLTexture( |
| 2090 quad->texture_size, | 1976 quad->texture_size, |
| 2091 GL_TEXTURE_2D, | 1977 GL_TEXTURE_2D, |
| 2092 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 1978 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
| 2093 GL_CLAMP_TO_EDGE, | 1979 GL_CLAMP_TO_EDGE, |
| 2094 ResourceProvider::TextureHintImmutable, | 1980 ResourceProvider::TextureHintImmutable, |
| 2095 quad->texture_format); | 1981 quad->texture_format); |
| 2096 } | 1982 } |
| 2097 | 1983 |
| 2098 SkCanvas canvas(on_demand_tile_raster_bitmap_); | 1984 SkCanvas canvas(on_demand_tile_raster_bitmap_); |
| 2099 quad->picture_pile->PlaybackToCanvas(&canvas, quad->content_rect, | 1985 quad->raster_source->PlaybackToCanvas(&canvas, quad->content_rect, |
| 2100 quad->contents_scale); | 1986 quad->contents_scale); |
| 2101 | 1987 |
| 2102 uint8_t* bitmap_pixels = NULL; | 1988 uint8_t* bitmap_pixels = NULL; |
| 2103 SkBitmap on_demand_tile_raster_bitmap_dest; | 1989 SkBitmap on_demand_tile_raster_bitmap_dest; |
| 2104 SkColorType colorType = ResourceFormatToSkColorType(quad->texture_format); | 1990 SkColorType colorType = ResourceFormatToSkColorType(quad->texture_format); |
| 2105 if (on_demand_tile_raster_bitmap_.colorType() != colorType) { | 1991 if (on_demand_tile_raster_bitmap_.colorType() != colorType) { |
| 2106 on_demand_tile_raster_bitmap_.copyTo(&on_demand_tile_raster_bitmap_dest, | 1992 on_demand_tile_raster_bitmap_.copyTo(&on_demand_tile_raster_bitmap_dest, |
| 2107 colorType); | 1993 colorType); |
| 2108 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the | 1994 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the |
| 2109 // bitmap data. This check will be removed once crbug.com/293728 is fixed. | 1995 // bitmap data. This check will be removed once crbug.com/293728 is fixed. |
| 2110 CHECK_EQ(0u, on_demand_tile_raster_bitmap_dest.rowBytes() % 4); | 1996 CHECK_EQ(0u, on_demand_tile_raster_bitmap_dest.rowBytes() % 4); |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2444 int matrix_location) { | 2330 int matrix_location) { |
| 2445 gfx::Transform quad_rect_matrix; | 2331 gfx::Transform quad_rect_matrix; |
| 2446 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); | 2332 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); |
| 2447 static float gl_matrix[16]; | 2333 static float gl_matrix[16]; |
| 2448 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); | 2334 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); |
| 2449 GLC(gl_, gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 2335 GLC(gl_, gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); |
| 2450 | 2336 |
| 2451 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 2337 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); |
| 2452 } | 2338 } |
| 2453 | 2339 |
| 2454 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, | |
| 2455 int texture_id, | |
| 2456 const gfx::Rect& rect, | |
| 2457 const gfx::Transform& draw_matrix, | |
| 2458 bool flip_vertically) { | |
| 2459 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | |
| 2460 gl_, &highp_threshold_cache_, highp_threshold_min_, rect.bottom_right()); | |
| 2461 | |
| 2462 const RenderPassProgram* program = | |
| 2463 GetRenderPassProgram(tex_coord_precision, BlendModeNormal); | |
| 2464 SetUseProgram(program->program()); | |
| 2465 | |
| 2466 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); | |
| 2467 | |
| 2468 if (flip_vertically) { | |
| 2469 GLC(gl_, | |
| 2470 gl_->Uniform4f(program->vertex_shader().tex_transform_location(), | |
| 2471 0.f, | |
| 2472 1.f, | |
| 2473 1.f, | |
| 2474 -1.f)); | |
| 2475 } else { | |
| 2476 GLC(gl_, | |
| 2477 gl_->Uniform4f(program->vertex_shader().tex_transform_location(), | |
| 2478 0.f, | |
| 2479 0.f, | |
| 2480 1.f, | |
| 2481 1.f)); | |
| 2482 } | |
| 2483 | |
| 2484 SetShaderOpacity(1.f, program->fragment_shader().alpha_location()); | |
| 2485 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | |
| 2486 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, texture_id)); | |
| 2487 DrawQuadGeometry( | |
| 2488 frame, draw_matrix, rect, program->vertex_shader().matrix_location()); | |
| 2489 } | |
| 2490 | |
| 2491 void GLRenderer::Finish() { | 2340 void GLRenderer::Finish() { |
| 2492 TRACE_EVENT0("cc", "GLRenderer::Finish"); | 2341 TRACE_EVENT0("cc", "GLRenderer::Finish"); |
| 2493 GLC(gl_, gl_->Finish()); | 2342 GLC(gl_, gl_->Finish()); |
| 2494 } | 2343 } |
| 2495 | 2344 |
| 2496 void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { | 2345 void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
| 2497 DCHECK(!is_backbuffer_discarded_); | 2346 DCHECK(!is_backbuffer_discarded_); |
| 2498 | 2347 |
| 2499 TRACE_EVENT0("cc,benchmark", "GLRenderer::SwapBuffers"); | 2348 TRACE_EVENT0("cc,benchmark", "GLRenderer::SwapBuffers"); |
| 2500 // We're done! Time to swapbuffers! | 2349 // We're done! Time to swapbuffers! |
| (...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3434 context_support_->ScheduleOverlayPlane( | 3283 context_support_->ScheduleOverlayPlane( |
| 3435 overlay.plane_z_order, | 3284 overlay.plane_z_order, |
| 3436 overlay.transform, | 3285 overlay.transform, |
| 3437 pending_overlay_resources_.back()->texture_id(), | 3286 pending_overlay_resources_.back()->texture_id(), |
| 3438 overlay.display_rect, | 3287 overlay.display_rect, |
| 3439 overlay.uv_rect); | 3288 overlay.uv_rect); |
| 3440 } | 3289 } |
| 3441 } | 3290 } |
| 3442 | 3291 |
| 3443 } // namespace cc | 3292 } // namespace cc |
| OLD | NEW |