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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.cpp

Issue 1387923002: LayoutObject::invalidatePaintIfNeededForSynchronizedPainting() and plumbing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months 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 | « third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "config.h" 5 #include "config.h"
6 #include "platform/graphics/paint/DisplayItemList.h" 6 #include "platform/graphics/paint/DisplayItemList.h"
7 7
8 #include "platform/NotImplemented.h" 8 #include "platform/NotImplemented.h"
9 #include "platform/TraceEvent.h" 9 #include "platform/TraceEvent.h"
10 #include "platform/graphics/GraphicsLayer.h" 10 #include "platform/graphics/GraphicsLayer.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 } 95 }
96 96
97 void DisplayItemList::endScope() 97 void DisplayItemList::endScope()
98 { 98 {
99 m_scopeStack.removeLast(); 99 m_scopeStack.removeLast();
100 endSkippingCache(); 100 endSkippingCache();
101 } 101 }
102 102
103 void DisplayItemList::invalidate(const DisplayItemClientWrapper& client, PaintIn validationReason paintInvalidationReason, const IntRect& previousPaintInvalidati onRect, const IntRect& newPaintInvalidationRect) 103 void DisplayItemList::invalidate(const DisplayItemClientWrapper& client, PaintIn validationReason paintInvalidationReason, const IntRect& previousPaintInvalidati onRect, const IntRect& newPaintInvalidationRect)
104 { 104 {
105 invalidateUntracked(client.displayItemClient()); 105 invalidateClient(client);
106
106 if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { 107 if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) {
107 Invalidation invalidation = { previousPaintInvalidationRect, paintInvali dationReason }; 108 Invalidation invalidation = { previousPaintInvalidationRect, paintInvali dationReason };
108 if (!previousPaintInvalidationRect.isEmpty()) 109 if (!previousPaintInvalidationRect.isEmpty())
109 m_invalidations.append(invalidation); 110 m_invalidations.append(invalidation);
110 if (newPaintInvalidationRect != previousPaintInvalidationRect && !newPai ntInvalidationRect.isEmpty()) { 111 if (newPaintInvalidationRect != previousPaintInvalidationRect && !newPai ntInvalidationRect.isEmpty()) {
111 invalidation.rect = newPaintInvalidationRect; 112 invalidation.rect = newPaintInvalidationRect;
112 m_invalidations.append(invalidation); 113 m_invalidations.append(invalidation);
113 } 114 }
114 } 115 }
116 }
115 117
118 void DisplayItemList::invalidateClient(const DisplayItemClientWrapper& client)
119 {
120 invalidateUntracked(client.displayItemClient());
116 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali dationObjects) 121 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali dationObjects)
117 m_trackedPaintInvalidationObjects->append(client.debugName()); 122 m_trackedPaintInvalidationObjects->append(client.debugName());
118 } 123 }
119 124
120 void DisplayItemList::invalidateUntracked(DisplayItemClient client) 125 void DisplayItemList::invalidateUntracked(DisplayItemClient client)
121 { 126 {
122 // Can only be called during layout/paintInvalidation, not during painting. 127 // This can be called during painting, but we can't invalidate already paint ed clients.
123 ASSERT(m_newDisplayItems.isEmpty()); 128 ASSERT(!m_newDisplayItemIndicesByClient.contains(client));
124 updateValidlyCachedClientsIfNeeded(); 129 updateValidlyCachedClientsIfNeeded();
125 m_validlyCachedClients.remove(client); 130 m_validlyCachedClients.remove(client);
126 } 131 }
127 132
128 void DisplayItemList::invalidateAll() 133 void DisplayItemList::invalidateAll()
129 { 134 {
130 // Can only be called during layout/paintInvalidation, not during painting. 135 // Can only be called during layout/paintInvalidation, not during painting.
131 ASSERT(m_newDisplayItems.isEmpty()); 136 ASSERT(m_newDisplayItems.isEmpty());
132 m_currentDisplayItems.clear(); 137 m_currentDisplayItems.clear();
133 m_validlyCachedClients.clear(); 138 m_validlyCachedClients.clear();
134 m_validlyCachedClientsDirty = false; 139 m_validlyCachedClientsDirty = false;
135 140
136 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali dationObjects) 141 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali dationObjects)
137 m_trackedPaintInvalidationObjects->append("##ALL##"); 142 m_trackedPaintInvalidationObjects->append("##ALL##");
138 } 143 }
139 144
140 bool DisplayItemList::clientCacheIsValid(DisplayItemClient client) const 145 bool DisplayItemList::clientCacheIsValid(DisplayItemClient client) const
141 { 146 {
142 if (skippingCache()) 147 if (skippingCache())
143 return false; 148 return false;
144 updateValidlyCachedClientsIfNeeded(); 149 updateValidlyCachedClientsIfNeeded();
145 return m_validlyCachedClients.contains(client); 150 return m_validlyCachedClients.contains(client);
146 } 151 }
147 152
148 void DisplayItemList::invalidatePaintOffset(const DisplayItemClientWrapper& clie nt) 153 void DisplayItemList::invalidatePaintOffset(const DisplayItemClientWrapper& clie nt)
149 { 154 {
150 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled()); 155 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled());
151 156 invalidateClient(client);
152 updateValidlyCachedClientsIfNeeded();
153 m_validlyCachedClients.remove(client.displayItemClient());
154
155 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali dationObjects)
156 m_trackedPaintInvalidationObjects->append(client.debugName());
157 157
158 #if ENABLE(ASSERT) 158 #if ENABLE(ASSERT)
159 ASSERT(!paintOffsetWasInvalidated(client.displayItemClient()));
159 m_clientsWithPaintOffsetInvalidations.add(client.displayItemClient()); 160 m_clientsWithPaintOffsetInvalidations.add(client.displayItemClient());
160
161 // Ensure no phases slipped in using the old paint offset which would indica te
162 // different phases used different paint offsets, which should not happen.
163 for (const auto& item : m_newDisplayItems)
164 ASSERT(!item.isCached() || item.client() != client.displayItemClient());
165 #endif 161 #endif
166 } 162 }
167 163
168 #if ENABLE(ASSERT) 164 #if ENABLE(ASSERT)
169 bool DisplayItemList::paintOffsetWasInvalidated(DisplayItemClient client) const 165 bool DisplayItemList::paintOffsetWasInvalidated(DisplayItemClient client) const
170 { 166 {
171 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled()); 167 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled());
172 return m_clientsWithPaintOffsetInvalidations.contains(client); 168 return m_clientsWithPaintOffsetInvalidations.contains(client);
173 } 169 }
174 #endif 170 #endif
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 // 259 //
264 void DisplayItemList::commitNewDisplayItems(GraphicsLayer* graphicsLayer) 260 void DisplayItemList::commitNewDisplayItems(GraphicsLayer* graphicsLayer)
265 { 261 {
266 TRACE_EVENT2("blink,benchmark", "DisplayItemList::commitNewDisplayItems", "c urrent_display_list_size", (int)m_currentDisplayItems.size(), 262 TRACE_EVENT2("blink,benchmark", "DisplayItemList::commitNewDisplayItems", "c urrent_display_list_size", (int)m_currentDisplayItems.size(),
267 "num_non_cached_new_items", (int)m_newDisplayItems.size() - m_numCachedI tems); 263 "num_non_cached_new_items", (int)m_newDisplayItems.size() - m_numCachedI tems);
268 264
269 if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { 265 if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) {
270 for (const auto& invalidation : m_invalidations) 266 for (const auto& invalidation : m_invalidations)
271 graphicsLayer->setNeedsDisplayInRect(invalidation.rect, invalidation .invalidationReason); 267 graphicsLayer->setNeedsDisplayInRect(invalidation.rect, invalidation .invalidationReason);
272 m_invalidations.clear(); 268 m_invalidations.clear();
269 m_clientsCheckedPaintInvalidation.clear();
273 } 270 }
274 271
275 // These data structures are used during painting only. 272 // These data structures are used during painting only.
276 ASSERT(m_scopeStack.isEmpty()); 273 ASSERT(m_scopeStack.isEmpty());
277 m_scopeStack.clear(); 274 m_scopeStack.clear();
278 m_nextScope = 1; 275 m_nextScope = 1;
279 ASSERT(!skippingCache()); 276 ASSERT(!skippingCache());
280 #if ENABLE(ASSERT) 277 #if ENABLE(ASSERT)
281 m_newDisplayItemIndicesByClient.clear(); 278 m_newDisplayItemIndicesByClient.clear();
279 m_clientsWithPaintOffsetInvalidations.clear();
282 #endif 280 #endif
283 281
284 if (m_currentDisplayItems.isEmpty()) { 282 if (m_currentDisplayItems.isEmpty()) {
285 #if ENABLE(ASSERT) 283 #if ENABLE(ASSERT)
286 for (const auto& item : m_newDisplayItems) 284 for (const auto& item : m_newDisplayItems)
287 ASSERT(!item.isCached()); 285 ASSERT(!item.isCached());
288 #endif 286 #endif
289 m_currentDisplayItems.swap(m_newDisplayItems); 287 m_currentDisplayItems.swap(m_newDisplayItems);
290 m_validlyCachedClientsDirty = true; 288 m_validlyCachedClientsDirty = true;
291 m_numCachedItems = 0; 289 m_numCachedItems = 0;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 360
363 #if ENABLE(ASSERT) 361 #if ENABLE(ASSERT)
364 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) 362 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled())
365 checkNoRemainingCachedDisplayItems(); 363 checkNoRemainingCachedDisplayItems();
366 #endif // ENABLE(ASSERT) 364 #endif // ENABLE(ASSERT)
367 365
368 m_newDisplayItems.clear(); 366 m_newDisplayItems.clear();
369 m_validlyCachedClientsDirty = true; 367 m_validlyCachedClientsDirty = true;
370 m_currentDisplayItems.swap(updatedList); 368 m_currentDisplayItems.swap(updatedList);
371 m_numCachedItems = 0; 369 m_numCachedItems = 0;
372
373 #if ENABLE(ASSERT)
374 m_clientsWithPaintOffsetInvalidations.clear();
375 #endif
376 } 370 }
377 371
378 size_t DisplayItemList::approximateUnsharedMemoryUsage() const 372 size_t DisplayItemList::approximateUnsharedMemoryUsage() const
379 { 373 {
380 size_t memoryUsage = sizeof(*this); 374 size_t memoryUsage = sizeof(*this);
381 375
382 // Memory outside this class due to m_currentDisplayItems. 376 // Memory outside this class due to m_currentDisplayItems.
383 memoryUsage += m_currentDisplayItems.memoryUsageInBytes(); 377 memoryUsage += m_currentDisplayItems.memoryUsageInBytes();
384 378
385 // TODO(jbroman): If display items begin to have significant external memory 379 // TODO(jbroman): If display items begin to have significant external memory
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 556
563 void DisplayItemList::replay(GraphicsContext& context) 557 void DisplayItemList::replay(GraphicsContext& context)
564 { 558 {
565 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay"); 559 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay");
566 ASSERT(m_newDisplayItems.isEmpty()); 560 ASSERT(m_newDisplayItems.isEmpty());
567 for (DisplayItem& displayItem : m_currentDisplayItems) 561 for (DisplayItem& displayItem : m_currentDisplayItems)
568 displayItem.replay(context); 562 displayItem.replay(context);
569 } 563 }
570 564
571 } // namespace blink 565 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698