diff --git a/tests/SurfaceViewBufferTests/OWNERS b/tests/SurfaceViewBufferTests/OWNERS new file mode 100644 index 0000000000000..d50528c237ff9 --- /dev/null +++ b/tests/SurfaceViewBufferTests/OWNERS @@ -0,0 +1 @@ +include /services/core/java/com/android/server/wm/OWNERS \ No newline at end of file diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/BufferPresentationTests.kt b/tests/SurfaceViewBufferTests/src/com/android/test/BufferPresentationTests.kt index eb16bad81d190..7d278dc8acc0a 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/BufferPresentationTests.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/BufferPresentationTests.kt @@ -27,12 +27,13 @@ class BufferPresentationTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase @Test fun testQueueBuffers() { val numFrames = 100L - val trace = withTrace { + val trace = withTrace { activity -> for (i in 1..numFrames) { - it.mSurfaceProxy.ANativeWindowLock() - it.mSurfaceProxy.ANativeWindowUnlockAndPost() + activity.mSurfaceProxy.ANativeWindowLock() + activity.mSurfaceProxy.ANativeWindowUnlockAndPost() } - assertEquals(0, it.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, + 1000 /* ms */)) } assertThat(trace).hasFrameSequence("SurfaceView", 1..numFrames) @@ -40,13 +41,13 @@ class BufferPresentationTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase @Test fun testSetBufferScalingMode_outOfOrderQueueBuffer() { - val trace = withTrace { - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + val trace = withTrace { activity -> + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) - it.mSurfaceProxy.SurfaceQueueBuffer(1) - it.mSurfaceProxy.SurfaceQueueBuffer(0) - assertEquals(0, it.mSurfaceProxy.waitUntilBufferDisplayed(2, 5000 /* ms */)) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + assertEquals(0, activity.mSurfaceProxy.waitUntilBufferDisplayed(2, 5000 /* ms */)) } assertThat(trace).hasFrameSequence("SurfaceView", 1..2L) @@ -55,15 +56,16 @@ class BufferPresentationTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase @Test fun testSetBufferScalingMode_multipleDequeueBuffer() { val numFrames = 20L - val trace = withTrace { + val trace = withTrace { activity -> for (count in 1..(numFrames / 2)) { - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) - it.mSurfaceProxy.SurfaceQueueBuffer(0) - it.mSurfaceProxy.SurfaceQueueBuffer(1) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) } - assertEquals(0, it.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, 5000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, + 5000 /* ms */)) } assertThat(trace).hasFrameSequence("SurfaceView", 1..numFrames) @@ -73,19 +75,20 @@ class BufferPresentationTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase fun testSetBufferCount_queueMaxBufferCountMinusOne() { val numBufferCount = 8 val numFrames = numBufferCount * 5L - val trace = withTrace { - assertEquals(0, it.mSurfaceProxy.NativeWindowSetBufferCount(numBufferCount + 1)) + val trace = withTrace { activity -> + assertEquals(0, activity.mSurfaceProxy.NativeWindowSetBufferCount(numBufferCount + 1)) for (i in 1..numFrames / numBufferCount) { for (bufferSlot in 0..numBufferCount - 1) { assertEquals(0, - it.mSurfaceProxy.SurfaceDequeueBuffer(bufferSlot, 1000 /* ms */)) + activity.mSurfaceProxy.SurfaceDequeueBuffer(bufferSlot, 1000 /* ms */)) } for (bufferSlot in 0..numBufferCount - 1) { - it.mSurfaceProxy.SurfaceQueueBuffer(bufferSlot) + activity.mSurfaceProxy.SurfaceQueueBuffer(bufferSlot) } } - assertEquals(0, it.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, 5000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, + 5000 /* ms */)) } assertThat(trace).hasFrameSequence("SurfaceView", 1..numFrames) diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/BufferRejectionTests.kt b/tests/SurfaceViewBufferTests/src/com/android/test/BufferRejectionTests.kt index 95a7fd5b7a39c..e9e0246a207d6 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/BufferRejectionTests.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/BufferRejectionTests.kt @@ -28,20 +28,21 @@ import org.junit.runners.Parameterized class BufferRejectionTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastAdapter) { @Test fun testSetBuffersGeometry_0x0_rejectsBuffer() { - val trace = withTrace { - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, 100, 100, + val trace = withTrace { activity -> + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, 100, 100, + R8G8B8A8_UNORM) + activity.mSurfaceProxy.ANativeWindowLock() + activity.mSurfaceProxy.ANativeWindowUnlockAndPost() + activity.mSurfaceProxy.ANativeWindowLock() + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, 0, 0, R8G8B8A8_UNORM) - it.mSurfaceProxy.ANativeWindowLock() - it.mSurfaceProxy.ANativeWindowUnlockAndPost() - it.mSurfaceProxy.ANativeWindowLock() - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, 0, 0, R8G8B8A8_UNORM) // Submit buffer one with a different size which should be rejected - it.mSurfaceProxy.ANativeWindowUnlockAndPost() + activity.mSurfaceProxy.ANativeWindowUnlockAndPost() // submit a buffer with the default buffer size - it.mSurfaceProxy.ANativeWindowLock() - it.mSurfaceProxy.ANativeWindowUnlockAndPost() - it.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */) + activity.mSurfaceProxy.ANativeWindowLock() + activity.mSurfaceProxy.ANativeWindowUnlockAndPost() + activity.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */) } // Verify we reject buffers since scaling mode == NATIVE_WINDOW_SCALING_MODE_FREEZE assertThat(trace).layer("SurfaceView", 2).doesNotExist() @@ -61,22 +62,22 @@ class BufferRejectionTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(us @Test fun testSetBufferScalingMode_freeze() { val bufferSize = Point(300, 200) - val trace = withTrace { - it.drawFrame() - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, bufferSize, + val trace = withTrace { activity -> + activity.drawFrame() + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, bufferSize, R8G8B8A8_UNORM) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) // Change buffer size and set scaling mode to freeze - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, Point(0, 0), + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, Point(0, 0), R8G8B8A8_UNORM) // first dequeued buffer does not have the new size so it should be rejected. - it.mSurfaceProxy.SurfaceQueueBuffer(0) - it.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) - it.mSurfaceProxy.SurfaceQueueBuffer(1) - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) } // verify buffer size is reset to default buffer size @@ -88,23 +89,23 @@ class BufferRejectionTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(us @Test fun testSetBufferScalingMode_freeze_withBufferRotation() { val rotatedBufferSize = Point(defaultBufferSize.y, defaultBufferSize.x) - val trace = withTrace { - it.drawFrame() - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, rotatedBufferSize, - R8G8B8A8_UNORM) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + val trace = withTrace { activity -> + activity.drawFrame() + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, + rotatedBufferSize, R8G8B8A8_UNORM) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) // Change buffer size and set scaling mode to freeze - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, Point(0, 0), + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, Point(0, 0), R8G8B8A8_UNORM) // first dequeued buffer does not have the new size so it should be rejected. - it.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) // add a buffer transform so the buffer size is correct. - it.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.ROT_90) - it.mSurfaceProxy.SurfaceQueueBuffer(1) - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) + activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.ROT_90) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) } // verify buffer size is reset to default buffer size @@ -117,24 +118,24 @@ class BufferRejectionTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(us @Test fun testRejectedBuffersAreReleased() { val bufferSize = Point(300, 200) - val trace = withTrace { + val trace = withTrace { activity -> for (count in 0 until 5) { - it.drawFrame() - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed((count * 3) + 1L, + activity.drawFrame() + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed((count * 3) + 1L, 500 /* ms */), 0) - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, bufferSize, - R8G8B8A8_UNORM) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, + bufferSize, R8G8B8A8_UNORM) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) // Change buffer size and set scaling mode to freeze - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, Point(0, 0), - R8G8B8A8_UNORM) + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, + Point(0, 0), R8G8B8A8_UNORM) // first dequeued buffer does not have the new size so it should be rejected. - it.mSurfaceProxy.SurfaceQueueBuffer(0) - it.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) - it.mSurfaceProxy.SurfaceQueueBuffer(1) - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed((count * 3) + 3L, + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed((count * 3) + 3L, 500 /* ms */), 0) } } diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/GeometryTests.kt b/tests/SurfaceViewBufferTests/src/com/android/test/GeometryTests.kt index 03f8c05346b70..0802990beeabd 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/GeometryTests.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/GeometryTests.kt @@ -15,25 +15,31 @@ */ package com.android.test +import android.graphics.Color import android.graphics.Point +import android.graphics.Rect +import android.os.SystemClock import com.android.server.wm.flicker.traces.layers.LayersTraceSubject.Companion.assertThat import com.android.test.SurfaceViewBufferTestBase.Companion.ScalingMode import com.android.test.SurfaceViewBufferTestBase.Companion.Transform import junit.framework.Assert.assertEquals +import junit.framework.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit @RunWith(Parameterized::class) class GeometryTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastAdapter) { @Test fun testSetBuffersGeometry_0x0_resetsBufferSize() { - val trace = withTrace { - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, 0, 0, + val trace = withTrace { activity -> + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, 0, 0, R8G8B8A8_UNORM) - it.mSurfaceProxy.ANativeWindowLock() - it.mSurfaceProxy.ANativeWindowUnlockAndPost() - it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) + activity.mSurfaceProxy.ANativeWindowLock() + activity.mSurfaceProxy.ANativeWindowUnlockAndPost() + activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) } // verify buffer size is reset to default buffer size @@ -43,11 +49,11 @@ class GeometryTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastA @Test fun testSetBuffersGeometry_smallerThanBuffer() { val bufferSize = Point(300, 200) - val trace = withTrace { - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, bufferSize, + val trace = withTrace { activity -> + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, bufferSize, R8G8B8A8_UNORM) - it.drawFrame() - it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) + activity.drawFrame() + activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) } assertThat(trace).layer("SurfaceView", 1).also { @@ -60,11 +66,11 @@ class GeometryTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastA @Test fun testSetBuffersGeometry_largerThanBuffer() { val bufferSize = Point(3000, 2000) - val trace = withTrace { - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, bufferSize, + val trace = withTrace { activity -> + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, bufferSize, R8G8B8A8_UNORM) - it.drawFrame() - it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) + activity.drawFrame() + activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) } assertThat(trace).layer("SurfaceView", 1).also { @@ -77,22 +83,22 @@ class GeometryTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastA @Test fun testSetBufferScalingMode_freeze() { val bufferSize = Point(300, 200) - val trace = withTrace { - it.drawFrame() - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, bufferSize, + val trace = withTrace { activity -> + activity.drawFrame() + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, bufferSize, R8G8B8A8_UNORM) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) // Change buffer size and set scaling mode to freeze - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, Point(0, 0), + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, Point(0, 0), R8G8B8A8_UNORM) // first dequeued buffer does not have the new size so it should be rejected. - it.mSurfaceProxy.SurfaceQueueBuffer(0) - it.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) - it.mSurfaceProxy.SurfaceQueueBuffer(1) - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) } // verify buffer size is reset to default buffer size @@ -105,11 +111,11 @@ class GeometryTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastA fun testSetBuffersTransform_FLIP() { val transforms = arrayOf(Transform.FLIP_H, Transform.FLIP_V, Transform.ROT_180).withIndex() for ((index, transform) in transforms) { - val trace = withTrace { - it.mSurfaceProxy.ANativeWindowSetBuffersTransform(transform) - it.mSurfaceProxy.ANativeWindowLock() - it.mSurfaceProxy.ANativeWindowUnlockAndPost() - it.mSurfaceProxy.waitUntilBufferDisplayed(index + 1L, 500 /* ms */) + val trace = withTrace { activity -> + activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(transform) + activity.mSurfaceProxy.ANativeWindowLock() + activity.mSurfaceProxy.ANativeWindowUnlockAndPost() + activity.mSurfaceProxy.waitUntilBufferDisplayed(index + 1L, 500 /* ms */) } assertThat(trace).layer("SurfaceView", index + 1L).also { @@ -119,4 +125,100 @@ class GeometryTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(useBlastA } } } + + @Test + fun testSurfaceViewResizeImmediatelyWithNonFreezeScaling() { + val surfaceViewPosition = Rect() + var trace = withTrace { activity -> + activity.mSurfaceProxy.SurfaceSetScalingMode(ScalingMode.SCALE_TO_WINDOW) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1 /* ms */)) + activity.mSurfaceProxy.drawBuffer(0, Color.BLUE) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) + activity.mSurfaceView!!.getBoundsOnScreen(surfaceViewPosition) + } + + runOnUiThread { + val svBounds = Rect(0, 0, defaultBufferSize.x, defaultBufferSize.y) + svBounds.offsetTo(surfaceViewPosition.left, surfaceViewPosition.top) + checkPixels(svBounds, Color.BLUE) + } + + // check that the layer and buffer starts with the default size + assertThat(trace).layer("SurfaceView", 1).also { + it.hasBufferSize(defaultBufferSize) + it.hasLayerSize(defaultBufferSize) + } + val newSize = Point(1280, 960) + lateinit var resizeCountDownLatch: CountDownLatch + runOnUiThread { + resizeCountDownLatch = it.resizeSurfaceView(newSize) + } + assertTrue(resizeCountDownLatch.await(1000, TimeUnit.MILLISECONDS)) + // wait for sf to handle the resize transaction request + SystemClock.sleep(500) + trace = withTrace { _ -> + // take a trace with the new size + } + + // check that the layer size has changed and the buffer is now streched to the new layer + // size + runOnUiThread { + val svBounds = Rect(0, 0, newSize.x, newSize.y) + svBounds.offsetTo(surfaceViewPosition.left, surfaceViewPosition.top) + checkPixels(svBounds, Color.BLUE) + } + + assertThat(trace).layer("SurfaceView", 1).also { + it.hasLayerSize(newSize) + it.hasBufferSize(defaultBufferSize) + } + } + + @Test + fun testSurfaceViewDoesNotResizeWithDefaultScaling() { + val surfaceViewPosition = Rect() + var trace = withTrace { activity -> + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1 /* ms */)) + activity.mSurfaceProxy.drawBuffer(0, Color.BLUE) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */) + activity.mSurfaceView!!.getBoundsOnScreen(surfaceViewPosition) + } + + runOnUiThread { + val svBounds = Rect(0, 0, defaultBufferSize.x, defaultBufferSize.y) + svBounds.offsetTo(surfaceViewPosition.left, surfaceViewPosition.top) + checkPixels(svBounds, Color.BLUE) + } + + // check that the layer and buffer starts with the default size + assertThat(trace).layer("SurfaceView", 1).also { + it.hasBufferSize(defaultBufferSize) + it.hasLayerSize(defaultBufferSize) + } + val newSize = Point(1280, 960) + lateinit var resizeCountDownLatch: CountDownLatch + runOnUiThread { + resizeCountDownLatch = it.resizeSurfaceView(newSize) + } + assertTrue(resizeCountDownLatch.await(1000, TimeUnit.MILLISECONDS)) + // wait for sf to handle the resize transaction request + SystemClock.sleep(500) + trace = withTrace { _ -> + // take a trace after the size change + } + + // check the layer and buffer remains the same size + runOnUiThread { + val svBounds = Rect(0, 0, defaultBufferSize.x, defaultBufferSize.y) + svBounds.offsetTo(surfaceViewPosition.left, surfaceViewPosition.top) + checkPixels(svBounds, Color.BLUE) + } + + assertThat(trace).layer("SurfaceView", 1).also { + it.hasLayerSize(defaultBufferSize) + it.hasBufferSize(defaultBufferSize) + } + } } \ No newline at end of file diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/InverseDisplayTransformTests.kt b/tests/SurfaceViewBufferTests/src/com/android/test/InverseDisplayTransformTests.kt index eac30417dfaef..69012bdd7d7c9 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/InverseDisplayTransformTests.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/InverseDisplayTransformTests.kt @@ -44,28 +44,28 @@ class InverseDisplayTransformTests(useBlastAdapter: Boolean) : "fixed scaling mode.", useBlastAdapter) val rotatedBufferSize = Point(defaultBufferSize.y, defaultBufferSize.x) - val trace = withTrace { + val trace = withTrace { activity -> // Inverse display transforms are sticky AND they are only consumed by the sf after // a valid buffer has been acquired. - it.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.INVERSE_DISPLAY.value) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - it.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.INVERSE_DISPLAY.value) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, rotatedBufferSize, - R8G8B8A8_UNORM) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, + rotatedBufferSize, R8G8B8A8_UNORM) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) // Change buffer size and set scaling mode to freeze - it.mSurfaceProxy.ANativeWindowSetBuffersGeometry(it.surface!!, Point(0, 0), + activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, Point(0, 0), R8G8B8A8_UNORM) // first dequeued buffer does not have the new size so it should be rejected. - it.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.ROT_90.value) - it.mSurfaceProxy.SurfaceQueueBuffer(0) - it.mSurfaceProxy.ANativeWindowSetBuffersTransform(0) - it.mSurfaceProxy.SurfaceQueueBuffer(1) - assertEquals(it.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) + activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.ROT_90.value) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(0) + activity.mSurfaceProxy.SurfaceQueueBuffer(1) + assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) } // verify buffer size is reset to default buffer size diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/MainActivity.kt b/tests/SurfaceViewBufferTests/src/com/android/test/MainActivity.kt index ed79054409eaa..5f398f380b013 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/MainActivity.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/MainActivity.kt @@ -40,12 +40,12 @@ class MainActivity : CapturedActivity() { private var mSurfaceHolder: SurfaceHolder? = null private val mDrawLock = ReentrantLock() var mSurfaceView: SurfaceView? = null + private var mCountDownLatch: CountDownLatch? = null val surface: Surface? get() = mSurfaceHolder?.surface override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - addSurfaceView(Point(500, 200)) window.decorView.apply { systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN @@ -60,13 +60,23 @@ class MainActivity : CapturedActivity() { val layout = findViewById(android.R.id.content) val surfaceReadyLatch = CountDownLatch(1) mSurfaceView = createSurfaceView(applicationContext, size, surfaceReadyLatch) - layout.addView(mSurfaceView!!, + layout!!.addView(mSurfaceView!!, FrameLayout.LayoutParams(size.x, size.y, Gravity.TOP or Gravity.LEFT) .also { it.setMargins(100, 100, 0, 0) }) return surfaceReadyLatch } + fun resizeSurfaceView(size: Point): CountDownLatch { + mCountDownLatch = CountDownLatch(1) + mSurfaceView!!.layoutParams.also { + it.width = size.x + it.height = size.y + } + mSurfaceView!!.requestLayout() + return mCountDownLatch!! + } + fun enableSeamlessRotation() { val p: WindowManager.LayoutParams = window.attributes p.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS @@ -88,7 +98,6 @@ class MainActivity : CapturedActivity() { ): SurfaceView { val surfaceView = SurfaceView(context) surfaceView.setWillNotDraw(false) - surfaceView.holder.setFixedSize(size.x, size.y) surfaceView.holder.addCallback(object : SurfaceHolder.Callback { override fun surfaceCreated(holder: SurfaceHolder) { mDrawLock.withLock { @@ -104,6 +113,7 @@ class MainActivity : CapturedActivity() { width: Int, height: Int ) { + mCountDownLatch?.countDown() } override fun surfaceDestroyed(holder: SurfaceHolder) { diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/SharedBufferModeTests.kt b/tests/SurfaceViewBufferTests/src/com/android/test/SharedBufferModeTests.kt index ae662506bc77c..ee41d79414701 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/SharedBufferModeTests.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/SharedBufferModeTests.kt @@ -30,12 +30,12 @@ class SharedBufferModeTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(u @Test fun testCanPresentBuffers() { val numFrames = 15L - val trace = withTrace { - assertEquals(0, it.mSurfaceProxy.NativeWindowSetSharedBufferMode(true)) + val trace = withTrace { activity -> + assertEquals(0, activity.mSurfaceProxy.NativeWindowSetSharedBufferMode(true)) for (i in 1..numFrames) { - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1 /* ms */)) - it.mSurfaceProxy.SurfaceQueueBuffer(0) - assertEquals(0, it.mSurfaceProxy.waitUntilBufferDisplayed(i, 5000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1 /* ms */)) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) + assertEquals(0, activity.mSurfaceProxy.waitUntilBufferDisplayed(i, 5000 /* ms */)) } } @@ -47,13 +47,14 @@ class SharedBufferModeTests(useBlastAdapter: Boolean) : SurfaceTracingTestBase(u @Test fun testFastQueueBuffers() { val numFrames = 15L - val trace = withTrace { - assertEquals(0, it.mSurfaceProxy.NativeWindowSetSharedBufferMode(true)) + val trace = withTrace { activity -> + assertEquals(0, activity.mSurfaceProxy.NativeWindowSetSharedBufferMode(true)) for (i in 1..numFrames) { - assertEquals(0, it.mSurfaceProxy.SurfaceDequeueBuffer(0, 1 /* ms */)) - it.mSurfaceProxy.SurfaceQueueBuffer(0) + assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1 /* ms */)) + activity.mSurfaceProxy.SurfaceQueueBuffer(0) } - assertEquals(0, it.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, 5000 /* ms */)) + assertEquals(0, activity.mSurfaceProxy.waitUntilBufferDisplayed(numFrames, + 5000 /* ms */)) } assertThat(trace).hasFrameSequence("SurfaceView", numFrames..numFrames) diff --git a/tests/SurfaceViewBufferTests/src/com/android/test/SurfaceTracingTestBase.kt b/tests/SurfaceViewBufferTests/src/com/android/test/SurfaceTracingTestBase.kt index 273833b919503..8ea23dea055df 100644 --- a/tests/SurfaceViewBufferTests/src/com/android/test/SurfaceTracingTestBase.kt +++ b/tests/SurfaceViewBufferTests/src/com/android/test/SurfaceTracingTestBase.kt @@ -60,6 +60,13 @@ open class SurfaceTracingTestBase(useBlastAdapter: Boolean) : } } + fun withTrace(predicate: () -> Unit): LayersTrace { + return withSFTracing(TRACE_FLAGS, + outputDir = instrumentation.targetContext.dataDir.toPath()) { + predicate() + } + } + fun runOnUiThread(predicate: (it: MainActivity) -> Unit) { scenarioRule.getScenario().onActivity { predicate(it)