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