@ -157,7 +157,10 @@ void Compositor::composite(RenderLoop *renderLoop)
if ( superLayer - > needsRepaint ( ) ) {
renderLoop - > beginPaint ( ) ;
prePaintPass ( superLayer ) ;
QRegion surfaceDamage = primaryLayer - > repaints ( ) ;
primaryLayer - > resetRepaints ( ) ;
prePaintPass ( superLayer , & surfaceDamage ) ;
SurfaceItem * scanoutCandidate = superLayer - > delegate ( ) - > scanoutCandidate ( ) ;
renderLoop - > setFullscreenSurface ( scanoutCandidate ) ;
@ -175,10 +178,6 @@ void Compositor::composite(RenderLoop *renderLoop)
}
if ( ! directScanout ) {
QRegion surfaceDamage = primaryLayer - > repaints ( ) ;
primaryLayer - > resetRepaints ( ) ;
preparePaintPass ( superLayer , & surfaceDamage ) ;
if ( auto beginInfo = primaryLayer - > beginFrame ( ) ) {
auto & [ renderTarget , repaint ] = beginInfo . value ( ) ;
@ -219,33 +218,33 @@ void Compositor::framePass(RenderLayer *layer)
}
}
void Compositor : : prePaintPass ( RenderLayer * layer )
void Compositor : : prePaintPass ( RenderLayer * layer , QRegion * damage )
{
layer - > delegate ( ) - > prePaint ( ) ;
const auto sublayers = layer - > sublayers ( ) ;
for ( RenderLayer * sublayer : sublayers ) {
prePaintPass ( sublayer ) ;
if ( const QRegion repaints = layer - > repaints ( ) ; ! repaints . isEmpty ( ) ) {
* damage + = layer - > mapToGlobal ( repaints ) ;
layer - > resetRepaints ( ) ;
}
const QRegion repaints = layer - > delegate ( ) - > prePaint ( ) ;
if ( ! repaints . isEmpty ( ) ) {
* damage + = layer - > mapToGlobal ( repaints ) ;
}
}
void Compositor : : postPaintPass ( RenderLayer * layer )
{
layer - > delegate ( ) - > postPaint ( ) ;
const auto sublayers = layer - > sublayers ( ) ;
for ( RenderLayer * sublayer : sublayers ) {
postPaintPass ( sublayer ) ;
if ( sublayer - > isVisible ( ) ) {
prePaintPass ( sublayer , damage ) ;
}
}
}
void Compositor : : p repare PaintPass( RenderLayer * layer , QRegion * repaint )
void Compositor : : p ost PaintPass( RenderLayer * layer )
{
// TODO: Cull opaque region.
* repaint + = layer - > mapToGlobal ( layer - > repaints ( ) + layer - > delegate ( ) - > repaints ( ) ) ;
layer - > resetRepaints ( ) ;
layer - > delegate ( ) - > postPaint ( ) ;
const auto sublayers = layer - > sublayers ( ) ;
for ( RenderLayer * sublayer : sublayers ) {
if ( sublayer - > isVisible ( ) ) {
p reparePaintPass( sublayer , repaint ) ;
p ostPaintPass( sublayer ) ;
}
}
}