Chromium Code Reviews| 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 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 331 capabilities_.allow_partial_texture_updates = true; | 331 capabilities_.allow_partial_texture_updates = true; |
| 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 | 342 |
| 342 InitializeSharedObjects(); | 343 InitializeSharedObjects(); |
| 343 } | 344 } |
| 344 | 345 |
| 345 GLRenderer::~GLRenderer() { | 346 GLRenderer::~GLRenderer() { |
| 346 while (!pending_async_read_pixels_.empty()) { | 347 while (!pending_async_read_pixels_.empty()) { |
| 347 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back(); | 348 PendingAsyncReadPixels* pending_read = pending_async_read_pixels_.back(); |
| 348 pending_read->finished_read_pixels_callback.Cancel(); | 349 pending_read->finished_read_pixels_callback.Cancel(); |
| 349 pending_async_read_pixels_.pop_back(); | 350 pending_async_read_pixels_.pop_back(); |
| 350 } | 351 } |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 694 } | 695 } |
| 695 | 696 |
| 696 // Flush the GrContext to ensure all buffered GL calls are drawn to the | 697 // Flush the GrContext to ensure all buffered GL calls are drawn to the |
| 697 // backing store before we access and return it, and have cc begin using the | 698 // backing store before we access and return it, and have cc begin using the |
| 698 // GL context again. | 699 // GL context again. |
| 699 canvas->flush(); | 700 canvas->flush(); |
| 700 | 701 |
| 701 return image; | 702 return image; |
| 702 } | 703 } |
| 703 | 704 |
| 704 bool GLRenderer::ShouldApplyBlendModeUsingBlendFunc(const DrawQuad* quad) { | 705 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { |
| 705 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; | 706 return (use_blend_minmax && blend_mode == SkXfermode::kLighten_Mode) || |
| 706 return blend_mode == SkXfermode::kScreen_Mode || | 707 blend_mode == SkXfermode::kScreen_Mode || |
| 707 blend_mode == SkXfermode::kSrcOver_Mode; | 708 blend_mode == SkXfermode::kSrcOver_Mode; |
| 708 } | 709 } |
| 709 | 710 |
| 710 void GLRenderer::ApplyBlendModeUsingBlendFunc(const DrawQuad* quad) { | 711 void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { |
| 711 DCHECK(ShouldApplyBlendModeUsingBlendFunc(quad)); | 712 DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); |
| 712 if (quad->shared_quad_state->blend_mode == SkXfermode::kScreen_Mode) { | 713 |
| 714 // Any modes set here must be reset in RestoreBlendFuncToDefault | |
| 715 if (blend_mode == SkXfermode::kScreen_Mode) { | |
| 713 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); | 716 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); |
| 717 } else if (blend_mode == SkXfermode::kLighten_Mode) { | |
| 718 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE)); | |
| 719 GLC(gl_, gl_->BlendEquation(GL_MAX_EXT)); | |
| 714 } | 720 } |
| 715 } | 721 } |
| 716 | 722 |
| 717 void GLRenderer::RestoreBlendFuncToDefault() { | 723 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { |
| 724 if (blend_mode == SkXfermode::kSrcOver_Mode) | |
| 725 return; | |
| 726 | |
| 718 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 727 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
| 728 | |
| 729 if (blend_mode == SkXfermode::kLighten_Mode) | |
| 730 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); | |
| 719 } | 731 } |
| 720 | 732 |
| 721 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( | 733 static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( |
| 722 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, | 734 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
| 723 ResourceProvider* resource_provider, | 735 ResourceProvider* resource_provider, |
| 724 skia::RefPtr<SkImage> source_bitmap_with_filters, | 736 skia::RefPtr<SkImage> source_bitmap_with_filters, |
| 725 ScopedResource* source_texture_resource, | 737 ScopedResource* source_texture_resource, |
| 726 ScopedResource* background_texture_resource, | 738 ScopedResource* background_texture_resource, |
| 727 SkXfermode::Mode blend_mode) { | 739 SkXfermode::Mode blend_mode) { |
| 728 if (!use_gr_context) | 740 if (!use_gr_context) |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 984 | 996 |
| 985 UseRenderPass(frame, target_render_pass); | 997 UseRenderPass(frame, target_render_pass); |
| 986 | 998 |
| 987 if (!using_background_texture) | 999 if (!using_background_texture) |
| 988 return nullptr; | 1000 return nullptr; |
| 989 return background_texture.Pass(); | 1001 return background_texture.Pass(); |
| 990 } | 1002 } |
| 991 | 1003 |
| 992 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, | 1004 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
| 993 const RenderPassDrawQuad* quad) { | 1005 const RenderPassDrawQuad* quad) { |
| 1006 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; | |
| 994 SetBlendEnabled(quad->ShouldDrawWithBlending() || | 1007 SetBlendEnabled(quad->ShouldDrawWithBlending() || |
| 995 ShouldApplyBlendModeUsingBlendFunc(quad)); | 1008 (!IsDefaultBlendMode(blend_mode) && |
| 1009 CanApplyBlendModeUsingBlendFunc(blend_mode))); | |
| 996 | 1010 |
| 997 ScopedResource* contents_texture = | 1011 ScopedResource* contents_texture = |
| 998 render_pass_textures_.get(quad->render_pass_id); | 1012 render_pass_textures_.get(quad->render_pass_id); |
| 999 if (!contents_texture || !contents_texture->id()) | 1013 if (!contents_texture || !contents_texture->id()) |
| 1000 return; | 1014 return; |
| 1001 | 1015 |
| 1002 gfx::Transform quad_rect_matrix; | 1016 gfx::Transform quad_rect_matrix; |
| 1003 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); | 1017 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); |
| 1004 gfx::Transform contents_device_transform = | 1018 gfx::Transform contents_device_transform = |
| 1005 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; | 1019 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
| 1006 contents_device_transform.FlattenTo2d(); | 1020 contents_device_transform.FlattenTo2d(); |
| 1007 | 1021 |
| 1008 // Can only draw surface if device matrix is invertible. | 1022 // Can only draw surface if device matrix is invertible. |
| 1009 gfx::Transform contents_device_transform_inverse( | 1023 gfx::Transform contents_device_transform_inverse( |
| 1010 gfx::Transform::kSkipInitialization); | 1024 gfx::Transform::kSkipInitialization); |
| 1011 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) | 1025 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) |
| 1012 return; | 1026 return; |
| 1013 | 1027 |
| 1014 bool need_background_texture = !ShouldApplyBlendModeUsingBlendFunc(quad) || | 1028 bool need_background_texture = !CanApplyBlendModeUsingBlendFunc(blend_mode) || |
| 1015 !quad->background_filters.IsEmpty(); | 1029 !quad->background_filters.IsEmpty(); |
| 1016 bool background_changed = false; | 1030 bool background_changed = false; |
| 1017 scoped_ptr<ScopedResource> background_texture; | 1031 scoped_ptr<ScopedResource> background_texture; |
| 1018 if (need_background_texture) { | 1032 if (need_background_texture) { |
| 1019 // The pixels from the filtered background should completely replace the | 1033 // The pixels from the filtered background should completely replace the |
| 1020 // current pixel values. | 1034 // current pixel values. |
| 1021 bool disable_blending = blend_enabled(); | 1035 bool disable_blending = blend_enabled(); |
| 1022 if (disable_blending) | 1036 if (disable_blending) |
| 1023 SetBlendEnabled(false); | 1037 SetBlendEnabled(false); |
| 1024 | 1038 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1059 ApplyImageFilter(ScopedUseGrContext::Create(this, frame), | 1073 ApplyImageFilter(ScopedUseGrContext::Create(this, frame), |
| 1060 resource_provider_, | 1074 resource_provider_, |
| 1061 quad->rect.origin(), | 1075 quad->rect.origin(), |
| 1062 quad->filters_scale, | 1076 quad->filters_scale, |
| 1063 filter.get(), | 1077 filter.get(), |
| 1064 contents_texture); | 1078 contents_texture); |
| 1065 } | 1079 } |
| 1066 } | 1080 } |
| 1067 } | 1081 } |
| 1068 | 1082 |
| 1069 if (background_texture && !ShouldApplyBlendModeUsingBlendFunc(quad)) { | 1083 if (background_texture && !CanApplyBlendModeUsingBlendFunc(blend_mode)) { |
|
enne (OOO)
2014/10/07 17:51:17
I think this CanApplyBlendModeUsingBlendFunc check
Erik Dahlström (inactive)
2014/10/08 15:25:20
No, I don't think it's redundant, have a look at t
| |
| 1070 filter_bitmap = | 1084 filter_bitmap = |
| 1071 ApplyBlendModeWithBackdrop(ScopedUseGrContext::Create(this, frame), | 1085 ApplyBlendModeWithBackdrop(ScopedUseGrContext::Create(this, frame), |
| 1072 resource_provider_, | 1086 resource_provider_, |
| 1073 filter_bitmap, | 1087 filter_bitmap, |
| 1074 contents_texture, | 1088 contents_texture, |
| 1075 background_texture.get(), | 1089 background_texture.get(), |
| 1076 quad->shared_quad_state->blend_mode); | 1090 quad->shared_quad_state->blend_mode); |
| 1077 } | 1091 } |
| 1078 | 1092 |
| 1079 // Draw the background texture if it has some filters applied. | 1093 // Draw the background texture if it has some filters applied. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1127 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | 1141 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); |
| 1128 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); | 1142 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); |
| 1129 } else { | 1143 } else { |
| 1130 contents_resource_lock = | 1144 contents_resource_lock = |
| 1131 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( | 1145 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( |
| 1132 resource_provider_, contents_texture->id(), GL_LINEAR)); | 1146 resource_provider_, contents_texture->id(), GL_LINEAR)); |
| 1133 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), | 1147 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
| 1134 contents_resource_lock->target()); | 1148 contents_resource_lock->target()); |
| 1135 } | 1149 } |
| 1136 | 1150 |
| 1137 if (ShouldApplyBlendModeUsingBlendFunc(quad)) | 1151 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) |
| 1138 ApplyBlendModeUsingBlendFunc(quad); | 1152 ApplyBlendModeUsingBlendFunc(blend_mode); |
| 1139 | 1153 |
| 1140 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1154 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1141 gl_, | 1155 gl_, |
| 1142 &highp_threshold_cache_, | 1156 &highp_threshold_cache_, |
| 1143 highp_threshold_min_, | 1157 highp_threshold_min_, |
| 1144 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1158 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1145 | 1159 |
| 1146 int shader_quad_location = -1; | 1160 int shader_quad_location = -1; |
| 1147 int shader_edge_location = -1; | 1161 int shader_edge_location = -1; |
| 1148 int shader_viewport_location = -1; | 1162 int shader_viewport_location = -1; |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1377 SetShaderOpacity(quad->opacity(), shader_alpha_location); | 1391 SetShaderOpacity(quad->opacity(), shader_alpha_location); |
| 1378 SetShaderQuadF(surface_quad, shader_quad_location); | 1392 SetShaderQuadF(surface_quad, shader_quad_location); |
| 1379 DrawQuadGeometry( | 1393 DrawQuadGeometry( |
| 1380 frame, quad->quadTransform(), quad->rect, shader_matrix_location); | 1394 frame, quad->quadTransform(), quad->rect, shader_matrix_location); |
| 1381 | 1395 |
| 1382 // Flush the compositor context before the filter bitmap goes out of | 1396 // Flush the compositor context before the filter bitmap goes out of |
| 1383 // scope, so the draw gets processed before the filter texture gets deleted. | 1397 // scope, so the draw gets processed before the filter texture gets deleted. |
| 1384 if (filter_bitmap) | 1398 if (filter_bitmap) |
| 1385 GLC(gl_, gl_->Flush()); | 1399 GLC(gl_, gl_->Flush()); |
| 1386 | 1400 |
| 1387 if (ShouldApplyBlendModeUsingBlendFunc(quad)) | 1401 if (CanApplyBlendModeUsingBlendFunc(blend_mode)) |
| 1388 RestoreBlendFuncToDefault(); | 1402 RestoreBlendFuncToDefault(blend_mode); |
| 1389 } | 1403 } |
| 1390 | 1404 |
| 1391 struct SolidColorProgramUniforms { | 1405 struct SolidColorProgramUniforms { |
| 1392 unsigned program; | 1406 unsigned program; |
| 1393 unsigned matrix_location; | 1407 unsigned matrix_location; |
| 1394 unsigned viewport_location; | 1408 unsigned viewport_location; |
| 1395 unsigned quad_location; | 1409 unsigned quad_location; |
| 1396 unsigned edge_location; | 1410 unsigned edge_location; |
| 1397 unsigned color_location; | 1411 unsigned color_location; |
| 1398 }; | 1412 }; |
| (...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3223 context_support_->ScheduleOverlayPlane( | 3237 context_support_->ScheduleOverlayPlane( |
| 3224 overlay.plane_z_order, | 3238 overlay.plane_z_order, |
| 3225 overlay.transform, | 3239 overlay.transform, |
| 3226 pending_overlay_resources_.back()->texture_id(), | 3240 pending_overlay_resources_.back()->texture_id(), |
| 3227 overlay.display_rect, | 3241 overlay.display_rect, |
| 3228 overlay.uv_rect); | 3242 overlay.uv_rect); |
| 3229 } | 3243 } |
| 3230 } | 3244 } |
| 3231 | 3245 |
| 3232 } // namespace cc | 3246 } // namespace cc |
| OLD | NEW |