Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad8b5674 authored by Alec Mouri's avatar Alec Mouri
Browse files

Add moving layer CUJ for caching

* 16 static background layers
* 1 translating layer

Bug: 405591499
Flag: EXEMPT test only
Test: run apk
Change-Id: Id33b11cebd1f658a1f574e5453de27200344c960
parent dea98122
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@

        <activity android:name=".activities.BlurOnOffActivity" />
        <activity android:name=".activities.BlurRegionActivity" />
        <activity android:name=".activities.MovingLayerActivity" />
        <activity android:name=".activities.TrivialActivity" />

    </application>
+3 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.widget.TextView
import androidx.activity.ComponentActivity
import com.android.test.transactionflinger.activities.BlurOnOffActivity
import com.android.test.transactionflinger.activities.BlurRegionActivity
import com.android.test.transactionflinger.activities.MovingLayerActivity
import com.android.test.transactionflinger.activities.TrivialActivity
import kotlin.reflect.KClass

@@ -44,7 +45,8 @@ private val AllDemos = listOf(
        "Workloads", listOf(
            Demo("TrivialActivity", TrivialActivity::class),
            Demo("BlurOnOffActivity", BlurOnOffActivity::class),
            Demo("BlurRegionActivity", BlurRegionActivity::class)
            Demo("BlurRegionActivity", BlurRegionActivity::class),
            Demo("MovingLayerActivity", MovingLayerActivity::class)
        )
    )
)
+31 −8
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.test.transactionflinger

import android.graphics.Color
import android.graphics.ColorSpace
import android.graphics.HardwareBufferRenderer
import android.graphics.Paint
@@ -73,15 +74,18 @@ class Scene {
        return scene
    }

    fun externalScene(sceneFunctor: () -> Scene): Scene {
        val scene = sceneFunctor()
        children.add(scene)
        return scene
    }

    fun content(draw: Scene.(Choreographer.FrameData, Int, Int) -> RenderNode?) {
        drawFunctor = draw
    }

    fun drawAndSubmit(data: Choreographer.FrameData, width: Int, height: Int) {
        val transaction = SurfaceControl.Transaction()
        synchronized(transaction) {
            transaction.setVisibility(surfaceControl, true)
        }
        onDraw(data, transaction, width, height).get()
        synchronized(transaction) {
            transaction.apply()
@@ -110,14 +114,13 @@ class Scene {
        parentWidth: Int,
        parentHeight: Int
    ): CompletableFuture<Void> {
        val physicalX = (parentWidth * x).toFloat()
        val physicalY = (parentHeight * y).toFloat()
        if (startTime == 0L) {
            startTime = data.preferredFrameTimeline.deadlineNanos
            synchronized(transaction) {
                transaction.setPosition(
                    surfaceControl,
                    (parentWidth * x).toFloat(),
                    (parentHeight * y).toFloat()
                )
                transaction.setPosition(surfaceControl, physicalX, physicalY)
                transaction.setVisibility(surfaceControl, true)
                for (child in children) {
                    transaction.reparent(child.surfaceControl, surfaceControl)
                }
@@ -132,6 +135,7 @@ class Scene {
                    surfaceControl,
                    arrayOf(getBlurRegion(parentWidth, parentHeight))
                )
                transaction.setPosition(surfaceControl, physicalX, physicalY)
            }
        }

@@ -203,3 +207,22 @@ fun scene(init: Scene.() -> Unit): Scene {
    scene.init()
    return scene
}

fun checkerboardScene(rows: Int, columns: Int): Scene {
    return scene {
        for (row in 0 until rows) {
            for (column in 0 until columns) {
                scene {
                    content { data, width, height ->
                        val color = if ((row + column) % 2 == 0) Color.BLACK else Color.WHITE
                        drawColor(color, data, width, height)
                    }
                    x = row.toDouble() / rows
                    y = column.toDouble() / columns
                    width = 1.0 / rows
                    height = 1.0 / columns
                }
            }
        }
    }
}
 No newline at end of file
+3 −35
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.test.transactionflinger.activities

import android.graphics.Color
import com.android.test.transactionflinger.Scene
import com.android.test.transactionflinger.checkerboardScene
import com.android.test.transactionflinger.scene
import kotlin.time.Duration.Companion.nanoseconds
import kotlin.time.Duration.Companion.seconds
@@ -29,41 +30,8 @@ class BlurOnOffActivity : SceneActivity() {

    override fun obtainScene(): Scene {
        return scene {
            scene {
                content { data, width, height ->
                    drawColor(Color.BLACK, data, width, height)
                }
                x = 0.0
                y = 0.0
                width = 0.5
                height = 0.5
            }
            scene {
                content { data, width, height ->
                    drawColor(Color.WHITE, data, width, height)
                }
                x = 0.0
                y = 0.0
                width = 0.5
                height = 0.5
            }
            scene {
                content { data, width, height ->
                    drawColor(Color.WHITE, data, width, height)
                }
                x = 0.5
                y = 0.0
                width = 0.5
                height = 0.5
            }
            scene {
                content { data, width, height ->
                    drawColor(Color.BLACK, data, width, height)
                }
                x = 0.5
                y = 0.5
                width = 0.5
                height = 0.5
            externalScene {
                checkerboardScene(2, 2)
            }
            scene {
                content { data, width, height ->
+58 −0
Original line number Diff line number Diff line
/*
 * Copyright 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
0 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.test.transactionflinger.activities

import android.graphics.Color
import com.android.test.transactionflinger.Scene
import com.android.test.transactionflinger.checkerboardScene
import com.android.test.transactionflinger.scene
import kotlin.time.Duration.Companion.nanoseconds
import kotlin.time.Duration.Companion.seconds

/**
 * A scene that draws translates an animating layer on top of a 4x4 checkerboard.
 */
class MovingLayerActivity : SceneActivity() {

    override fun obtainScene(): Scene {
        return scene {
            externalScene {
                checkerboardScene(4, 4)
            }
            scene {
                content { data, width, height ->
                    drawColor(Color.MAGENTA, data, width, height)
                }
                properties { data ->
                    val animationTime =
                        ((data.preferredFrameTimeline.deadlineNanos - startTime) % 2.seconds.inWholeNanoseconds).nanoseconds

                    val translation = if (animationTime < 1.seconds) {
                        (animationTime.inWholeMilliseconds.toDouble() / 1.seconds.inWholeMilliseconds) * 0.5
                    } else {
                        ((2.seconds - animationTime).inWholeMilliseconds.toDouble() / 1.seconds.inWholeMilliseconds) * 0.5
                    }

                    x = translation
                    y = translation
                }
                width = 0.5
                height = 0.5
            }
        }
    }
}
 No newline at end of file