14f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis/*
24f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * Copyright (C) 2011 The Android Open Source Project
34f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis *
44f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
54f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * you may not use this file except in compliance with the License.
64f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * You may obtain a copy of the License at
74f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis *
84f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
94f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis *
104f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * Unless required by applicable law or agreed to in writing, software
114f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
124f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * See the License for the specific language governing permissions and
144f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis * limitations under the License.
154f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis */
164f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
174f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis#include <gtest/gtest.h>
184f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
194f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis#include <binder/IMemory.h>
204f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h>
214f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis#include <surfaceflinger/Surface.h>
224f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis#include <surfaceflinger/SurfaceComposerClient.h>
234f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis#include <utils/String8.h>
244f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
254f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennisnamespace android {
264f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
274f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis// Fill an RGBA_8888 formatted surface with a single color.
284f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennisstatic void fillSurfaceRGBA8(const sp<SurfaceControl>& sc,
294f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        uint8_t r, uint8_t g, uint8_t b) {
304f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    Surface::SurfaceInfo info;
314f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<Surface> s = sc->getSurface();
324f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    ASSERT_TRUE(s != NULL);
334f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    ASSERT_EQ(NO_ERROR, s->lock(&info));
344f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    uint8_t* img = reinterpret_cast<uint8_t*>(info.bits);
354f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    for (uint32_t y = 0; y < info.h; y++) {
364f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        for (uint32_t x = 0; x < info.w; x++) {
374f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            uint8_t* pixel = img + (4 * (y*info.s + x));
384f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            pixel[0] = r;
394f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            pixel[1] = g;
404f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            pixel[2] = b;
414f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            pixel[3] = 255;
424f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        }
434f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
444f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    ASSERT_EQ(NO_ERROR, s->unlockAndPost());
454f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis}
464f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
474f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
484f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis// individual pixel values for testing purposes.
494f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennisclass ScreenCapture : public RefBase {
504f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennispublic:
514f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    static void captureScreen(sp<ScreenCapture>* sc) {
524f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sp<IMemoryHeap> heap;
534f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        uint32_t w=0, h=0;
544f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        PixelFormat fmt=0;
554f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sp<ISurfaceComposer> sf(ComposerService::getComposerService());
564f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 0, 0,
574f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                0, INT_MAX));
584f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(heap != NULL);
594f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(PIXEL_FORMAT_RGBA_8888, fmt);
604f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        *sc = new ScreenCapture(w, h, heap);
614f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
624f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
634f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
644f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        const uint8_t* img = reinterpret_cast<const uint8_t*>(mHeap->base());
654f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        const uint8_t* pixel = img + (4 * (y*mWidth + x));
664f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
674f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            String8 err(String8::format("pixel @ (%3d, %3d): "
684f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                    "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
694f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                    x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
704f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis            EXPECT_EQ(String8(), err);
714f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        }
724f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
734f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
744f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennisprivate:
754f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    ScreenCapture(uint32_t w, uint32_t h, const sp<IMemoryHeap>& heap) :
764f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mWidth(w),
774f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mHeight(h),
784f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mHeap(heap)
794f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {}
804f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
814f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    const uint32_t mWidth;
824f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    const uint32_t mHeight;
834f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<IMemoryHeap> mHeap;
844f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis};
854f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
864f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennisclass LayerUpdateTest : public ::testing::Test {
874f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennisprotected:
884f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    virtual void SetUp() {
894f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mComposerClient = new SurfaceComposerClient;
904f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
914f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
924f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ssize_t displayWidth = mComposerClient->getDisplayWidth(0);
934f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ssize_t displayHeight = mComposerClient->getDisplayHeight(0);
944f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
954f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // Background surface
964f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mBGSurfaceControl = mComposerClient->createSurface(
974f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                String8("BG Test Surface"), 0, displayWidth, displayHeight,
984f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                PIXEL_FORMAT_RGBA_8888, 0);
994f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(mBGSurfaceControl != NULL);
1004f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(mBGSurfaceControl->isValid());
1014f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
1024f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1034f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // Foreground surface
1044f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mFGSurfaceControl = mComposerClient->createSurface(
1054f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                String8("FG Test Surface"), 0, 64, 64, PIXEL_FORMAT_RGBA_8888, 0);
1064f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(mFGSurfaceControl != NULL);
1074f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(mFGSurfaceControl->isValid());
1084f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1094f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
1104f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1114f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // Synchronization surface
1124f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mSyncSurfaceControl = mComposerClient->createSurface(
1134f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                String8("Sync Test Surface"), 0, 1, 1, PIXEL_FORMAT_RGBA_8888, 0);
1144f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(mSyncSurfaceControl != NULL);
1154f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_TRUE(mSyncSurfaceControl->isValid());
1164f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1174f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
1184f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1194f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SurfaceComposerClient::openGlobalTransaction();
1204f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1214f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mBGSurfaceControl->setLayer(INT_MAX-2));
1224f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mBGSurfaceControl->show());
1234f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1244f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setLayer(INT_MAX-1));
1254f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setPosition(64, 64));
1264f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mFGSurfaceControl->show());
1274f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1284f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mSyncSurfaceControl->setLayer(INT_MAX-1));
1294f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mSyncSurfaceControl->setPosition(displayWidth-2,
1304f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis                displayHeight-2));
1314f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ASSERT_EQ(NO_ERROR, mSyncSurfaceControl->show());
1324f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1334f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SurfaceComposerClient::closeGlobalTransaction(true);
1344f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
1354f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1364f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    virtual void TearDown() {
1374f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mComposerClient->dispose();
1384f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mBGSurfaceControl = 0;
1394f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mFGSurfaceControl = 0;
1404f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mSyncSurfaceControl = 0;
1414f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        mComposerClient = 0;
1424f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
1434f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1444f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    void waitForPostedBuffers() {
1454f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // Since the sync surface is in synchronous mode (i.e. double buffered)
1464f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // posting three buffers to it should ensure that at least two
1474f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // SurfaceFlinger::handlePageFlip calls have been made, which should
1484f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // guaranteed that a buffer posted to another Surface has been retired.
1494f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
1504f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
1514f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
1524f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
1534f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1544f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<SurfaceComposerClient> mComposerClient;
1554f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<SurfaceControl> mBGSurfaceControl;
1564f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<SurfaceControl> mFGSurfaceControl;
1574f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1584f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    // This surface is used to ensure that the buffers posted to
1594f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    // mFGSurfaceControl have been picked up by SurfaceFlinger.
1604f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<SurfaceControl> mSyncSurfaceControl;
1614f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis};
1624f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1634f1924380cff7424e23beb82b1b7d448941e2441Jamie GennisTEST_F(LayerUpdateTest, LayerMoveWorks) {
1644f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<ScreenCapture> sc;
1654f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {
1664f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SCOPED_TRACE("before move");
1674f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ScreenCapture::captureScreen(&sc);
1684f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(  0,  12,  63,  63, 195);
1694f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 75,  75, 195,  63,  63);
1704f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(145, 145,  63,  63, 195);
1714f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
1724f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1734f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    SurfaceComposerClient::openGlobalTransaction();
1744f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setPosition(128, 128));
1754f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    SurfaceComposerClient::closeGlobalTransaction(true);
1764f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {
1774f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // This should reflect the new position, but not the new color.
1784f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SCOPED_TRACE("after move, before redraw");
1794f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ScreenCapture::captureScreen(&sc);
1804f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 24,  24,  63,  63, 195);
1814f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 75,  75,  63,  63, 195);
1824f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(145, 145, 195,  63,  63);
1834f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
1844f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1854f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    fillSurfaceRGBA8(mFGSurfaceControl, 63, 195, 63);
1864f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    waitForPostedBuffers();
1874f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {
1884f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // This should reflect the new position and the new color.
1894f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SCOPED_TRACE("after redraw");
1904f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ScreenCapture::captureScreen(&sc);
1914f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 24,  24,  63,  63, 195);
1924f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 75,  75,  63,  63, 195);
1934f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(145, 145,  63, 195,  63);
1944f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
1954f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis}
1964f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
1974f1924380cff7424e23beb82b1b7d448941e2441Jamie GennisTEST_F(LayerUpdateTest, LayerResizeWorks) {
1984f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    sp<ScreenCapture> sc;
1994f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {
2004f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SCOPED_TRACE("before resize");
2014f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ScreenCapture::captureScreen(&sc);
2024f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(  0,  12,  63,  63, 195);
2034f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 75,  75, 195,  63,  63);
2044f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(145, 145,  63,  63, 195);
2054f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
2064f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
2074f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    LOGD("resizing");
2084f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    SurfaceComposerClient::openGlobalTransaction();
2094f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setSize(128, 128));
2104f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    SurfaceComposerClient::closeGlobalTransaction(true);
2114f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    LOGD("resized");
2124f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {
2134f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // This should not reflect the new size or color because SurfaceFlinger
2144f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // has not yet received a buffer of the correct size.
2154f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SCOPED_TRACE("after resize, before redraw");
2164f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ScreenCapture::captureScreen(&sc);
2174f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(  0,  12,  63,  63, 195);
2184f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 75,  75, 195,  63,  63);
2194f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(145, 145,  63,  63, 195);
2204f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
2214f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
2224f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    LOGD("drawing");
2234f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    fillSurfaceRGBA8(mFGSurfaceControl, 63, 195, 63);
2244f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    waitForPostedBuffers();
2254f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    LOGD("drawn");
2264f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    {
2274f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        // This should reflect the new size and the new color.
2284f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        SCOPED_TRACE("after redraw");
2294f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        ScreenCapture::captureScreen(&sc);
2304f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 24,  24,  63,  63, 195);
2314f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel( 75,  75,  63, 195,  63);
2324f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis        sc->checkPixel(145, 145,  63, 195,  63);
2334f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis    }
2344f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis}
2354f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis
2364f1924380cff7424e23beb82b1b7d448941e2441Jamie Gennis}
237