Merge "BlastBufferQueue: Add SurfaceView resize tests"
This commit is contained in:
committed by
Android (Google) Code Review
commit
a1435cb6c2
1
tests/SurfaceViewBufferTests/OWNERS
Normal file
1
tests/SurfaceViewBufferTests/OWNERS
Normal file
@@ -0,0 +1 @@
|
||||
include /services/core/java/com/android/server/wm/OWNERS
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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<FrameLayout>(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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user