1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.test 17 18 import android.graphics.Point 19 import com.android.server.wm.flicker.traces.layers.LayersTraceSubject.Companion.assertThat 20 import com.android.test.SurfaceViewBufferTestBase.Companion.Transform 21 import junit.framework.Assert.assertEquals 22 import org.junit.Assume.assumeFalse 23 import org.junit.Before 24 import org.junit.Test 25 import org.junit.runner.RunWith 26 import org.junit.runners.Parameterized 27 28 @RunWith(Parameterized::class) 29 class InverseDisplayTransformTests(useBlastAdapter: Boolean) : 30 SurfaceTracingTestBase(useBlastAdapter) { 31 @Before 32 override fun setup() { 33 scenarioRule.getScenario().onActivity { 34 it.rotate90() 35 } 36 instrumentation.waitForIdleSync() 37 super.setup() 38 } 39 40 @Test 41 fun testSetBufferScalingMode_freeze_withInvDisplayTransform() { 42 assumeFalse("Blast does not support buffer rejection with Inv display " + 43 "transform since the only user for this hidden api is camera which does not use" + 44 "fixed scaling mode.", useBlastAdapter) 45 46 val rotatedBufferSize = Point(defaultBufferSize.y, defaultBufferSize.x) 47 val trace = withTrace { activity -> 48 // Inverse display transforms are sticky AND they are only consumed by the sf after 49 // a valid buffer has been acquired. 50 activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.INVERSE_DISPLAY.value) 51 assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) 52 activity.mSurfaceProxy.SurfaceQueueBuffer(0) 53 54 assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(1, 500 /* ms */), 0) 55 activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, 56 rotatedBufferSize, R8G8B8A8_UNORM) 57 assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(0, 1000 /* ms */)) 58 assertEquals(0, activity.mSurfaceProxy.SurfaceDequeueBuffer(1, 1000 /* ms */)) 59 // Change buffer size and set scaling mode to freeze 60 activity.mSurfaceProxy.ANativeWindowSetBuffersGeometry(activity.surface!!, Point(0, 0), 61 R8G8B8A8_UNORM) 62 63 // first dequeued buffer does not have the new size so it should be rejected. 64 activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(Transform.ROT_90.value) 65 activity.mSurfaceProxy.SurfaceQueueBuffer(0) 66 activity.mSurfaceProxy.ANativeWindowSetBuffersTransform(0) 67 activity.mSurfaceProxy.SurfaceQueueBuffer(1) 68 assertEquals(activity.mSurfaceProxy.waitUntilBufferDisplayed(3, 500 /* ms */), 0) 69 } 70 71 // verify buffer size is reset to default buffer size 72 assertThat(trace).layer("SurfaceView", 1).hasBufferSize(defaultBufferSize) 73 assertThat(trace).layer("SurfaceView", 2).doesNotExist() 74 assertThat(trace).layer("SurfaceView", 3).hasBufferSize(rotatedBufferSize) 75 } 76 }