Changeset 98757 in webkit
- Timestamp:
- Oct 28, 2011, 1:44:58 PM (15 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
platform/graphics/chromium/LayerRendererChromium.cpp (modified) (1 diff)
-
platform/graphics/chromium/cc/CCLayerTreeHost.cpp (modified) (2 diffs)
-
platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r98755 r98757 1 2011-10-28 Adrienne Walker <enne@google.com> 2 3 [chromium] Implicitly skip render surfaces that won't be drawn 4 https://bugs.webkit.org/show_bug.cgi?id=71038 5 6 Rather than having redundant checks in three places for how to walk 7 through a render surface list, instead don't add render surfaces that 8 don't need to get rendered to the render surface list. 9 10 Reviewed by James Robinson. 11 12 Covered by existing layout tests. 13 14 * platform/graphics/chromium/LayerRendererChromium.cpp: 15 (WebCore::LayerRendererChromium::drawLayersOntoRenderSurfaces): 16 * platform/graphics/chromium/cc/CCLayerTreeHost.cpp: 17 (WebCore::CCLayerTreeHost::paintLayerContents): 18 (WebCore::CCLayerTreeHost::updateCompositorResources): 19 * platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp: 20 (WebCore::calculateDrawTransformsAndVisibilityInternal): 21 1 22 2011-10-28 Adam Barth <abarth@webkit.org> 2 23 -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
r98567 r98757 313 313 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); 314 314 ASSERT(renderSurface); 315 316 renderSurface->setSkipsDraw(true); 317 318 if (!renderSurface->layerList().size()) 319 continue; 320 321 // Skip completely transparent render surfaces. 322 if (!renderSurface->drawOpacity()) 323 continue; 315 ASSERT(renderSurface->layerList().size()); 316 ASSERT(renderSurface->drawOpacity()); 324 317 325 318 if (useRenderSurface(renderSurface)) { 326 renderSurface->setSkipsDraw(false);327 328 319 if (renderSurfaceLayer != rootDrawLayer) { 329 320 GLC(m_context.get(), m_context->disable(GraphicsContext3D::SCISSOR_TEST)); -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp
r98471 r98757 331 331 RenderSurfaceChromium* renderSurface = renderSurfaceLayer->renderSurface(); 332 332 ASSERT(renderSurface); 333 334 // Render surfaces whose drawable area has zero width or height 335 // will have no layers associated with them and should be skipped. 336 if (!renderSurface->layerList().size()) 337 continue; 338 339 if (!renderSurface->drawOpacity()) 340 continue; 333 ASSERT(renderSurface->layerList().size()); 334 ASSERT(renderSurface->drawOpacity()); 341 335 342 336 renderSurfaceLayer->setLayerTreeHost(this); … … 371 365 RenderSurfaceChromium* renderSurface = renderSurfaceLayer->renderSurface(); 372 366 ASSERT(renderSurface); 373 374 if (!renderSurface->layerList().size() || !renderSurface->drawOpacity()) 375 continue; 367 ASSERT(renderSurface->layerList().size()); 368 ASSERT(renderSurface->drawOpacity()); 376 369 377 370 if (renderSurfaceLayer->maskLayer()) -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp
r98313 r98757 233 233 bool useSurfaceForFlatDescendants = layer->parent() && layer->parent()->preserves3D() && !layer->preserves3D() && layer->descendantDrawsContent(); 234 234 if (useSurfaceForMasking || useSurfaceForReflection || useSurfaceForFlatDescendants || ((useSurfaceForClipping || useSurfaceForOpacity) && layer->descendantDrawsContent())) { 235 // Layer's opacity will be applied when drawing the render surface. 236 float drawOpacity = layer->opacity(); 237 if (layer->parent() && layer->parent()->preserves3D()) 238 drawOpacity *= layer->parent()->drawOpacity(); 239 240 // If this render surface isn't drawn, we can also skip its children. 241 if (!drawOpacity) 242 return; 243 235 244 if (!layer->renderSurface()) 236 245 layer->createRenderSurface(); 246 237 247 RenderSurfaceType* renderSurface = layer->renderSurface(); 248 renderSurface->clearLayerList(); 238 249 239 250 // The origin of the new surface is the upper left corner of the layer. … … 244 255 transformedLayerRect = IntRect(0, 0, bounds.width(), bounds.height()); 245 256 246 // Layer's opacity will be applied when drawing the render surface.247 float drawOpacity = layer->opacity();248 if (layer->parent() && layer->parent()->preserves3D())249 drawOpacity *= layer->parent()->drawOpacity();250 257 renderSurface->setDrawOpacity(drawOpacity); 251 258 layer->setDrawOpacity(1); … … 262 269 // surface and is therefore expressed in the parent's coordinate system. 263 270 renderSurface->setScissorRect(layer->parent() ? layer->parent()->scissorRect() : layer->scissorRect()); 264 265 renderSurface->clearLayerList();266 271 267 272 if (layer->maskLayer()) { … … 372 377 } 373 378 379 if (layer->renderSurface() && !layer->renderSurface()->layerList().size()) { 380 // If a render surface has no layer list, then it and none of its 381 // children needed to get drawn. Therefore, it should be the last layer 382 // in the render surface list and we can trivially remove it. 383 ASSERT(renderSurfaceLayerList.last() == layer); 384 renderSurfaceLayerList.removeLast(); 385 layer->clearRenderSurface(); 386 return; 387 } 388 389 // If neither this layer nor any of its children were added, early out. 390 if (sortingStartIndex == descendants.size()) 391 return; 392 374 393 if (layer->masksToBounds() || useSurfaceForMasking) { 375 394 IntRect drawableContentRect = layer->drawableContentRect();
Note:
See TracChangeset
for help on using the changeset viewer.