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

Side by Side Diff: Source/core/rendering/RenderLayerCompositor.cpp

Issue 23511004: mix-blend-mode implementation for accelerated layers - blink part (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: removed a failing reftest dependent on render-compositor bindings Created 7 years 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 | « Source/core/rendering/RenderLayer.cpp ('k') | Source/web/AssertMatchingEnums.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 private: 170 private:
171 Vector<OverlapMapContainer> m_overlapStack; 171 Vector<OverlapMapContainer> m_overlapStack;
172 HashSet<const RenderLayer*> m_layers; 172 HashSet<const RenderLayer*> m_layers;
173 RenderGeometryMap m_geometryMap; 173 RenderGeometryMap m_geometryMap;
174 }; 174 };
175 175
176 struct CompositingRecursionData { 176 struct CompositingRecursionData {
177 CompositingRecursionData(RenderLayer* compAncestor, bool testOverlap) 177 CompositingRecursionData(RenderLayer* compAncestor, bool testOverlap)
178 : m_compositingAncestor(compAncestor) 178 : m_compositingAncestor(compAncestor)
179 , m_subtreeIsCompositing(false) 179 , m_subtreeIsCompositing(false)
180 , m_hasUnisolatedCompositedBlendingDescendant(false)
180 , m_testingOverlap(testOverlap) 181 , m_testingOverlap(testOverlap)
181 #ifndef NDEBUG 182 #ifndef NDEBUG
182 , m_depth(0) 183 , m_depth(0)
183 #endif 184 #endif
184 { 185 {
185 } 186 }
186 187
187 CompositingRecursionData(const CompositingRecursionData& other) 188 CompositingRecursionData(const CompositingRecursionData& other)
188 : m_compositingAncestor(other.m_compositingAncestor) 189 : m_compositingAncestor(other.m_compositingAncestor)
189 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) 190 , m_subtreeIsCompositing(other.m_subtreeIsCompositing)
191 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo sitedBlendingDescendant)
190 , m_testingOverlap(other.m_testingOverlap) 192 , m_testingOverlap(other.m_testingOverlap)
191 #ifndef NDEBUG 193 #ifndef NDEBUG
192 , m_depth(other.m_depth + 1) 194 , m_depth(other.m_depth + 1)
193 #endif 195 #endif
194 { 196 {
195 } 197 }
196 198
197 RenderLayer* m_compositingAncestor; 199 RenderLayer* m_compositingAncestor;
198 bool m_subtreeIsCompositing; 200 bool m_subtreeIsCompositing;
201 bool m_hasUnisolatedCompositedBlendingDescendant;
199 bool m_testingOverlap; 202 bool m_testingOverlap;
200 #ifndef NDEBUG 203 #ifndef NDEBUG
201 int m_depth; 204 int m_depth;
202 #endif 205 #endif
203 }; 206 };
204 207
205 208
206 RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView) 209 RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView)
207 : m_renderView(renderView) 210 : m_renderView(renderView)
208 , m_hasAcceleratedCompositing(true) 211 , m_hasAcceleratedCompositing(true)
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 if (inCompositingMode() && m_hasAcceleratedCompositing) 910 if (inCompositingMode() && m_hasAcceleratedCompositing)
908 willBeComposited = true; 911 willBeComposited = true;
909 } 912 }
910 913
911 // All layers (even ones that aren't being composited) need to get added to 914 // All layers (even ones that aren't being composited) need to get added to
912 // the overlap map. Layers that are not separately composited will paint int o their 915 // the overlap map. Layers that are not separately composited will paint int o their
913 // compositing ancestor's backing, and so are still considered for overlap. 916 // compositing ancestor's backing, and so are still considered for overlap.
914 if (overlapMap && childRecursionData.m_compositingAncestor && !childRecursio nData.m_compositingAncestor->isRootLayer()) 917 if (overlapMap && childRecursionData.m_compositingAncestor && !childRecursio nData.m_compositingAncestor->isRootLayer())
915 addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds); 918 addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds);
916 919
920 if (layer->stackingNode()->isStackingContext()) {
921 layer->setShouldIsolateCompositedDescendants(childRecursionData.m_hasUni solatedCompositedBlendingDescendant);
922 } else {
923 layer->setShouldIsolateCompositedDescendants(false);
924 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = child RecursionData.m_hasUnisolatedCompositedBlendingDescendant;
925 }
926
917 // Now check for reasons to become composited that depend on the state of de scendant layers. 927 // Now check for reasons to become composited that depend on the state of de scendant layers.
918 CompositingReasons subtreeCompositingReasons = subtreeReasonsForCompositing( layer->renderer(), childRecursionData.m_subtreeIsCompositing, anyDescendantHas3D Transform); 928 CompositingReasons subtreeCompositingReasons = subtreeReasonsForCompositing( layer->renderer(), childRecursionData.m_subtreeIsCompositing, anyDescendantHas3D Transform);
919 reasonsToComposite |= subtreeCompositingReasons; 929 reasonsToComposite |= subtreeCompositingReasons;
920 if (!willBeComposited && canBeComposited(layer) && requiresCompositing(subtr eeCompositingReasons)) { 930 if (!willBeComposited && canBeComposited(layer) && requiresCompositing(subtr eeCompositingReasons)) {
921 childRecursionData.m_compositingAncestor = layer; 931 childRecursionData.m_compositingAncestor = layer;
922 if (overlapMap) { 932 if (overlapMap) {
923 // FIXME: this context push is effectively a no-op but needs to exis t for 933 // FIXME: this context push is effectively a no-op but needs to exis t for
924 // now, because the code is designed to push overlap information to the 934 // now, because the code is designed to push overlap information to the
925 // second-from-top context of the stack. 935 // second-from-top context of the stack.
926 overlapMap->beginNewOverlapTestingContext(); 936 overlapMap->beginNewOverlapTestingContext();
927 addToOverlapMapRecursive(*overlapMap, layer); 937 addToOverlapMapRecursive(*overlapMap, layer);
928 } 938 }
929 willBeComposited = true; 939 willBeComposited = true;
930 } 940 }
931 941
932 // If the original layer is composited, the reflection needs to be, too. 942 // If the original layer is composited, the reflection needs to be, too.
933 if (layer->reflectionInfo()) { 943 if (layer->reflectionInfo()) {
934 // FIXME: Shouldn't we call computeCompositingRequirements to handle a r eflection overlapping with another renderer? 944 // FIXME: Shouldn't we call computeCompositingRequirements to handle a r eflection overlapping with another renderer?
935 CompositingReasons reflectionCompositingReason = willBeComposited ? Comp ositingReasonReflectionOfCompositedParent : CompositingReasonNone; 945 CompositingReasons reflectionCompositingReason = willBeComposited ? Comp ositingReasonReflectionOfCompositedParent : CompositingReasonNone;
936 layer->reflectionInfo()->reflectionLayer()->setCompositingReasons(layer- >reflectionInfo()->reflectionLayer()->compositingReasons() | reflectionCompositi ngReason); 946 layer->reflectionInfo()->reflectionLayer()->setCompositingReasons(layer- >reflectionInfo()->reflectionLayer()->compositingReasons() | reflectionCompositi ngReason);
937 } 947 }
938 948
939 // Subsequent layers in the parent's stacking context may also need to compo site. 949 // Subsequent layers in the parent's stacking context may also need to compo site.
940 if (childRecursionData.m_subtreeIsCompositing) 950 if (childRecursionData.m_subtreeIsCompositing)
941 currentRecursionData.m_subtreeIsCompositing = true; 951 currentRecursionData.m_subtreeIsCompositing = true;
942 952
953 if (willBeComposited && layer->hasBlendMode())
954 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = true;
955
943 // Set the flag to say that this SC has compositing children. 956 // Set the flag to say that this SC has compositing children.
944 layer->setHasCompositingDescendant(childRecursionData.m_subtreeIsCompositing ); 957 layer->setHasCompositingDescendant(childRecursionData.m_subtreeIsCompositing );
945 958
946 // Turn overlap testing off for later layers if it's already off, or if we h ave an animating transform. 959 // Turn overlap testing off for later layers if it's already off, or if we h ave an animating transform.
947 // Note that if the layer clips its descendants, there's no reason to propag ate the child animation to the parent layers. That's because 960 // Note that if the layer clips its descendants, there's no reason to propag ate the child animation to the parent layers. That's because
948 // we know for sure the animation is contained inside the clipping rectangle , which is already added to the overlap map. 961 // we know for sure the animation is contained inside the clipping rectangle , which is already added to the overlap map.
949 bool isCompositedClippingLayer = canBeComposited(layer) && (reasonsToComposi te & CompositingReasonClipsCompositingDescendants); 962 bool isCompositedClippingLayer = canBeComposited(layer) && (reasonsToComposi te & CompositingReasonClipsCompositingDescendants);
950 if ((!childRecursionData.m_testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer->renderer())) 963 if ((!childRecursionData.m_testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer->renderer()))
951 currentRecursionData.m_testingOverlap = false; 964 currentRecursionData.m_testingOverlap = false;
952 965
(...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after
1739 1752
1740 // FIXME: this seems to be a potentially different layer than the layer for which this was called. May not be an error, but is very confusing. 1753 // FIXME: this seems to be a potentially different layer than the layer for which this was called. May not be an error, but is very confusing.
1741 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); 1754 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
1742 1755
1743 // When a layer has composited descendants, some effects, like 2d transforms , filters, masks etc must be implemented 1756 // When a layer has composited descendants, some effects, like 2d transforms , filters, masks etc must be implemented
1744 // via compositing so that they also apply to those composited descdendants. 1757 // via compositing so that they also apply to those composited descdendants.
1745 if (hasCompositedDescendants) { 1758 if (hasCompositedDescendants) {
1746 if (layer->transform()) 1759 if (layer->transform())
1747 subtreeReasons |= CompositingReasonTransformWithCompositedDescendant s; 1760 subtreeReasons |= CompositingReasonTransformWithCompositedDescendant s;
1748 1761
1762 if (layer->shouldIsolateCompositedDescendants()) {
1763 ASSERT(layer->stackingNode()->isStackingContext());
1764 subtreeReasons |= CompositingReasonIsolateCompositedDescendants;
1765 }
1766
1749 // If the implementation of createsGroup changes, we need to be aware of that in this part of code. 1767 // If the implementation of createsGroup changes, we need to be aware of that in this part of code.
1750 ASSERT((renderer->isTransparent() || renderer->hasMask() || renderer->ha sFilter() || renderer->hasBlendMode()) == renderer->createsGroup()); 1768 ASSERT((renderer->isTransparent() || renderer->hasMask() || renderer->ha sFilter() || renderer->hasBlendMode()) == renderer->createsGroup());
1751 if (renderer->isTransparent()) 1769 if (renderer->isTransparent())
1752 subtreeReasons |= CompositingReasonOpacityWithCompositedDescendants; 1770 subtreeReasons |= CompositingReasonOpacityWithCompositedDescendants;
1753 if (renderer->hasMask()) 1771 if (renderer->hasMask())
1754 subtreeReasons |= CompositingReasonMaskWithCompositedDescendants; 1772 subtreeReasons |= CompositingReasonMaskWithCompositedDescendants;
1755 if (renderer->hasFilter()) 1773 if (renderer->hasFilter())
1756 subtreeReasons |= CompositingReasonFilterWithCompositedDescendants; 1774 subtreeReasons |= CompositingReasonFilterWithCompositedDescendants;
1757 if (renderer->hasBlendMode()) 1775 if (renderer->hasBlendMode())
1758 subtreeReasons |= CompositingReasonBlendingWithCompositedDescendants ; 1776 subtreeReasons |= CompositingReasonBlendingWithCompositedDescendants ;
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
2484 } else if (graphicsLayer == m_scrollLayer.get()) { 2502 } else if (graphicsLayer == m_scrollLayer.get()) {
2485 name = "Frame Scrolling Layer"; 2503 name = "Frame Scrolling Layer";
2486 } else { 2504 } else {
2487 ASSERT_NOT_REACHED(); 2505 ASSERT_NOT_REACHED();
2488 } 2506 }
2489 2507
2490 return name; 2508 return name;
2491 } 2509 }
2492 2510
2493 } // namespace WebCore 2511 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayer.cpp ('k') | Source/web/AssertMatchingEnums.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698