123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis/*
223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * Copyright (C) 2011 The Android Open Source Project
323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis *
423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * you may not use this file except in compliance with the License.
623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * You may obtain a copy of the License at
723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis *
823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis *
1023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * Unless required by applicable law or agreed to in writing, software
1123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
1223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * See the License for the specific language governing permissions and
1423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis * limitations under the License.
1523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis */
1623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
1723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis#include <gtest/gtest.h>
1823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
195a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine#include <android/native_window.h>
205a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine
2190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h>
2290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
2390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h>
2490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/ComposerService.h>
255e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos#include <private/gui/LayerState.h>
2690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian
2723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis#include <utils/String8.h>
28c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h>
2923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
305e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos#include <math.h>
315e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
3223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennisnamespace android {
3323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
3423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis// Fill an RGBA_8888 formatted surface with a single color.
3523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennisstatic void fillSurfaceRGBA8(const sp<SurfaceControl>& sc,
367bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        uint8_t r, uint8_t g, uint8_t b, bool unlock=true) {
37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    ANativeWindow_Buffer outBuffer;
3823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<Surface> s = sc->getSurface();
3923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    ASSERT_TRUE(s != NULL);
40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, NULL));
41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
425e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    for (int y = 0; y < outBuffer.height; y++) {
435e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        for (int x = 0; x < outBuffer.width; x++) {
44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            uint8_t* pixel = img + (4 * (y*outBuffer.stride + x));
4523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis            pixel[0] = r;
4623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis            pixel[1] = g;
4723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis            pixel[2] = b;
4823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis            pixel[3] = 255;
4923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        }
5023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
517bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (unlock) {
527bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        ASSERT_EQ(NO_ERROR, s->unlockAndPost());
537bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    }
5423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis}
5523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
5623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
5723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis// individual pixel values for testing purposes.
5823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennisclass ScreenCapture : public RefBase {
5923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennispublic:
6023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    static void captureScreen(sp<ScreenCapture>* sc) {
615a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        sp<IGraphicBufferProducer> producer;
625a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        sp<IGraphicBufferConsumer> consumer;
635a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        BufferQueue::createBufferQueue(&producer, &consumer);
645a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
6523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        sp<ISurfaceComposer> sf(ComposerService::getComposerService());
665a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        sp<IBinder> display(sf->getBuiltInDisplay(
675a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine                ISurfaceComposer::eDisplayIdMain));
6815311bd8a5e8a8b74e7abe6314c764e02491a12dPablo Ceballos        SurfaceComposerClient::openGlobalTransaction();
6915311bd8a5e8a8b74e7abe6314c764e02491a12dPablo Ceballos        SurfaceComposerClient::closeGlobalTransaction(true);
705a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(), 0, 0,
715a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine                0, INT_MAX, false));
725a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        *sc = new ScreenCapture(cpuConsumer);
7323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
7423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
7523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
765a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mBuf.format);
775a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        const uint8_t* img = static_cast<const uint8_t*>(mBuf.data);
785a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        const uint8_t* pixel = img + (4 * (y * mBuf.stride + x));
7923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
8023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis            String8 err(String8::format("pixel @ (%3d, %3d): "
8123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis                    "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
8223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis                    x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
835e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos            EXPECT_EQ(String8(), err) << err.string();
8423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        }
8523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
8623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    void expectFGColor(uint32_t x, uint32_t y) {
881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        checkPixel(x, y, 195, 63, 63);
891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    void expectBGColor(uint32_t x, uint32_t y) {
921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        checkPixel(x, y, 63, 63, 195);
931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    void expectChildColor(uint32_t x, uint32_t y) {
961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        checkPixel(x, y, 200, 200, 200);
971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
9923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennisprivate:
1005a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine    ScreenCapture(const sp<CpuConsumer>& cc) :
1015a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        mCC(cc) {
1025a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        EXPECT_EQ(NO_ERROR, mCC->lockNextBuffer(&mBuf));
1035a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine    }
1045a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine
1055a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine    ~ScreenCapture() {
1065a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine        mCC->unlockBuffer(mBuf);
1075a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine    }
1085a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine
1095a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine    sp<CpuConsumer> mCC;
1105a16a62950de06d48769e29f0c68a154ed7a7a89Michael Lentine    CpuConsumer::LockedBuffer mBuf;
11123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis};
11223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
11323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennisclass LayerUpdateTest : public ::testing::Test {
11423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennisprotected:
11523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    virtual void SetUp() {
11623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mComposerClient = new SurfaceComposerClient;
11723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
11823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
1199d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(
1209d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown                ISurfaceComposer::eDisplayIdMain));
121c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        DisplayInfo info;
1229d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        SurfaceComposerClient::getDisplayInfo(display, &info);
123c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian
124c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        ssize_t displayWidth = info.w;
125c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        ssize_t displayHeight = info.h;
12623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
12723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // Background surface
12823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mBGSurfaceControl = mComposerClient->createSurface(
1299d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown                String8("BG Test Surface"), displayWidth, displayHeight,
13023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis                PIXEL_FORMAT_RGBA_8888, 0);
13123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_TRUE(mBGSurfaceControl != NULL);
13223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_TRUE(mBGSurfaceControl->isValid());
13323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
13423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
13523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // Foreground surface
13623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mFGSurfaceControl = mComposerClient->createSurface(
1379d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown                String8("FG Test Surface"), 64, 64, PIXEL_FORMAT_RGBA_8888, 0);
13823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_TRUE(mFGSurfaceControl != NULL);
13923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_TRUE(mFGSurfaceControl->isValid());
14023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
14123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
14223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
14323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // Synchronization surface
14423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mSyncSurfaceControl = mComposerClient->createSurface(
1459d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown                String8("Sync Test Surface"), 1, 1, PIXEL_FORMAT_RGBA_8888, 0);
14623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_TRUE(mSyncSurfaceControl != NULL);
14723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_TRUE(mSyncSurfaceControl->isValid());
14823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
14923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
15023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
15123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SurfaceComposerClient::openGlobalTransaction();
15223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
1535e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        mComposerClient->setDisplayLayerStack(display, 0);
1545e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
1551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ASSERT_EQ(NO_ERROR, mBGSurfaceControl->setLayer(INT32_MAX-2));
15623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_EQ(NO_ERROR, mBGSurfaceControl->show());
15723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
1581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setLayer(INT32_MAX-1));
15923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setPosition(64, 64));
16023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_EQ(NO_ERROR, mFGSurfaceControl->show());
16123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
1621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ASSERT_EQ(NO_ERROR, mSyncSurfaceControl->setLayer(INT32_MAX-1));
16323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_EQ(NO_ERROR, mSyncSurfaceControl->setPosition(displayWidth-2,
16423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis                displayHeight-2));
16523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ASSERT_EQ(NO_ERROR, mSyncSurfaceControl->show());
16623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
16723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SurfaceComposerClient::closeGlobalTransaction(true);
16823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
16923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
17023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    virtual void TearDown() {
17123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mComposerClient->dispose();
17223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mBGSurfaceControl = 0;
17323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mFGSurfaceControl = 0;
17423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mSyncSurfaceControl = 0;
17523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        mComposerClient = 0;
17623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
17723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
17823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    void waitForPostedBuffers() {
17923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // Since the sync surface is in synchronous mode (i.e. double buffered)
18023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // posting three buffers to it should ensure that at least two
18123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // SurfaceFlinger::handlePageFlip calls have been made, which should
18223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // guaranteed that a buffer posted to another Surface has been retired.
18323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
18423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
18523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
18623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
18723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
18823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<SurfaceComposerClient> mComposerClient;
18923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<SurfaceControl> mBGSurfaceControl;
19023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<SurfaceControl> mFGSurfaceControl;
19123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
19223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    // This surface is used to ensure that the buffers posted to
19323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    // mFGSurfaceControl have been picked up by SurfaceFlinger.
19423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<SurfaceControl> mSyncSurfaceControl;
19523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis};
19623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
19723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie GennisTEST_F(LayerUpdateTest, LayerMoveWorks) {
19823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<ScreenCapture> sc;
19923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    {
20023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SCOPED_TRACE("before move");
20123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ScreenCapture::captureScreen(&sc);
2022b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(0, 12);
2032b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
2042b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
20523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
20623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
20723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    SurfaceComposerClient::openGlobalTransaction();
20823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setPosition(128, 128));
20923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    SurfaceComposerClient::closeGlobalTransaction(true);
21023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    {
21123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // This should reflect the new position, but not the new color.
21223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SCOPED_TRACE("after move, before redraw");
21323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ScreenCapture::captureScreen(&sc);
2142b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
2152b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
2162b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(145, 145);
21723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
21823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
21923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    fillSurfaceRGBA8(mFGSurfaceControl, 63, 195, 63);
22023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    waitForPostedBuffers();
22123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    {
22223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // This should reflect the new position and the new color.
22323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SCOPED_TRACE("after redraw");
22423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ScreenCapture::captureScreen(&sc);
2252b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
2262b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
2272b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->checkPixel(145, 145, 63, 195, 63);
22823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
22923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis}
23023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
23123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie GennisTEST_F(LayerUpdateTest, LayerResizeWorks) {
23223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    sp<ScreenCapture> sc;
23323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    {
23423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SCOPED_TRACE("before resize");
23523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ScreenCapture::captureScreen(&sc);
2362b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(0, 12);
2372b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
2382b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
23923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
24023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
2419d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("resizing");
24223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    SurfaceComposerClient::openGlobalTransaction();
24323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setSize(128, 128));
24423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    SurfaceComposerClient::closeGlobalTransaction(true);
2459d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("resized");
24623c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    {
24723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // This should not reflect the new size or color because SurfaceFlinger
24823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // has not yet received a buffer of the correct size.
24923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SCOPED_TRACE("after resize, before redraw");
25023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ScreenCapture::captureScreen(&sc);
2512b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(0, 12);
2522b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
2532b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
25423c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
25523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
2569d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("drawing");
25723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    fillSurfaceRGBA8(mFGSurfaceControl, 63, 195, 63);
25823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    waitForPostedBuffers();
2599d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("drawn");
26023c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    {
26123c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        // This should reflect the new size and the new color.
26223c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        SCOPED_TRACE("after redraw");
26323c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis        ScreenCapture::captureScreen(&sc);
2642b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
2652b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->checkPixel(75, 75, 63, 195, 63);
2662b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->checkPixel(145, 145, 63, 195, 63);
26723c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis    }
26823c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis}
26923c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis
270d575096d797628d7b39417fef23b78ca6e035d1aHaixia ShiTEST_F(LayerUpdateTest, LayerCropWorks) {
271d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    sp<ScreenCapture> sc;
272d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
273d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("before crop");
274d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
2752b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
2762b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
2772b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
278d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
279d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
280d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::openGlobalTransaction();
281d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    Rect cropRect(16, 16, 32, 32);
282d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setCrop(cropRect));
283d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::closeGlobalTransaction(true);
284d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
285d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        // This should crop the foreground surface.
286d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("after crop");
287d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
2882b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
2892b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
2902b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(95, 80);
2912b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(80, 95);
2922b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(96, 96);
293d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
294d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi}
295d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
296acbe67888f0bd65d5400400f0115bae6bd6199dcPablo CeballosTEST_F(LayerUpdateTest, LayerFinalCropWorks) {
297acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    sp<ScreenCapture> sc;
298acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    {
299acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        SCOPED_TRACE("before crop");
300acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        ScreenCapture::captureScreen(&sc);
3012b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3022b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
3032b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
304acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
305acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
306acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect cropRect(16, 16, 32, 32);
307acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setFinalCrop(cropRect));
308acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
309acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    {
310acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // This should crop the foreground surface.
311acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        SCOPED_TRACE("after crop");
312acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        ScreenCapture::captureScreen(&sc);
3132b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3142b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
3152b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(95, 80);
3162b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(80, 95);
3172b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(96, 96);
318acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
319acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
320acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
321d575096d797628d7b39417fef23b78ca6e035d1aHaixia ShiTEST_F(LayerUpdateTest, LayerSetLayerWorks) {
322d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    sp<ScreenCapture> sc;
323d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
324d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("before setLayer");
325d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3262b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3272b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
3282b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
329d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
330d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
331d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::openGlobalTransaction();
332d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setLayer(INT_MAX - 3));
333d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::closeGlobalTransaction(true);
334d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
335d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        // This should hide the foreground surface beneath the background.
336d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("after setLayer");
337d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3382b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3392b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
3402b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
341d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
342d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi}
343d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
344d575096d797628d7b39417fef23b78ca6e035d1aHaixia ShiTEST_F(LayerUpdateTest, LayerShowHideWorks) {
345d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    sp<ScreenCapture> sc;
346d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
347d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("before hide");
348d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3492b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3502b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
3512b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
352d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
353d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
354d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::openGlobalTransaction();
355d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->hide());
356d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::closeGlobalTransaction(true);
357d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
358d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        // This should hide the foreground surface.
359d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("after hide, before show");
360d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3612b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3622b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
3632b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
364d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
365d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
366d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::openGlobalTransaction();
367d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->show());
368d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::closeGlobalTransaction(true);
369d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
370d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        // This should show the foreground surface.
371d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("after show");
372d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3732b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3742b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
3752b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
376d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
377d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi}
378d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
379d575096d797628d7b39417fef23b78ca6e035d1aHaixia ShiTEST_F(LayerUpdateTest, LayerSetAlphaWorks) {
380d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    sp<ScreenCapture> sc;
381d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
382d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("before setAlpha");
383d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3842b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3852b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
3862b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
387d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
388d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
389d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::openGlobalTransaction();
390d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setAlpha(0.75f));
391d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    SurfaceComposerClient::closeGlobalTransaction(true);
392d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    {
393d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        // This should set foreground to be 75% opaque.
394d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        SCOPED_TRACE("after setAlpha");
395d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi        ScreenCapture::captureScreen(&sc);
3962b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
3972b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->checkPixel(75, 75, 162, 63, 96);
3982b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
399d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi    }
400d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi}
401d575096d797628d7b39417fef23b78ca6e035d1aHaixia Shi
4025e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo CeballosTEST_F(LayerUpdateTest, LayerSetLayerStackWorks) {
4035e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    sp<ScreenCapture> sc;
4045e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    {
4055e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        SCOPED_TRACE("before setLayerStack");
4065e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        ScreenCapture::captureScreen(&sc);
4072b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
4082b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
4092b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
4105e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    }
4115e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
4125e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
4135e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setLayerStack(1));
4145e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
4155e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    {
4165e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        // This should hide the foreground surface since it goes to a different
4175e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        // layer stack.
4185e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        SCOPED_TRACE("after setLayerStack");
4195e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        ScreenCapture::captureScreen(&sc);
4202b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
4212b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
4222b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
4235e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    }
4245e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos}
4255e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
4265e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo CeballosTEST_F(LayerUpdateTest, LayerSetFlagsWorks) {
4275e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    sp<ScreenCapture> sc;
4285e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    {
4295e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        SCOPED_TRACE("before setFlags");
4305e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        ScreenCapture::captureScreen(&sc);
4312b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
4322b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(75, 75);
4332b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
4345e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    }
4355e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
4365e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
4375e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setFlags(
4385e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos            layer_state_t::eLayerHidden, layer_state_t::eLayerHidden));
4395e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
4405e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    {
4415e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        // This should hide the foreground surface
4425e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        SCOPED_TRACE("after setFlags");
4435e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        ScreenCapture::captureScreen(&sc);
4442b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
4452b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(75, 75);
4462b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
4475e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    }
4485e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos}
4495e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
4505e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo CeballosTEST_F(LayerUpdateTest, LayerSetMatrixWorks) {
4515e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    sp<ScreenCapture> sc;
4525e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    {
4535e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        SCOPED_TRACE("before setMatrix");
4545e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        ScreenCapture::captureScreen(&sc);
4552b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
4562b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(91, 96);
4572b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(96, 101);
4582b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
4595e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    }
4605e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
4615e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
4625e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setMatrix(M_SQRT1_2, M_SQRT1_2,
4635e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos            -M_SQRT1_2, M_SQRT1_2));
4645e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
4655e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    {
4665e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        SCOPED_TRACE("after setMatrix");
4675e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos        ScreenCapture::captureScreen(&sc);
4682b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(24, 24);
4692b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(91, 96);
4702b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(96, 91);
4712b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(145, 145);
4725e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos    }
4735e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos}
4745e4fcbe411f0a941d604d8a9974a02faa3fda170Pablo Ceballos
4758d5227b8416b099c884429312daf2d60496fa484Robert Carrclass GeometryLatchingTest : public LayerUpdateTest {
4768d5227b8416b099c884429312daf2d60496fa484Robert Carrprotected:
4778d5227b8416b099c884429312daf2d60496fa484Robert Carr    void EXPECT_INITIAL_STATE(const char * trace) {
4788d5227b8416b099c884429312daf2d60496fa484Robert Carr        SCOPED_TRACE(trace);
4798d5227b8416b099c884429312daf2d60496fa484Robert Carr        ScreenCapture::captureScreen(&sc);
4808d5227b8416b099c884429312daf2d60496fa484Robert Carr        // We find the leading edge of the FG surface.
4818d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectFGColor(127, 127);
4828d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectBGColor(128, 128);
4838d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
4847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
4857bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    void lockAndFillFGBuffer() {
4867bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false);
4877bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    }
4887bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
4897bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    void unlockFGBuffer() {
4907bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        sp<Surface> s = mFGSurfaceControl->getSurface();
4917bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4927bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        waitForPostedBuffers();
4937bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    }
4947bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
4958d5227b8416b099c884429312daf2d60496fa484Robert Carr    void completeFGResize() {
4968d5227b8416b099c884429312daf2d60496fa484Robert Carr        fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4978d5227b8416b099c884429312daf2d60496fa484Robert Carr        waitForPostedBuffers();
4988d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
4998d5227b8416b099c884429312daf2d60496fa484Robert Carr    void restoreInitialState() {
5008d5227b8416b099c884429312daf2d60496fa484Robert Carr        SurfaceComposerClient::openGlobalTransaction();
5018d5227b8416b099c884429312daf2d60496fa484Robert Carr        mFGSurfaceControl->setSize(64, 64);
5028d5227b8416b099c884429312daf2d60496fa484Robert Carr        mFGSurfaceControl->setPosition(64, 64);
5038d5227b8416b099c884429312daf2d60496fa484Robert Carr        mFGSurfaceControl->setCrop(Rect(0, 0, 64, 64));
5048d5227b8416b099c884429312daf2d60496fa484Robert Carr        mFGSurfaceControl->setFinalCrop(Rect(0, 0, -1, -1));
5058d5227b8416b099c884429312daf2d60496fa484Robert Carr        SurfaceComposerClient::closeGlobalTransaction(true);
5068d5227b8416b099c884429312daf2d60496fa484Robert Carr
5078d5227b8416b099c884429312daf2d60496fa484Robert Carr        EXPECT_INITIAL_STATE("After restoring initial state");
5088d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
5098d5227b8416b099c884429312daf2d60496fa484Robert Carr    sp<ScreenCapture> sc;
5108d5227b8416b099c884429312daf2d60496fa484Robert Carr};
5118d5227b8416b099c884429312daf2d60496fa484Robert Carr
5128d5227b8416b099c884429312daf2d60496fa484Robert CarrTEST_F(GeometryLatchingTest, SurfacePositionLatching) {
5138d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_INITIAL_STATE("before anything");
5148d5227b8416b099c884429312daf2d60496fa484Robert Carr
5158d5227b8416b099c884429312daf2d60496fa484Robert Carr    // By default position can be updated even while
5168d5227b8416b099c884429312daf2d60496fa484Robert Carr    // a resize is pending.
5178d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::openGlobalTransaction();
5188d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setSize(32, 32);
5198d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setPosition(100, 100);
5208d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
5218d5227b8416b099c884429312daf2d60496fa484Robert Carr
5228d5227b8416b099c884429312daf2d60496fa484Robert Carr    {
5238d5227b8416b099c884429312daf2d60496fa484Robert Carr        SCOPED_TRACE("After moving surface");
5248d5227b8416b099c884429312daf2d60496fa484Robert Carr        ScreenCapture::captureScreen(&sc);
5258d5227b8416b099c884429312daf2d60496fa484Robert Carr        // If we moved, the FG Surface should cover up what was previously BG
5268d5227b8416b099c884429312daf2d60496fa484Robert Carr        // however if we didn't move the FG wouldn't be large enough now.
5278d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectFGColor(163, 163);
5288d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
5298d5227b8416b099c884429312daf2d60496fa484Robert Carr
5308d5227b8416b099c884429312daf2d60496fa484Robert Carr    restoreInitialState();
5318d5227b8416b099c884429312daf2d60496fa484Robert Carr
5328d5227b8416b099c884429312daf2d60496fa484Robert Carr    // Now we repeat with setGeometryAppliesWithResize
5338d5227b8416b099c884429312daf2d60496fa484Robert Carr    // and verify the position DOESN'T latch.
5348d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::openGlobalTransaction();
5358d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setGeometryAppliesWithResize();
5368d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setSize(32, 32);
5378d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setPosition(100, 100);
5388d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
5398d5227b8416b099c884429312daf2d60496fa484Robert Carr
5408d5227b8416b099c884429312daf2d60496fa484Robert Carr    {
5418d5227b8416b099c884429312daf2d60496fa484Robert Carr        SCOPED_TRACE("While resize is pending");
5428d5227b8416b099c884429312daf2d60496fa484Robert Carr        ScreenCapture::captureScreen(&sc);
5438d5227b8416b099c884429312daf2d60496fa484Robert Carr        // This time we shouldn't have moved, so the BG color
5448d5227b8416b099c884429312daf2d60496fa484Robert Carr        // should still be visible.
5458d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectBGColor(128, 128);
5468d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
5478d5227b8416b099c884429312daf2d60496fa484Robert Carr
5488d5227b8416b099c884429312daf2d60496fa484Robert Carr    completeFGResize();
5498d5227b8416b099c884429312daf2d60496fa484Robert Carr
5508d5227b8416b099c884429312daf2d60496fa484Robert Carr    {
5518d5227b8416b099c884429312daf2d60496fa484Robert Carr        SCOPED_TRACE("After the resize");
5528d5227b8416b099c884429312daf2d60496fa484Robert Carr        ScreenCapture::captureScreen(&sc);
5538d5227b8416b099c884429312daf2d60496fa484Robert Carr        // But after the resize completes, we should move
5548d5227b8416b099c884429312daf2d60496fa484Robert Carr        // and the FG should be visible here.
5558d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectFGColor(128, 128);
5568d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
5578d5227b8416b099c884429312daf2d60496fa484Robert Carr}
5588d5227b8416b099c884429312daf2d60496fa484Robert Carr
5598d5227b8416b099c884429312daf2d60496fa484Robert Carrclass CropLatchingTest : public GeometryLatchingTest {
5608d5227b8416b099c884429312daf2d60496fa484Robert Carrprotected:
5618d5227b8416b099c884429312daf2d60496fa484Robert Carr    void EXPECT_CROPPED_STATE(const char* trace) {
5628d5227b8416b099c884429312daf2d60496fa484Robert Carr        SCOPED_TRACE(trace);
5638d5227b8416b099c884429312daf2d60496fa484Robert Carr        ScreenCapture::captureScreen(&sc);
5648d5227b8416b099c884429312daf2d60496fa484Robert Carr        // The edge should be moved back one pixel by our crop.
5658d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectFGColor(126, 126);
5668d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectBGColor(127, 127);
5678d5227b8416b099c884429312daf2d60496fa484Robert Carr        sc->expectBGColor(128, 128);
5688d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
5698d5227b8416b099c884429312daf2d60496fa484Robert Carr};
5708d5227b8416b099c884429312daf2d60496fa484Robert Carr
5718d5227b8416b099c884429312daf2d60496fa484Robert CarrTEST_F(CropLatchingTest, CropLatching) {
5728d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_INITIAL_STATE("before anything");
5738d5227b8416b099c884429312daf2d60496fa484Robert Carr    // Normally the crop applies immediately even while a resize is pending.
5748d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::openGlobalTransaction();
5758d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setSize(128, 128);
5768d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setCrop(Rect(0, 0, 63, 63));
5778d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
5788d5227b8416b099c884429312daf2d60496fa484Robert Carr
5798d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_CROPPED_STATE("after setting crop (without geometryAppliesWithResize)");
5808d5227b8416b099c884429312daf2d60496fa484Robert Carr
5818d5227b8416b099c884429312daf2d60496fa484Robert Carr    restoreInitialState();
5828d5227b8416b099c884429312daf2d60496fa484Robert Carr
5838d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::openGlobalTransaction();
5848d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setSize(128, 128);
5858d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setGeometryAppliesWithResize();
5868d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setCrop(Rect(0, 0, 63, 63));
5878d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
5888d5227b8416b099c884429312daf2d60496fa484Robert Carr
5898d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_INITIAL_STATE("after setting crop (with geometryAppliesWithResize)");
5908d5227b8416b099c884429312daf2d60496fa484Robert Carr
5918d5227b8416b099c884429312daf2d60496fa484Robert Carr    completeFGResize();
5928d5227b8416b099c884429312daf2d60496fa484Robert Carr
5938d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_CROPPED_STATE("after the resize finishes");
5948d5227b8416b099c884429312daf2d60496fa484Robert Carr}
5958d5227b8416b099c884429312daf2d60496fa484Robert Carr
5968d5227b8416b099c884429312daf2d60496fa484Robert CarrTEST_F(CropLatchingTest, FinalCropLatching) {
5978d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_INITIAL_STATE("before anything");
5988d5227b8416b099c884429312daf2d60496fa484Robert Carr    // Normally the crop applies immediately even while a resize is pending.
5998d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::openGlobalTransaction();
6008d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setSize(128, 128);
6018d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setFinalCrop(Rect(64, 64, 127, 127));
6028d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
6038d5227b8416b099c884429312daf2d60496fa484Robert Carr
6048d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_CROPPED_STATE("after setting crop (without geometryAppliesWithResize)");
6058d5227b8416b099c884429312daf2d60496fa484Robert Carr
6068d5227b8416b099c884429312daf2d60496fa484Robert Carr    restoreInitialState();
6078d5227b8416b099c884429312daf2d60496fa484Robert Carr
6088d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::openGlobalTransaction();
6098d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setSize(128, 128);
6108d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setGeometryAppliesWithResize();
6118d5227b8416b099c884429312daf2d60496fa484Robert Carr    mFGSurfaceControl->setFinalCrop(Rect(64, 64, 127, 127));
6128d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
6138d5227b8416b099c884429312daf2d60496fa484Robert Carr
6148d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_INITIAL_STATE("after setting crop (with geometryAppliesWithResize)");
6158d5227b8416b099c884429312daf2d60496fa484Robert Carr
6168d5227b8416b099c884429312daf2d60496fa484Robert Carr    completeFGResize();
6178d5227b8416b099c884429312daf2d60496fa484Robert Carr
6188d5227b8416b099c884429312daf2d60496fa484Robert Carr    EXPECT_CROPPED_STATE("after the resize finishes");
6198d5227b8416b099c884429312daf2d60496fa484Robert Carr}
6208d5227b8416b099c884429312daf2d60496fa484Robert Carr
6217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr// In this test we ensure that setGeometryAppliesWithResize actually demands
6227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr// a buffer of the new size, and not just any size.
6237bf247e2db180da661b18084d50e0b389686fc0cRobert CarrTEST_F(CropLatchingTest, FinalCropLatchingBufferOldSize) {
6247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_INITIAL_STATE("before anything");
6257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Normally the crop applies immediately even while a resize is pending.
6267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::openGlobalTransaction();
6277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setSize(128, 128);
6287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setFinalCrop(Rect(64, 64, 127, 127));
6297bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
6307bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6317bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_CROPPED_STATE("after setting crop (without geometryAppliesWithResize)");
6327bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6337bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    restoreInitialState();
6347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6357bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // In order to prepare to submit a buffer at the wrong size, we acquire it prior to
6367bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // initiating the resize.
6377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    lockAndFillFGBuffer();
6387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6397bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::openGlobalTransaction();
6407bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setSize(128, 128);
6417bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setGeometryAppliesWithResize();
6427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setFinalCrop(Rect(64, 64, 127, 127));
6437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
6447bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6457bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_INITIAL_STATE("after setting crop (with geometryAppliesWithResize)");
6467bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6477bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // We now submit our old buffer, at the old size, and ensure it doesn't
6487bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // trigger geometry latching.
6497bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    unlockFGBuffer();
6507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6517bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_INITIAL_STATE("after unlocking FG buffer (with geometryAppliesWithResize)");
6527bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6537bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    completeFGResize();
6547bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6557bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_CROPPED_STATE("after the resize finishes");
6567bf247e2db180da661b18084d50e0b389686fc0cRobert Carr}
6577bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6587bf247e2db180da661b18084d50e0b389686fc0cRobert CarrTEST_F(CropLatchingTest, FinalCropLatchingRegressionForb37531386) {
6597bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_INITIAL_STATE("before anything");
6607bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // In this scenario, we attempt to set the final crop a second time while the resize
6617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // is still pending, and ensure we are successful. Success meaning the second crop
6627bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // is the one which eventually latches and not the first.
6637bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::openGlobalTransaction();
6647bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setSize(128, 128);
6657bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setGeometryAppliesWithResize();
6667bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setFinalCrop(Rect(64, 64, 127, 127));
6677bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
6687bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6697bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::openGlobalTransaction();
6707bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFGSurfaceControl->setFinalCrop(Rect(0, 0, -1, -1));
6717bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
6727bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6737bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_INITIAL_STATE("after setting crops with geometryAppliesWithResize");
6747bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6757bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    completeFGResize();
6767bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
6777bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    EXPECT_INITIAL_STATE("after the resize finishes");
6787bf247e2db180da661b18084d50e0b389686fc0cRobert Carr}
6797bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
68005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo CeballosTEST_F(LayerUpdateTest, DeferredTransactionTest) {
68105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    sp<ScreenCapture> sc;
68205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    {
68305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        SCOPED_TRACE("before anything");
68405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        ScreenCapture::captureScreen(&sc);
6852b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(32, 32);
6862b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(96, 96);
6872b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(160, 160);
68805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    }
68905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
69005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    // set up two deferred transactions on different frames
69105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
69205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setAlpha(0.75));
69305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mFGSurfaceControl->deferTransactionUntil(mSyncSurfaceControl->getHandle(),
69405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            mSyncSurfaceControl->getSurface()->getNextFrameNumber());
69505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
69605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
69705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
69805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setPosition(128,128));
69905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mFGSurfaceControl->deferTransactionUntil(mSyncSurfaceControl->getHandle(),
70005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
70105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
70205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
70305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    {
70405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        SCOPED_TRACE("before any trigger");
70505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        ScreenCapture::captureScreen(&sc);
7062b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(32, 32);
7072b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(96, 96);
7082b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(160, 160);
70905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    }
71005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
71105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    // should trigger the first deferred transaction, but not the second one
71205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
71305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    {
71405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        SCOPED_TRACE("after first trigger");
71505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        ScreenCapture::captureScreen(&sc);
7162b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(32, 32);
7172b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->checkPixel(96, 96, 162, 63, 96);
7182b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(160, 160);
71905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    }
72005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
72105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    // should show up immediately since it's not deferred
72205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    SurfaceComposerClient::openGlobalTransaction();
72305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setAlpha(1.0));
72405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    SurfaceComposerClient::closeGlobalTransaction(true);
72505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
72605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    // trigger the second deferred transaction
72705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
72805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    {
72905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        SCOPED_TRACE("after second trigger");
73005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos        ScreenCapture::captureScreen(&sc);
7312b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(32, 32);
7322b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectBGColor(96, 96);
7332b91c826ac5fc1d0f9370d02fd8c2373e5ca85d3Robert Carr        sc->expectFGColor(160, 160);
73405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    }
73505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos}
73605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos
737db66e627ad8904491e384c64f82fc77a939b9705Robert CarrTEST_F(LayerUpdateTest, LayerSetRelativeLayerWorks) {
738db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<ScreenCapture> sc;
739db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    {
740db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        SCOPED_TRACE("before adding relative surface");
741db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        ScreenCapture::captureScreen(&sc);
742db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sc->expectBGColor(24, 24);
743db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sc->expectFGColor(75, 75);
744db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sc->expectBGColor(145, 145);
745db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
746db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
747db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    auto relativeSurfaceControl = mComposerClient->createSurface(
748db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            String8("Test Surface"), 64, 64, PIXEL_FORMAT_RGBA_8888, 0);
749db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    fillSurfaceRGBA8(relativeSurfaceControl, 255, 177, 177);
750db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    waitForPostedBuffers();
751db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
752db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Now we stack the surface above the foreground surface and make sure it is visible.
753db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    SurfaceComposerClient::openGlobalTransaction();
754db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relativeSurfaceControl->setPosition(64, 64);
755db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relativeSurfaceControl->show();
756db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relativeSurfaceControl->setRelativeLayer(mFGSurfaceControl->getHandle(), 1);
757db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
758db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
759db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
760db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    {
761db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        SCOPED_TRACE("after adding relative surface");
762db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        ScreenCapture::captureScreen(&sc);
763db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        // our relative surface should be visible now.
764db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sc->checkPixel(75, 75, 255, 177, 177);
765db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
766db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
767db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // A call to setLayer will override a call to setRelativeLayer
768db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    SurfaceComposerClient::openGlobalTransaction();
769db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relativeSurfaceControl->setLayer(0);
770db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    SurfaceComposerClient::closeGlobalTransaction();
771db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
772db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    {
773db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        SCOPED_TRACE("after set layer");
774db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        ScreenCapture::captureScreen(&sc);
775db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        // now the FG surface should be visible again.
776db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sc->expectFGColor(75, 75);
777db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
778db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
779db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
7801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrclass ChildLayerTest : public LayerUpdateTest {
7811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrprotected:
7821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    void SetUp() override {
7831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        LayerUpdateTest::SetUp();
7841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mChild = mComposerClient->createSurface(
7851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                String8("Child surface"),
7861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                10, 10, PIXEL_FORMAT_RGBA_8888,
7871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                0, mFGSurfaceControl.get());
7881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        fillSurfaceRGBA8(mChild, 200, 200, 200);
7891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
7901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        {
7911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            SCOPED_TRACE("before anything");
7921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            ScreenCapture::captureScreen(&mCapture);
7931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            mCapture->expectChildColor(64, 64);
7941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
7951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
7961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    void TearDown() override {
7971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        LayerUpdateTest::TearDown();
7981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mChild = 0;
7991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
8001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    sp<SurfaceControl> mChild;
8021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    sp<ScreenCapture> mCapture;
8031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr};
8041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTEST_F(ChildLayerTest, ChildLayerPositioning) {
8061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
8071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mChild->show();
8081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mChild->setPosition(10, 10);
8091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mFGSurfaceControl->setPosition(64, 64);
8101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
8111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    {
8131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ScreenCapture::captureScreen(&mCapture);
8141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // Top left of foreground must now be visible
8151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(64, 64);
8161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // But 10 pixels in we should see the child surface
8171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(74, 74);
8181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // And 10 more pixels we should be back to the foreground surface
8191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(84, 84);
8201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
8211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
8231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setPosition(0, 0));
8241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
8251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    {
8271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ScreenCapture::captureScreen(&mCapture);
8281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // Top left of foreground should now be at 0, 0
8291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(0, 0);
8301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // But 10 pixels in we should see the child surface
8311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(10, 10);
8321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // And 10 more pixels we should be back to the foreground surface
8331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(20, 20);
8341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
8351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
8361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
83741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert CarrTEST_F(ChildLayerTest, ChildLayerCropping) {
83841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
83941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mChild->show();
84041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mChild->setPosition(0, 0);
84141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mFGSurfaceControl->setPosition(0, 0);
84241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mFGSurfaceControl->setCrop(Rect(0, 0, 5, 5));
84341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
84441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
84541b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    {
84641b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        ScreenCapture::captureScreen(&mCapture);
84741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        mCapture->expectChildColor(0, 0);
84841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        mCapture->expectChildColor(4, 4);
84941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        mCapture->expectBGColor(5, 5);
85041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
85141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr}
85241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
85341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert CarrTEST_F(ChildLayerTest, ChildLayerFinalCropping) {
85441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
85541b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mChild->show();
85641b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mChild->setPosition(0, 0);
85741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mFGSurfaceControl->setPosition(0, 0);
85841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    mFGSurfaceControl->setFinalCrop(Rect(0, 0, 5, 5));
85941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
86041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
86141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    {
86241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        ScreenCapture::captureScreen(&mCapture);
86341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        mCapture->expectChildColor(0, 0);
86441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        mCapture->expectChildColor(4, 4);
86541b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        mCapture->expectBGColor(5, 5);
86641b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
86741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr}
86841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
8691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTEST_F(ChildLayerTest, ChildLayerConstraints) {
8701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
8711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mChild->show();
8721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mFGSurfaceControl->setPosition(0, 0);
8731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mChild->setPosition(63, 63);
8741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
8751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    {
8771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ScreenCapture::captureScreen(&mCapture);
8781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(0, 0);
8791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // Last pixel in foreground should now be the child.
8801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(63, 63);
8811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // But the child should be constrained and the next pixel
8821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        // must be the background
8831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectBGColor(64, 64);
8841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
8851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
8861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTEST_F(ChildLayerTest, ChildLayerScaling) {
8881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
8891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mFGSurfaceControl->setPosition(0, 0);
8901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
8911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Find the boundary between the parent and child
8931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    {
8941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ScreenCapture::captureScreen(&mCapture);
8951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(9, 9);
8961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(10, 10);
8971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
8981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
8991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::openGlobalTransaction();
9001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mFGSurfaceControl->setMatrix(2.0, 0, 0, 2.0);
9011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
9021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
9031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The boundary should be twice as far from the origin now.
9041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The pixels from the last test should all be child now
9051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    {
9061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        ScreenCapture::captureScreen(&mCapture);
9071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(9, 9);
9081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(10, 10);
9091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectChildColor(19, 19);
9101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCapture->expectFGColor(20, 20);
9111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
9121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
9139524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
9146452f12c95e855a96ab8f690f28914cd37de762bRobert CarrTEST_F(ChildLayerTest, ChildLayerAlpha) {
9156452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
9166452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
9176452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    fillSurfaceRGBA8(mChild, 0, 254, 0);
9186452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    waitForPostedBuffers();
9196452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9206452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    SurfaceComposerClient::openGlobalTransaction();
9216452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    mChild->show();
9226452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    mChild->setPosition(0, 0);
9236452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    mFGSurfaceControl->setPosition(0, 0);
9246452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
9256452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9266452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    {
9276452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        ScreenCapture::captureScreen(&mCapture);
9286452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        // Unblended child color
9296452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        mCapture->checkPixel(0, 0, 0, 254, 0);
9306452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    }
9316452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9326452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    SurfaceComposerClient::openGlobalTransaction();
9336452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    ASSERT_EQ(NO_ERROR, mChild->setAlpha(0.5));
9346452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
9356452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9366452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    {
9376452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        ScreenCapture::captureScreen(&mCapture);
9386452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        // Child and BG blended.
9396452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        mCapture->checkPixel(0, 0, 127, 127, 0);
9406452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    }
9416452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9426452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    SurfaceComposerClient::openGlobalTransaction();
9436452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setAlpha(0.5));
9446452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
9456452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9466452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    {
9476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        ScreenCapture::captureScreen(&mCapture);
9486452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        // Child and BG blended.
9496452f12c95e855a96ab8f690f28914cd37de762bRobert Carr        mCapture->checkPixel(0, 0, 95, 64, 95);
9506452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    }
9516452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
9526452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
9539524cb3b37a91b5741790c77ff24fd825b02bca7Robert CarrTEST_F(ChildLayerTest, ReparentChildren) {
9549524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    SurfaceComposerClient::openGlobalTransaction();
9559524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mChild->show();
9569524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mChild->setPosition(10, 10);
9579524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mFGSurfaceControl->setPosition(64, 64);
9589524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
9599524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
9609524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    {
9619524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        ScreenCapture::captureScreen(&mCapture);
9629524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // Top left of foreground must now be visible
9639524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(64, 64);
9649524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // But 10 pixels in we should see the child surface
9659524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectChildColor(74, 74);
9669524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // And 10 more pixels we should be back to the foreground surface
9679524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(84, 84);
9689524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    }
9699524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mFGSurfaceControl->reparentChildren(mBGSurfaceControl->getHandle());
9709524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    {
9719524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        ScreenCapture::captureScreen(&mCapture);
9729524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(64, 64);
9739524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // In reparenting we should have exposed the entire foreground surface.
9749524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(74, 74);
9759524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // And the child layer should now begin at 10, 10 (since the BG
9769524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // layer is at (0, 0)).
9779524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectBGColor(9, 9);
9789524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectChildColor(10, 10);
9799524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    }
9809524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
9819524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
9829524cb3b37a91b5741790c77ff24fd825b02bca7Robert CarrTEST_F(ChildLayerTest, DetachChildren) {
9839524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    SurfaceComposerClient::openGlobalTransaction();
9849524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mChild->show();
9859524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mChild->setPosition(10, 10);
9869524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mFGSurfaceControl->setPosition(64, 64);
9879524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
9889524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
9899524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    {
9909524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        ScreenCapture::captureScreen(&mCapture);
9919524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // Top left of foreground must now be visible
9929524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(64, 64);
9939524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // But 10 pixels in we should see the child surface
9949524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectChildColor(74, 74);
9959524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        // And 10 more pixels we should be back to the foreground surface
9969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(84, 84);
9979524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    }
9989524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
9999524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    SurfaceComposerClient::openGlobalTransaction();
10009524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mFGSurfaceControl->detachChildren();
10018d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
10029524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
10039524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    SurfaceComposerClient::openGlobalTransaction();
10049524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    mChild->hide();
10058d5227b8416b099c884429312daf2d60496fa484Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
10069524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
10079524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    // Nothing should have changed.
10089524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    {
10099524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        ScreenCapture::captureScreen(&mCapture);
10109524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(64, 64);
10119524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectChildColor(74, 74);
10129524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        mCapture->expectFGColor(84, 84);
10139524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    }
10149524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
10159524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
10169b429f41cbd5964f96f9fb746af3b6932e4acc66Robert CarrTEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
10179b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    SurfaceComposerClient::openGlobalTransaction();
10189b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    mChild->show();
10199b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    mChild->setPosition(0, 0);
10209b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    mFGSurfaceControl->setPosition(0, 0);
10219b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
10229b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
10239b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    {
10249b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        ScreenCapture::captureScreen(&mCapture);
10259b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // We've positioned the child in the top left.
10269b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        mCapture->expectChildColor(0, 0);
10279b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // But it's only 10x10.
10289b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        mCapture->expectFGColor(10, 10);
10299b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    }
10309b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
10319b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    SurfaceComposerClient::openGlobalTransaction();
10329b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    mFGSurfaceControl->setOverrideScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
10339b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    // We cause scaling by 2.
10349b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    mFGSurfaceControl->setSize(128, 128);
10359b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    SurfaceComposerClient::closeGlobalTransaction();
10369b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
10379b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    {
10389b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        ScreenCapture::captureScreen(&mCapture);
10399b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // We've positioned the child in the top left.
10409b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        mCapture->expectChildColor(0, 0);
10419b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        mCapture->expectChildColor(10, 10);
10429b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        mCapture->expectChildColor(19, 19);
10439b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // And now it should be scaled all the way to 20x20
10449b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        mCapture->expectFGColor(20, 20);
10459b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr    }
10469b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr}
10479b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
10481725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr// Regression test for b/37673612
10491725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert CarrTEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
10501725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    SurfaceComposerClient::openGlobalTransaction();
10511725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    mChild->show();
10521725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    mChild->setPosition(0, 0);
10531725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    mFGSurfaceControl->setPosition(0, 0);
10541725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    SurfaceComposerClient::closeGlobalTransaction(true);
10551725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr
10561725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    {
10571725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        ScreenCapture::captureScreen(&mCapture);
10581725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        // We've positioned the child in the top left.
10591725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        mCapture->expectChildColor(0, 0);
10601725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        // But it's only 10x10.
10611725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        mCapture->expectFGColor(10, 10);
10621725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    }
10631725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr
10641725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr
10651725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
10661725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    // the WM specified state size.
10671725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    mFGSurfaceControl->setSize(128, 64);
10681725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    sp<Surface> s = mFGSurfaceControl->getSurface();
10691725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    auto anw = static_cast<ANativeWindow*>(s.get());
10701725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
10711725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    native_window_set_buffers_dimensions(anw, 64, 128);
10721725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
10731725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    waitForPostedBuffers();
10741725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr
10751725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    {
10761725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        // The child should still be in the same place and not have any strange scaling as in
10771725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        // b/37673612.
10781725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        ScreenCapture::captureScreen(&mCapture);
10791725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        mCapture->expectChildColor(0, 0);
10801725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr        mCapture->expectFGColor(10, 10);
10811725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr    }
10821725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr}
10831725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr
1084412903fce3a93f411c85c54375a1851bfb370400Dan StozaTEST_F(ChildLayerTest, Bug36858924) {
1085412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // Destroy the child layer
1086412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    mChild.clear();
1087412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
1088412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // Now recreate it as hidden
1089412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    mChild = mComposerClient->createSurface(String8("Child surface"), 10, 10,
1090412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                            PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eHidden,
1091412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                            mFGSurfaceControl.get());
1092412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
1093412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // Show the child layer in a deferred transaction
1094412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    SurfaceComposerClient::openGlobalTransaction();
1095412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    mChild->deferTransactionUntil(mFGSurfaceControl->getHandle(),
1096412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                  mFGSurfaceControl->getSurface()->getNextFrameNumber());
1097412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    mChild->show();
1098412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    SurfaceComposerClient::closeGlobalTransaction(true);
1099412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
1100412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // Render the foreground surface a few times
1101412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    //
1102412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
1103412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // frame because SurfaceFlinger would never process the deferred transaction and would therefore
1104412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    // never acquire/release the first buffer
1105412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    ALOGI("Filling 1");
1106412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
1107412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    ALOGI("Filling 2");
1108412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
1109412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    ALOGI("Filling 3");
1110412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
1111412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    ALOGI("Filling 4");
1112412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
1113412903fce3a93f411c85c54375a1851bfb370400Dan Stoza}
1114412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
111523c2c5d1c6aaeaeb1804b7aa9b667e7e58c941bbJamie Gennis}
1116