void CCVideoLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState) { IntRect quadRect(IntPoint(), bounds()); OwnPtr<CCVideoDrawQuad> videoQuad = CCVideoDrawQuad::create(sharedQuadState, quadRect, m_textures, m_frame, m_format); if (m_format == Extensions3DChromium::GL_TEXTURE_EXTERNAL_OES) videoQuad->setMatrix(m_streamTextureMatrix); quadList.append(videoQuad.release()); }
static inline bool appendQuadInternal(PassOwnPtr<CCDrawQuad> passDrawQuad, const IntRect& culledRect, CCQuadList& quadList, const CCOcclusionTrackerImpl& occlusionTracker, bool createDebugBorderQuads) { OwnPtr<CCDrawQuad> drawQuad(passDrawQuad); bool keepQuad = !culledRect.isEmpty(); if (keepQuad) drawQuad->setQuadVisibleRect(culledRect); occlusionTracker.overdrawMetrics().didCullForDrawing(drawQuad->quadTransform(), drawQuad->quadRect(), culledRect); occlusionTracker.overdrawMetrics().didDraw(drawQuad->quadTransform(), culledRect, drawQuad->opaqueRect()); if (keepQuad) { if (createDebugBorderQuads && !drawQuad->isDebugQuad() && drawQuad->quadVisibleRect() != drawQuad->quadRect()) { SkColor borderColor = SkColorSetARGB(debugTileBorderAlpha, debugTileBorderColorRed, debugTileBorderColorGreen, debugTileBorderColorBlue); quadList.append(CCDebugBorderDrawQuad::create(drawQuad->sharedQuadState(), drawQuad->quadVisibleRect(), borderColor, debugTileBorderWidth)); } // Release the quad after we're done using it. quadList.append(drawQuad.release()); } return keepQuad; }
void CCQuadCuller::cullOccludedQuads(CCQuadList& quadList, bool haveDamageRect, const FloatRect& damageRect, CCOverdrawCounts* overdrawMetrics) { if (!quadList.size()) return; CCQuadList culledList; culledList.reserveCapacity(quadList.size()); Region opaqueCoverageThusFar; for (int i = quadList.size() - 1; i >= 0; --i) { CCDrawQuad* drawQuad = quadList[i].get(); FloatRect floatTransformedRect = drawQuad->quadTransform().mapRect(FloatRect(drawQuad->quadRect())); if (haveDamageRect) floatTransformedRect.intersect(damageRect); // Inflate rect to be tested to stay conservative. IntRect transformedQuadRect(enclosingIntRect(floatTransformedRect)); IntRect transformedVisibleQuadRect = rectSubtractRegion(opaqueCoverageThusFar, transformedQuadRect); bool keepQuad = !transformedVisibleQuadRect.isEmpty(); // See if we can reduce the number of pixels to draw by reducing the size of the draw // quad - we do this by changing its visible rect. bool didReduceQuadSize = false; if (keepQuad) { if (transformedVisibleQuadRect != transformedQuadRect && drawQuad->isLayerAxisAlignedIntRect()) { drawQuad->setQuadVisibleRect(drawQuad->quadTransform().inverse().mapRect(transformedVisibleQuadRect)); didReduceQuadSize = true; } // When adding rect to opaque region, deflate it to stay conservative. if (drawQuad->isLayerAxisAlignedIntRect() && !drawQuad->opaqueRect().isEmpty()) { FloatRect floatOpaqueRect = drawQuad->quadTransform().mapRect(FloatRect(drawQuad->opaqueRect())); opaqueCoverageThusFar.unite(Region(enclosedIntRect(floatOpaqueRect))); } culledList.append(quadList[i].release()); } if (overdrawMetrics) { TRACE_EVENT("CCQuadCuller::cullOccludedQuads_OverdrawMetrics", 0, 0); // We compute the area of the transformed quad, as this should be in pixels. float area = quadArea(drawQuad->quadTransform().mapQuad(FloatQuad(drawQuad->quadRect()))); if (keepQuad) { if (didReduceQuadSize) { float visibleQuadRectArea = quadArea(drawQuad->quadTransform().mapQuad(FloatQuad(drawQuad->quadVisibleRect()))); overdrawMetrics->m_pixelsCulled += area - visibleQuadRectArea; area = visibleQuadRectArea; } IntRect visibleOpaqueRect(drawQuad->quadVisibleRect()); visibleOpaqueRect.intersect(drawQuad->opaqueRect()); FloatQuad visibleOpaqueQuad = drawQuad->quadTransform().mapQuad(FloatQuad(visibleOpaqueRect)); float opaqueArea = quadArea(visibleOpaqueQuad); overdrawMetrics->m_pixelsDrawnOpaque += opaqueArea; overdrawMetrics->m_pixelsDrawnTransparent += area - opaqueArea; } else overdrawMetrics->m_pixelsCulled += area; } } quadList.clear(); // Release anything that remains. culledList.reverse(); quadList.swap(culledList); }