Layer.cpp revision 5b4cffc352f7f5d3711d4b7798a07434a998b2d7
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer" 201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h> 43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h> 4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 5241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h" 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h" 60c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 6141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 659eeae69005ef9a774bde19195b9c06eba7e463c2David SodmanLayerBE::LayerBE() 665b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman : mBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 675b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman mBuffer(nullptr), 685b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) { 699eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman} 709eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 719eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 7441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w, 7541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t h, uint32_t flags) 760c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman : contentDirty(false), 7713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 7913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 800c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mName(name), 8113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 85399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 86a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 87a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 88c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 89a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 90cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 9182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 9313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 9413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 98a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 10065476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 10182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 10241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFreezeGeometryUpdates(false) { 1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 104a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1064d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 10741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden; 10841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque; 10941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure; 1104d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1114d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 112f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza mTransactionName = String8("TX - ") + mName; 1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1160c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mCurrentState.flags = layerFlags; 1173dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 118b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 119b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedFinalCrop = mCurrentState.finalCrop; 1217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedCrop = mCurrentState.crop; 1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 12313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = 1.0f; 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 127bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1282f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1292f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1336547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1376547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1390a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1410a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 1429eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 143e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 144e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 14541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {} 14696f0819f81293076e652792794a961543e6750d7Mathias Agopian 1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 14996f0819f81293076e652792794a961543e6750d7Mathias Agopian} 15096f0819f81293076e652792794a961543e6750d7Mathias Agopian 15113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 15213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 15313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 15413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 155eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/* 156eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through 157eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer. So, the implementation is done in BufferLayer. When called on a 158eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP. 159eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */ 160eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {} 16113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 162c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() { 163c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mCurrentState to mLayersPendingRemoval 164c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 1658b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw mPendingRemoval = true; 1668b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw 1675edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1685edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1695edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 1705edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 171c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mFlinger->setTransactionFlags(eTraversalNeeded); 1725edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1735edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1745edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1755edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 176c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu for (const auto& child : mCurrentChildren) { 177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu child->onRemovedFromCurrentState(); 178c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 179c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu} 1803851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 181c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() { 182c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mLayersPendingRemoval 183eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman abandon(); 184c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 185b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyAllHwcLayers(); 1863851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 1871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 1881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 1891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19048d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 191cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 19213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 19313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 19413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 19513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1961eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 19713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 19813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 19913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 20013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const { 20113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return mPremultipliedAlpha; 20213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 20313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 2044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 2054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 2064d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 207582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 208582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 20913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 21113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 213b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { 2146f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0, 2159eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman "Already have a layer for hwcId %d", hwcId); 216b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWC2::Layer* layer = hwc->createLayer(hwcId); 217b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (!layer) { 218b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return false; 219b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2206f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers[hwcId]; 221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc = hwc; 222b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.layer = layer; 223b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas layer->setLayerDestroyedListener( 2246f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman [this, hwcId](HWC2::Layer* /*layer*/) { getBE().mHwcLayers.erase(hwcId); }); 225b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return true; 226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 22883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wubool Layer::destroyHwcLayer(int32_t hwcId) { 2296f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 23083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return false; 231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2326f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 23341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer"); 234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer"); 235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer); 236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // The layer destroyed listener should have cleared the entry from 237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // mHwcLayers. Verify that. 2386f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0, 2396f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman "Stale layer entry in getBE().mHwcLayers"); 24083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return true; 241b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() { 2446f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman size_t numLayers = getBE().mHwcLayers.size(); 245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas for (size_t i = 0; i < numLayers; ++i) { 2466f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.empty(), "destroyAllHwcLayers failed"); 2476f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman destroyHwcLayer(getBE().mHwcLayers.begin()->first); 248b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2496f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(!getBE().mHwcLayers.empty(), 25041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "All hardware composer layers should have been destroyed"); 251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 252b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 253a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 254a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 255a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 256f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 257f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 258a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 259f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 2605b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman } else if (getBE().mBuffer != NULL) { 261a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 2625b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman crop = getBE().mBuffer->getBounds(); 263f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 264a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 2654fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 266f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 267f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 268f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 269f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 270f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 271f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 272f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 273f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 274f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 275f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 276f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 277f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 278f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 279f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 2801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 2811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 2821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 2831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 2851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 2891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 2901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 29141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr if (!s.finalCrop.isEmpty()) { 29241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr win.intersect(s.finalCrop, &win); 29341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr } 29441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr 295e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const sp<Layer>& p = mDrawingParent.promote(); 2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 3071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 3081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 3111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 31813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 3191eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 3206c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 3216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 3226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 3236c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 3246c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 326b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 327b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 328b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 332e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 334de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 335de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 336de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 3371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 3431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 3441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3466c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 3476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 34813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 34913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 351b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 35213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 3531eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 3576b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 3586b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 3596b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 3606b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 3610e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3620e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 363b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 364df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu activeCrop.intersect(s.crop, &activeCrop); 3650e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 3660e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 370acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 371acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 372b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 37341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(s.finalCrop, &activeCrop)) { 374acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 375acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 376acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 377b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 378b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw const auto& p = mDrawingParent.promote(); 379b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw if (p != nullptr) { 380b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw auto parentCrop = p->computeInitialCrop(hw); 381b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw activeCrop.intersect(parentCrop, &activeCrop); 382b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw } 383b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3875a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 3905a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 40013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 40128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 40228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 40328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 40428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 40528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 40628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 407acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 408acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 409acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 41013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 411f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 412f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 413f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 414acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 415acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 416acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 417acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 418cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 419acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 420021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 421021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 422acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 42341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform(); 424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 42641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 42713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 42941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation(); 430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 438acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 439acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 441acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 44341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 445acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 44841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h); 44913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 45141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float xScale = crop.getWidth() / float(winWidth); 452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 45313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 45441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetL = winCrop.left * xScale; 45541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetT = winCrop.top * yScale; 45641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetR = (winWidth - winCrop.right) * xScale; 457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 45941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.left += insetL; 46041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.top += insetT; 46141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.right -= insetR; 462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 46313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 46413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 46513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 46613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 467ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 468a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 4699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 4706f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 471a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 4723e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 4739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 4749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 4769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 4779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 4789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 480dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 48113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 4821eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 483ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 4846452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 48541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman blendMode = 48641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 4879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 488ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 48941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 49041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set blend mode %s:" 49141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " %s (%d)", 49241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(), 49341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 49413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 49513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 49613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 4976c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 4981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 499b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 500b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 5011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 50241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 503acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 50628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 50728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 50828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 50928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 51028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 51128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 51241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 513acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 514acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5156c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 5166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 51741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h)); 51841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom)); 51941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf( 52041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom)); 5216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 5221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 524b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 52541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!frame.intersect(s.finalCrop, &frame)) { 526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 5339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 534ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 535e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 53641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(), 53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.left, transformedFrame.top, transformedFrame.right, 53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error)); 539e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 540e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 541e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5435a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 5449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 545e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 546e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 54741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 54841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom, 54941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 550e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 551e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 552e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 55413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw float alpha = static_cast<float>(getAlpha()); 5556452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 55641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 55741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set plane alpha %.3f: " 55841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 55941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error)); 5609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 561ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 56241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z, 56341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 5642f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 5652a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int type = s.type; 5662a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int appId = s.appId; 567e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> parent = mDrawingParent.promote(); 5682a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk if (parent.get()) { 5692a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk auto& parentState = parent->getDrawingState(); 5702a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk type = parentState.type; 5712a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk appId = parentState.appId; 5722a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk } 5732a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk 5742a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk error = hwcLayer->setInfo(type, appId); 57541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(), 57641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 5779f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 57829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 57929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 58029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 58129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 58229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 58329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 58429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 58529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 58629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 5871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 588c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 589cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 590c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 591021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 593c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 59441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform(); 595c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 596c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 59741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 598c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 599cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 600cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 601cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 602cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 603cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 604cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 605cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 606cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 607c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 60829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 60929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 61013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 6119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 6139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 6159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 6169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 61741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 61841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set transform %s: " 61941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 62041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(transform).c_str(), to_string(error).c_str(), 62141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 623a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 624a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 6259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 6266f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 6279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 6289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6316f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman getBE().mHwcLayers[hwcId].forceClientComposition = true; 6329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 633eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman 634c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) { 6356f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 636c9232edd34618360d099272fb0537cae2f715860chaviw ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId); 637c9232edd34618360d099272fb0537cae2f715860chaviw return false; 638c9232edd34618360d099272fb0537cae2f715860chaviw } 639c9232edd34618360d099272fb0537cae2f715860chaviw 6406f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers[hwcId].forceClientComposition; 641c9232edd34618360d099272fb0537cae2f715860chaviw} 642c9232edd34618360d099272fb0537cae2f715860chaviw 6439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 6449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 6456f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0 || 6469eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman getCompositionType(hwcId) != HWC2::Composition::Cursor) { 6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 652dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 6539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 6549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 6559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 656b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 657b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 6611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 663b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 664b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 665acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6696f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto error = getBE().mHwcLayers[hwcId].layer->setCursorPosition(position.left, 6709eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman position.top); 67141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 67241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set cursor position " 67341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "to (%d, %d): %s (%d)", 67441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), position.left, position.top, to_string(error).c_str(), 67541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 67703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 67813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 67913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 68013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 68113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 682a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const { 683a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, clip, false); 68413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 68513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 686a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const { 687a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform); 68813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 68913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 690a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const { 691a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), false); 692c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 693c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 69441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue, 69541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float alpha) const { 69619733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 6979eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman computeGeometry(renderArea, getBE().mMesh, false); 69819733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 6999eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman engine.drawMesh(getBE().mMesh); 70013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 70113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 702a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const { 70341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman clearWithOpenGL(renderArea, 0, 0, 0, 0); 70413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 70513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 70641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) { 7076f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7116f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 7129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 71341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(), 71441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int>(callIntoHwc)); 7159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 7189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 7199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 72041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 72141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set " 72241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "composition type %s: %s (%d)", 72341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(type).c_str(), to_string(error).c_str(), 72441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 730ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 731ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 732ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 733ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 734ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 7356f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 736ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7396f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers.at(hwcId).compositionType; 7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 7436f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7476f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman getBE().mHwcLayers[hwcId].clearClientTarget = clear; 7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 7516f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers.at(hwcId).clearClientTarget; 7569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 758cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 759cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 760cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 761cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 762cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 7637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 764cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 765cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 766cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 767cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 7687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 7697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 77013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 77113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 77213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 77313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 77413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 77513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 77613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 77713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 77813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 77913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 78013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 78113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 782acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 783acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 784acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 785acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 786acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 787acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 788acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 789acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 790acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 791acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 792acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 793acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 794acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 795acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 796acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 797a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh, 798a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool useIdentityTransform) const { 7991eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 800a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const Transform renderAreaTransform(renderArea.getTransform()); 801a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const uint32_t height = renderArea.getHeight(); 8021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 8033f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 805acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 806acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 807acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 808acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 8091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 8111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 8121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 8131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 8141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 815acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 816acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 817b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 818b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 819b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 820b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 821b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 822acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 823acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 824ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 825a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[0] = renderAreaTransform.transform(lt); 826a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[1] = renderAreaTransform.transform(lb); 827a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[2] = renderAreaTransform.transform(rb); 828a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[3] = renderAreaTransform.transform(rt); 82941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (size_t i = 0; i < 4; i++) { 830a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[i].y = height - position[i].y; 83113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 83213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 833ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 83441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const { 835231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 836231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 837231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 838231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 83913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 84013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 84113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 84213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 84313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 84413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 84513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 84613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 84713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 84813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 84941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) { 85013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 85113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 85213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 85313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 85413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 85513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 85613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 85713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 8587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 8597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 8607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 8617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 8647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 8650d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 8660d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 8670d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 8680d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 8697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 8707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 8717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 8720d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 8733bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 87441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber); 8750d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 876cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 877cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 878cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 879cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 8800d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 881cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 8827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 8857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 886f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 8877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 889f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 8907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 89205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 89305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 89405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 89541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman stateToCommit->flags = 89641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask); 8977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 899f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 9007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 90205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 9037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 9047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 9050d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 9067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 9077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 9087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 9097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 9107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 91105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 9147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 91641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) { 91741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Unexpected sync point frame number found", mName.string()); 918cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 919cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 920cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 921cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 922cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 923cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 924cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 9257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 92705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 9317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 933792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 934792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 93705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 9437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 9447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 9457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 9467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 9477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 9507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 9517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 95313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 9541c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 9551c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 9567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 95705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 95805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 9597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 9607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9621eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h); 965a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 966eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman if (sizeChanged) { 967cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 9689d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 96941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 97041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 97141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n" 97241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 97341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n", 9749eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman this, getName().string(), mCurrentTransform, 9759eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top, 9769eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w, 9779eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right, 9789eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w, 9799eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman s.requested.h); 980a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 9812a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 9822a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 983eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setDefaultBufferSize(c.requested.w, c.requested.h); 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 985cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 986e392b55de711657d2a955b9785588d009b5e922dRobert Carr // Don't let Layer::doTransaction update the drawing state 987e392b55de711657d2a955b9785588d009b5e922dRobert Carr // if we have a pending resize, unless we are in fixed-size mode. 988e392b55de711657d2a955b9785588d009b5e922dRobert Carr // the drawing state will be updated only once we receive a buffer 989e392b55de711657d2a955b9785588d009b5e922dRobert Carr // with the correct size. 990e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 991e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In particular, we want to make sure the clip (which is part 992e392b55de711657d2a955b9785588d009b5e922dRobert Carr // of the geometry state) is latched together with the size but is 993e392b55de711657d2a955b9785588d009b5e922dRobert Carr // latched immediately when no resizing is involved. 994e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 995e392b55de711657d2a955b9785588d009b5e922dRobert Carr // If a sideband stream is attached, however, we want to skip this 996e392b55de711657d2a955b9785588d009b5e922dRobert Carr // optimization so that transactions aren't missed when a buffer 997e392b55de711657d2a955b9785588d009b5e922dRobert Carr // never arrives 998e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 999e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In the case that we don't have a buffer we ignore other factors 1000e392b55de711657d2a955b9785588d009b5e922dRobert Carr // and avoid entering the resizePending state. At a high level the 1001e392b55de711657d2a955b9785588d009b5e922dRobert Carr // resizePending state is to avoid applying the state of the new buffer 1002e392b55de711657d2a955b9785588d009b5e922dRobert Carr // to the old buffer. However in the state where we don't have an old buffer 1003e392b55de711657d2a955b9785588d009b5e922dRobert Carr // there is no such concern but we may still be being used as a parent layer. 100441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) && 10055b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman (getBE().mBuffer != nullptr); 10060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 1007386c22e70d63ecc8bf6ae3e7c2f623f42fcd8718David Sodman if (resizePending && getBE().mSidebandStream == NULL) { 10080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 10090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 10100cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 10110cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 10127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we apply various requested geometry states, depending on our 10137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // latching configuration. See Layer.h for a detailed discussion of 10147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // how geometry latching is controlled. 10157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (!(flags & eDontUpdateGeometryState)) { 10167d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 10177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 10187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize 10197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // mode, which causes attributes which normally latch regardless of scaling mode, 10207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to be delayed. We copy the requested state to the active state making sure 10217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to respect these rules (again see Layer.h for a detailed discussion). 10227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // There is an awkward asymmetry in the handling of the crop states in the position 10247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // states, as can be seen below. Largely this arises from position and transform 10257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // being stored in the same data structure while having different latching rules. 10267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 10277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Careful that "c" and editCurrentState may not begin as equivalent due to 10297bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // applyPendingStates in the presence of deferred transactions. 10307bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mFreezeGeometryUpdates) { 103182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 103282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 103382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 103482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 103582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 103682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 103782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 103882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 103982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 104013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 104113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10421eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 104313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 104413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 104513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 104613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10471eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 104813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 104913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 105013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 105113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 105213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 10533dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 105441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE)); 105513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 105613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1057c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1058c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1059c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1060c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 10611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1062c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1063c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 106505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 107005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1071a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1072a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 107313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 107513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 107613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 107813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 107913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 108013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 108182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 10823dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 108313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 108413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 108569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 108669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 108769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 108869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 10893dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 10907bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 10917bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we directly update the active state 10927bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // unlike other setters, because we store it within 10937bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // the transform, but use different latching rules. 10947bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 109582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 109682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 10977bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 109869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 10997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 110013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 110113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 110213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 110382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 11041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 11051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 11061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 11071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 11081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 11091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 11101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 11111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 11121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 11131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 11141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 11151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1116503c7046237f2797a5cf8584064223359d0e6d10Robert Carrbool Layer::setChildRelativeLayer(const sp<Layer>& childLayer, 1117503c7046237f2797a5cf8584064223359d0e6d10Robert Carr const sp<IBinder>& relativeToHandle, int32_t relativeZ) { 1118503c7046237f2797a5cf8584064223359d0e6d10Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 1119503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (idx < 0) { 1120503c7046237f2797a5cf8584064223359d0e6d10Robert Carr return false; 1121503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1122503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) { 1123503c7046237f2797a5cf8584064223359d0e6d10Robert Carr mCurrentChildren.removeAt(idx); 1124503c7046237f2797a5cf8584064223359d0e6d10Robert Carr mCurrentChildren.add(childLayer); 1125503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1126503c7046237f2797a5cf8584064223359d0e6d10Robert Carr return true; 1127503c7046237f2797a5cf8584064223359d0e6d10Robert Carr} 1128503c7046237f2797a5cf8584064223359d0e6d10Robert Carr 1129ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 113041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.z == z) return false; 113113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 113213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 11337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1134db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1135db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1136db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1137db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1138db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1139db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1140db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1141db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1142db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 114313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 114413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 114513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 11461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1147db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1148db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1149db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1150db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1151db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1152db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1153db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1154db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1155db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1156db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1157db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1158db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1159db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1160db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1161db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) { 1162db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1163db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1164db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1165db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1166db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1167db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1168db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1169db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1170db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1171db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1172db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1173db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.z = z; 1174db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 11759ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote(); 11769ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw if (oldZOrderRelativeOf != nullptr) { 11779ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw oldZOrderRelativeOf->removeZOrderRelative(this); 11789ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw } 1179db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1180db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1181db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1182db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1183db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1184db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1185db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1186db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 118713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 118841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false; 118913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 119013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 11917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 119213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 119313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 119413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 119641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.color.a == alpha) return false; 119713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 119813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = alpha; 11997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 120013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 120113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 120213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 120313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 120413fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) { 120541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g && 120641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman color.b == mCurrentState.color.b) 120713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return false; 120813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 120913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.sequence++; 121013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.r = color.r; 121113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.g = color.g; 121213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.b = color.b; 121313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.modified = true; 121413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw setTransactionFlags(eTransactionNeeded); 121513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return true; 121613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 121713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 121813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 121913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 122041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 12217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 122213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 122313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 122413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 122513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 12262ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 12277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 122913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 123013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 123113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 123213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 123341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.flags == newFlags) return false; 123413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 123513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 12367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 12377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 123813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 123913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 124013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 124199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 124299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 124341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedCrop == crop) return false; 124413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 124599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 12467bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 124799e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 124899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 12497bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 12517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 125213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 125313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 12558d5227b8416b099c884429312daf2d60496fa484Robert Carr 12568d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 125741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedFinalCrop == crop) return false; 1258acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 12598d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 12607bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 12618d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 12628d5227b8416b099c884429312daf2d60496fa484Robert Carr } 12637bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12647bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 1265acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1266acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1267acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1268acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 126913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1270c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 127141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (scalingMode == mOverrideScalingMode) return false; 1272c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 127382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1274c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1275c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1276c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 12772f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 127841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.appId = appId; 127941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.type = type; 128041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.modified = true; 128141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman setTransactionFlags(eTransactionNeeded); 12822f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 12832f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 128413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 128541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.layerStack == layerStack) return false; 128613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 12887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 129013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1291a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1292a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1293bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 129441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.dataSpace == dataSpace) return false; 1295bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1296bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1297bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1298bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1299bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1300bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1301bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 1302532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 1303532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1304532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1305532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 13061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 1307e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu auto p = mDrawingParent.promote(); 13081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 13091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 13101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 13121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 131441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) { 13150d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 13167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 13177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 13187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 13197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 13207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 13210d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1322792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 13237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 13240d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 13250d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 132641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) { 13270d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 13280d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 13297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1331ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 13371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 1338e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& parent = mDrawingParent.promote(); 13391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 13401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 13411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 13431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 134541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const { 134613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 134713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 134813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 134913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 135013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 135103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 135203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 135303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 135413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 135513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 135613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 135713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 135813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 135913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 136013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 136113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 136313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 136413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 136513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 136613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 136713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 136813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 1370eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setTransformHint(orientation); 137113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 137213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 137313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 137513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 137613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1377a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const { 1378a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerDebugInfo info; 1379a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const Layer::State& ds = getDrawingState(); 1380a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mName = getName(); 13811acbec7884a47f316005ba4f2b5e47c74317ee43chaviw sp<Layer> parent = getParent(); 1382a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); 1383a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mType = String8(getTypeId()); 1384a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mTransparentRegion = ds.activeTransparentRegion; 1385a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mVisibleRegion = visibleRegion; 1386a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mSurfaceDamageRegion = surfaceDamageRegion; 1387a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mLayerStack = getLayerStack(); 1388a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mX = ds.active.transform.tx(); 1389a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mY = ds.active.transform.ty(); 1390a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mZ = ds.z; 1391a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mWidth = ds.active.w; 1392a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mHeight = ds.active.h; 1393a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mCrop = ds.crop; 1394a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFinalCrop = ds.finalCrop; 139513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw info.mColor = ds.color; 1396a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFlags = ds.flags; 1397a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mPixelFormat = getPixelFormat(); 1398a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mDataSpace = getDataSpace(); 1399a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][0] = ds.active.transform[0][0]; 1400a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][1] = ds.active.transform[0][1]; 1401a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][0] = ds.active.transform[1][0]; 1402a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][1] = ds.active.transform[1][1]; 1403a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 14045b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman sp<const GraphicBuffer> buffer = getBE().mBuffer; 14055b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (buffer != 0) { 14065b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferWidth = buffer->getWidth(); 14075b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferHeight = buffer->getHeight(); 14085b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferStride = buffer->getStride(); 14095b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferFormat = buffer->format; 1410a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } else { 1411a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = 0; 1412a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = 0; 1413a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = 0; 1414a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = 0; 1415a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 1416bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 1417a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mNumQueuedFrames = getQueuedFrameCount(); 1418a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mRefreshPending = isBufferLatched(); 1419a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mIsOpaque = isOpaque(ds); 1420a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mContentDirty = contentDirty; 1421a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return info; 1422d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 142383ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu 1424e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 1425e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1426e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1427e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 1428e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 1429e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 1430e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 1431e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 1432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1433e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1434e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1435e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1436e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 14376f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 1438e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 1439e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1440e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1441e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 1442e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 1443e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 1444e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 1445e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 1446e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 1447e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 1448e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 1449e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 1450e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1451e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1452e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 1453e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1454e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 14556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId); 14568c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck result.appendFormat(" %10d | ", layerState.z); 145741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str()); 1458e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 145941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom); 14605a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 146141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom); 1462e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1463e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 1464e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 1465e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1466e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1467d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 1468d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 146982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 147082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 1471d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 1472d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 147325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 147425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 14756547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 14766547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 14776547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 14786547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1479d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 1480d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 1481d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 1482d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 1483d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 148441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this); 1485d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1486d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 1487d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 1488d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 1489d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 14905ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 14915ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 14925ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 14935ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 14945ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 14953890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 149641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman FrameEventHistoryDelta* outDelta) { 1497d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1498d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 1499fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // If there are any unsignaled fences in the aquire timeline at this 1500fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // point, the previously queued frame hasn't been latched yet. Go ahead 1501fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // and try to get the signal time here so the syscall is taken out of 1502fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // the main thread's critical path. 1503fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mAcquireTimeline.updateSignalTimes(); 1504fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // Push the new fence after updating since it's likely still pending. 15053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 1506d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 1507d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 150840845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 15093890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 15103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 1511d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 151240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 1513e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 151498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const { 151598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu size_t count = 0; 151698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu for (const sp<Layer>& child : mCurrentChildren) { 151798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu count += 1 + child->getChildrenCount(); 151898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu } 151998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu return count; 152098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu} 152198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu 15221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 15231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 15241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 15251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 15281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 15291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 15301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15321db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 15331db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 15341db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 15351db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 15361db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15371db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15381db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 15391db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 15401db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 15411db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 15421db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15431db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15441db73f66624e7d151710483dd58e03eed672f064Robert Carr 15451db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 1546e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu newParent->addChild(child); 15471db73f66624e7d151710483dd58e03eed672f064Robert Carr 15481db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 15491db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 15501db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 15511db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15521db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15531db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 15541db73f66624e7d151710483dd58e03eed672f064Robert Carr 15551db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 15561db73f66624e7d151710483dd58e03eed672f064Robert Carr} 15571db73f66624e7d151710483dd58e03eed672f064Robert Carr 1558f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) { 1559f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (newParentHandle == nullptr) { 15600617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 15610617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 15620617894190ea0c3ee50889bee1d4df0f369b0761chaviw 15630617894190ea0c3ee50889bee1d4df0f369b0761chaviw auto handle = static_cast<Handle*>(newParentHandle.get()); 15640617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Layer> newParent = handle->owner.promote(); 15650617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (newParent == nullptr) { 15660617894190ea0c3ee50889bee1d4df0f369b0761chaviw ALOGE("Unable to promote Layer handle"); 15670617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 15680617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 15690617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1570f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Layer> parent = getParent(); 1571f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (parent != nullptr) { 1572f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw parent->removeChild(this); 15730617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 1574f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw newParent->addChild(this); 15750617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1576f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Client> client(mClientRef.promote()); 15770617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Client> newParentClient(newParent->mClientRef.promote()); 15780617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1579f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (client != newParentClient) { 1580f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw client->setParentLayer(newParent); 15810617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 15820617894190ea0c3ee50889bee1d4df0f369b0761chaviw 15830617894190ea0c3ee50889bee1d4df0f369b0761chaviw return true; 15840617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 15850617894190ea0c3ee50889bee1d4df0f369b0761chaviw 15869524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 15877f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr for (const sp<Layer>& child : mCurrentChildren) { 1588161410b01a37bcc5522d8e91fe0a743989c86e70chaviw sp<Client> parentClient = mClientRef.promote(); 15899524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 1590161410b01a37bcc5522d8e91fe0a743989c86e70chaviw if (client != nullptr && parentClient != client) { 15917f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr client->detachLayer(child.get()); 15927f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr child->detachChildren(); 15939524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 15947f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr } 15959524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 15969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 15979524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 15989524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 15991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 1600e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mCurrentParent = layer; 16011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 16041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 16051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 16061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 16091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 16101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 16111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 16131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 16161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 16171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 161941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList( 162041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LayerVector::StateSet stateSet) { 1621412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 1622412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 1623412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1624412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1625412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 1626412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 1627db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 1628412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 1629db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 1630db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1631db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 1632db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1633db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1634db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1635412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 1636503c7046237f2797a5cf8584064223359d0e6d10Robert Carr const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState; 1637503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (childState.zOrderRelativeOf != nullptr) { 1638503c7046237f2797a5cf8584064223359d0e6d10Robert Carr continue; 1639503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1640db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 1641db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1642db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1643db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 1644db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1645db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1647db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 16481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1649412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 1650412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 1651db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 1653db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1654db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1655db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 16561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 1657db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1658412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 16591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1660412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 1661db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1662db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1663412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1668db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 16691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1670412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 1671412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 1672412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 1673db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 1675bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson for (i = int32_t(list.size()) - 1; i >= 0; i--) { 1676db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1677db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 16781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 16791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1680412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 16811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1682412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 168341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (; i >= 0; i--) { 1684db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1685412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 16861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1689a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/** 1690a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers. 1691a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */ 1692a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet, 1693a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector::Visitor& visitor) { 1694a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1695a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1696a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 1697a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw size_t i = 0; 1698a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 1699a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 1700a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw if (relative->getZ() >= 0) { 1701a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw break; 1702a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1703a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 1704a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1705a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw visitor(this); 1706a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 1707a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 1708a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 1709a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1710a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw} 1711a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 17121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 17131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 1714e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 17151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 17161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 17179b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 17189b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 17199b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 17209b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 17219b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 17229b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 17235b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (p->isFixedSize() && p->getBE().mBuffer != nullptr) { 17241725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 17251725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 17261725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 17275b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman bufferWidth = p->getBE().mBuffer->getWidth(); 17285b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman bufferHeight = p->getBE().mBuffer->getHeight(); 17291725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 17305b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman bufferHeight = p->getBE().mBuffer->getWidth(); 17315b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman bufferWidth = p->getBE().mBuffer->getHeight(); 17321725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 173341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth); 173441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight); 17359b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 17369b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 17379b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 17389b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 17391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 17411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 174313fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const { 1744e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 17456452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 174613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf; 174713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return parentAlpha * getDrawingState().color.a; 17486452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 17496452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 175013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const { 175113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw const half4 color(getDrawingState().color); 175213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return half4(color.r, color.g, color.b, getAlpha()); 17536452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 17546452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 17551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 17561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 17571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 17581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 17591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 1761e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mDrawingParent = mCurrentParent; 17621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 17641d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) { 17651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 17661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 17671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const State& state = useDrawing ? mDrawingState : mCurrentState; 17681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform = state.active.transform; 17701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform = getTransform(); 17711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_id(sequence); 17731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_name(getName().c_str()); 17741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_type(String8(getTypeId())); 17751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const auto& child : children) { 17771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_children(child->sequence); 17781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 17791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 17811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw sp<Layer> strongRelative = weakRelative.promote(); 17821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (strongRelative != nullptr) { 17831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_relatives(strongRelative->sequence); 17841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 17851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 17861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.activeTransparentRegion, 17881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->mutable_transparent_region()); 17891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region()); 17901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region()); 17911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_layer_stack(getLayerStack()); 17931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z(state.z); 17941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* position = layerInfo->mutable_position(); 17961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_x(transform.tx()); 17971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_y(transform.ty()); 17981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* requestedPosition = layerInfo->mutable_requested_position(); 18001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_x(requestedTransform.tx()); 18011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_y(requestedTransform.ty()); 18021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw SizeProto* size = layerInfo->mutable_size(); 18041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_w(state.active.w); 18051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_h(state.active.h); 18061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop()); 18081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop()); 18091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_is_opaque(isOpaque(state)); 18111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_invalidate(contentDirty); 18121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_dataspace(dataspaceDetails(getDataSpace())); 18131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); 18141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color()); 18151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color()); 18161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_flags(state.flags); 18171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); 18191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform()); 18201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18218e0af3679ec73e07775142825d592448b255f61cJorim Jaggi auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote(); 18221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (parent != nullptr) { 18231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_parent(parent->sequence); 18241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); 18271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (zOrderRelativeOf != nullptr) { 18281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); 18291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18315b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman auto buffer = getBE().mBuffer; 18325b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (buffer != nullptr) { 18335b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman LayerProtoHelper::writeToProto(buffer, layerInfo->mutable_active_buffer()); 18341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_queued_frames(getQueuedFrameCount()); 18371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_refresh_pending(isBufferLatched()); 18381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} 18391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 184013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 184113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 18423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 18453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 18463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 18493f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 18503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 1851