Layer.cpp revision 1148147c4c06d9d5390c7b7c8b0ca5e0c245fc4a
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> 264b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw#include <algorithm> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 34399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 361c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3836c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 393330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 419cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 426b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h> 4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 467c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang#include "BufferLayer.h" 473e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 480f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 507b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 51b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 5341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h" 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 58875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 59c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h" 61c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 6241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 669eeae69005ef9a774bde19195b9c06eba7e463c2David SodmanLayerBE::LayerBE() 670cc69188196037c06127c0bc56c516069dbaa558David Sodman : mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) { 689eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman} 699eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 709eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 7341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w, 7441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t h, uint32_t flags) 750c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman : contentDirty(false), 7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 7813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 790c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mName(name), 8013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 83a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 84399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 85a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 86a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 87c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 88a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 89cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 9082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 9313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9403414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 95a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 98a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 9965476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 10082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 10141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFreezeGeometryUpdates(false) { 1029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 103a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 10641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden; 10741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque; 10841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure; 1094d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1104d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 111f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza mTransactionName = String8("TX - ") + mName; 1124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1150c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mCurrentState.flags = layerFlags; 1163dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 117b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 118b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedFinalCrop = mCurrentState.finalCrop; 1207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedCrop = mCurrentState.crop; 1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 12213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = 1.0f; 1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 12634beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin mCurrentState.dataSpace = ui::Dataspace::UNKNOWN; 1272f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1282f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1326547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1366547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1370a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1390a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 1419eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 142e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 143e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 14441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {} 14596f0819f81293076e652792794a961543e6750d7Mathias Agopian 1464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 147577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman sp<Client> c(mClientRef.promote()); 148577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman if (c != 0) { 149577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman c->detachLayer(this); 150577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman } 151577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman 152577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman for (auto& point : mRemoteSyncPoints) { 153577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman point->setTransactionApplied(); 154577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman } 155577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman for (auto& point : mLocalSyncPoints) { 156577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman point->setFrameAvailable(); 157577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman } 1586547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 15996f0819f81293076e652792794a961543e6750d7Mathias Agopian} 16096f0819f81293076e652792794a961543e6750d7Mathias Agopian 16113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 16213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 16313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 16413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 165eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/* 166eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through 167eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer. So, the implementation is done in BufferLayer. When called on a 168eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP. 169eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */ 170eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {} 17113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 172c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() { 173c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mCurrentState to mLayersPendingRemoval 174c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 1758b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw mPendingRemoval = true; 1768b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw 1775edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1785edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1795edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 1805edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 181c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mFlinger->setTransactionFlags(eTraversalNeeded); 1825edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1835edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1845edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1855edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 186c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu for (const auto& child : mCurrentChildren) { 187c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu child->onRemovedFromCurrentState(); 188c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 189c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu} 1903851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 191c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() { 192c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mLayersPendingRemoval 193eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman abandon(); 194c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 195b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyAllHwcLayers(); 1963851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 1971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 1981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 1991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 20048d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 201cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2061eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 20713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 20813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 20913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 21013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const { 21113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return mPremultipliedAlpha; 21213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 21313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 2144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 2154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 2164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 217582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 218582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 21913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 22013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 22113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 22213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 223b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { 2246f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0, 2259eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman "Already have a layer for hwcId %d", hwcId); 226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWC2::Layer* layer = hwc->createLayer(hwcId); 227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (!layer) { 228b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return false; 229b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2306f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers[hwcId]; 231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc = hwc; 232b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.layer = layer; 233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas layer->setLayerDestroyedListener( 2346f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman [this, hwcId](HWC2::Layer* /*layer*/) { getBE().mHwcLayers.erase(hwcId); }); 235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return true; 236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 23883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wubool Layer::destroyHwcLayer(int32_t hwcId) { 2396f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 24083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return false; 241b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2426f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 24341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer"); 244b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer"); 245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer); 246b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // The layer destroyed listener should have cleared the entry from 247b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // mHwcLayers. Verify that. 2486f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0, 2496f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman "Stale layer entry in getBE().mHwcLayers"); 25083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return true; 251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 252b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 253b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() { 2546f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman size_t numLayers = getBE().mHwcLayers.size(); 255b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas for (size_t i = 0; i < numLayers; ++i) { 2566f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.empty(), "destroyAllHwcLayers failed"); 2576f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman destroyHwcLayer(getBE().mHwcLayers.begin()->first); 258b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2596f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(!getBE().mHwcLayers.empty(), 26041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "All hardware composer layers should have been destroyed"); 261b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 262b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 263a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 264a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 265a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 266f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 267f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 268a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 269f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 270566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin } else if (getBE().compositionInfo.mBuffer != nullptr) { 271a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 2720cc69188196037c06127c0bc56c516069dbaa558David Sodman crop = getBE().compositionInfo.mBuffer->getBounds(); 273f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 274a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 2754fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 276f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 277f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 278f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 279f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 280f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 281f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 282f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 283f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 284f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 285f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 286f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 287f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 288f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 289f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 29080d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stozastatic FloatRect reduce(const FloatRect& win, const Region& exclude) { 29180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza if (CC_LIKELY(exclude.isEmpty())) { 29280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza return win; 29380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza } 29480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza // Convert through Rect (by rounding) for lack of FloatRegion 29580d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza return Region(Rect{win}).subtract(exclude).getBounds().toFloatRect(); 29680d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza} 29780d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza 2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 30941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr if (!s.finalCrop.isEmpty()) { 31041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr win.intersect(s.finalCrop, &win); 31141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr } 31241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr 313e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const sp<Layer>& p = mDrawingParent.promote(); 3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 3181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 3191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 3221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 3261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 3341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 33680d611613ef1a9c05a31cd3f47badfd4de9b1418Dan StozaFloatRect Layer::computeBounds() const { 3371eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 3386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 3396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 3406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 34180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan StozaFloatRect Layer::computeBounds(const Region& activeTransparentRegion) const { 3426c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 34313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 344b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 345b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 346b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 3481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 350e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 3511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 352de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 353de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 354de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 3551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 35880d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza 35980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza FloatRect floatWin = win.toFloatRect(); 3601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 36180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza floatWin = t.transform(floatWin); 36280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza floatWin = floatWin.intersect(bounds.toFloatRect()); 36380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza floatWin = t.inverse().transform(floatWin); 3641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3666c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 36780d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza return reduce(floatWin, activeTransparentRegion); 36813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 36913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 371b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 37213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 3731eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 37413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 37513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 37613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 3776b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 3786b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 3796b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 3806b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 3810e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3820e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 383b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 384df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu activeCrop.intersect(s.crop, &activeCrop); 3850e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 3860e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 389acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 390acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 391acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 392b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 39341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(s.finalCrop, &activeCrop)) { 394acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 395acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 396acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 397b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 398b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw const auto& p = mDrawingParent.promote(); 399b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw if (p != nullptr) { 400b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw auto parentCrop = p->computeInitialCrop(hw); 401b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw activeCrop.intersect(parentCrop, &activeCrop); 402b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw } 403b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4075a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 4105a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 4191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 42013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 42128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 42228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 42328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 42428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 42528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 42628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 43013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 431f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 432f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 433f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 438cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 439acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 440021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 441021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 44341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform(); 444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 445acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 44641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 44713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 44941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation(); 450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 451acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 461acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 46341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 464acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 465acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 467acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 46841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h); 46913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 47141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float xScale = crop.getWidth() / float(winWidth); 472acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 47313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 47441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetL = winCrop.left * xScale; 47541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetT = winCrop.top * yScale; 47641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetR = (winWidth - winCrop.right) * xScale; 477acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 478acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 47941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.left += insetL; 48041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.top += insetT; 48141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.right -= insetR; 482acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 48313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 48413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 48513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 48613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 487ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 488a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 4899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 4906f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 491a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 4923e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 4939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 4949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 4969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 4979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 4989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 500dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 50113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 5021eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 503ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 5046452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 50541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman blendMode = 50641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 5079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 508ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 50941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 51041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set blend mode %s:" 51141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " %s (%d)", 51241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(), 51341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 51413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 51513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 51613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 5176c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 5181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 519b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 520b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 5211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 52241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 523acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 52628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 52728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 52828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 52928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 53028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 53128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 53241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5356c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 5366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h)); 53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom)); 53941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf( 54041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom)); 5416c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 5421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 54380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza // computeBounds returns a FloatRect to provide more accuracy during the 54480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza // transformation. We then round upon constructing 'frame'. 54580d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza Rect frame{t.transform(computeBounds(activeTransparentRegion))}; 546b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 54741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!frame.intersect(s.finalCrop, &frame)) { 548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 553acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 5559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 556ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 557e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 55841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(), 55941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.left, transformedFrame.top, transformedFrame.right, 56041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error)); 561e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 562e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 563e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5655a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 5669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 567e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 568e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 56941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 57041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom, 57141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 572e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 573e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 574e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 57613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw float alpha = static_cast<float>(getAlpha()); 5776452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 57841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 57941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set plane alpha %.3f: " 58041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 58141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error)); 5829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 583ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 58441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z, 58541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 5862f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 5872a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int type = s.type; 5882a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int appId = s.appId; 589e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> parent = mDrawingParent.promote(); 5902a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk if (parent.get()) { 5912a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk auto& parentState = parent->getDrawingState(); 592ccd348460ca25890a8fb709e82e6f780e3ce878erongliu if (parentState.type >= 0 || parentState.appId >= 0) { 593ccd348460ca25890a8fb709e82e6f780e3ce878erongliu type = parentState.type; 594ccd348460ca25890a8fb709e82e6f780e3ce878erongliu appId = parentState.appId; 595ccd348460ca25890a8fb709e82e6f780e3ce878erongliu } 5962a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk } 5972a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk 5982a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk error = hwcLayer->setInfo(type, appId); 59941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(), 60041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6019f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 60229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 60329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 60429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 60529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 60629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 60729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 60829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 60929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 61029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 6111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 612c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 613cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 614c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 615021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 616021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 617c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 61841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform(); 619c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 620c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 62141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 622c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 623cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 624cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 625cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 626cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 627cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 628cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 629cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 630cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 631c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 63229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 63329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 63413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 635f3bd94a776d69730ddb95bbf7104f2fb89d92ae4Jorim Jaggi if (orientation & Transform::ROT_INVALID) { 6369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 6379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 6399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 640068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang hwcInfo.transform = transform; 6419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 64241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 64341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set transform %s: " 64441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 64541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(transform).c_str(), to_string(error).c_str(), 64641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 648a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 649a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 6516f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 6529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 6539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6566f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman getBE().mHwcLayers[hwcId].forceClientComposition = true; 6579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 658eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman 659c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) { 6606f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 661c9232edd34618360d099272fb0537cae2f715860chaviw ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId); 662c9232edd34618360d099272fb0537cae2f715860chaviw return false; 663c9232edd34618360d099272fb0537cae2f715860chaviw } 664c9232edd34618360d099272fb0537cae2f715860chaviw 6656f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers[hwcId].forceClientComposition; 666c9232edd34618360d099272fb0537cae2f715860chaviw} 667c9232edd34618360d099272fb0537cae2f715860chaviw 6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 6706f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0 || 6719eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman getCompositionType(hwcId) != HWC2::Composition::Cursor) { 6729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 677dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 681b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 682b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 6839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 6859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 6861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 688b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 689b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 690acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 6939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6946f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto error = getBE().mHwcLayers[hwcId].layer->setCursorPosition(position.left, 6959eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman position.top); 69641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 69741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set cursor position " 69841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "to (%d, %d): %s (%d)", 69941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), position.left, position.top, to_string(error).c_str(), 70041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 7019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 70203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 70313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 70413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 70513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 70613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 707a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const { 708a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, clip, false); 70913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 71013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 711a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const { 712a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform); 71313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 71413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 715a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const { 716a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), false); 717c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 718c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 71941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue, 72041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float alpha) const { 721144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique auto& engine(mFlinger->getRenderEngine()); 7229eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman computeGeometry(renderArea, getBE().mMesh, false); 72319733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 7249eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman engine.drawMesh(getBE().mMesh); 72513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 72613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 727a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const { 72841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman clearWithOpenGL(renderArea, 0, 0, 0, 0); 72913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 73013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 73141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) { 7326f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7366f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 73841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(), 73941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int>(callIntoHwc)); 7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 74541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 74641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set " 74741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "composition type %s: %s (%d)", 74841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(type).c_str(), to_string(error).c_str(), 74941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 755ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 756ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 757ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 758ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 759ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 7606f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 761ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7646f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers.at(hwcId).compositionType; 7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 7686f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7726f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman getBE().mHwcLayers[hwcId].clearClientTarget = clear; 7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 7766f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7806f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers.at(hwcId).clearClientTarget; 7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 783cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 784cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 785cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 786cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 787cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 7887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 789cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 790cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 791cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 792cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 7937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 7947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 79513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 79613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 79713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 79813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 79913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 80013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 80113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 80213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 80313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 80413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 80513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 80613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 807acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 808acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 809acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 811acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 812acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 813acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 814acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 815acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 816acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 817acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 818acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 819acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 820acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 821acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 822a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh, 823a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool useIdentityTransform) const { 8241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 825a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const Transform renderAreaTransform(renderArea.getTransform()); 826a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const uint32_t height = renderArea.getHeight(); 82780d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza FloatRect win = computeBounds(); 8283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 829acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 830acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 831acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 832acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 833acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 8341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 835acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 8361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 8371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 8381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 8391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 840acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 841acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 842b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 843b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 844b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 845b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 846b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 847acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 848acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 849ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 850a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[0] = renderAreaTransform.transform(lt); 851a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[1] = renderAreaTransform.transform(lb); 852a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[2] = renderAreaTransform.transform(rb); 853a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[3] = renderAreaTransform.transform(rt); 85441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (size_t i = 0; i < 4; i++) { 855a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[i].y = height - position[i].y; 85613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 85713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 858ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 85941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const { 860231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 861231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 862231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 863231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 86413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 86513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 86613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 86713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 86813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 86913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 87013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 87113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 87213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 87313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 87441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) { 87513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 87613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 87713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 87813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 879e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carrvoid Layer::clearVisibilityRegions() { 880e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr visibleRegion.clear(); 881e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr visibleNonTransparentRegion.clear(); 882e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr coveredRegion.clear(); 883e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr} 884e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr 88513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 88613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 88713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 88813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 8897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 8907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 8927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 8957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 8960d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 8970d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 8980d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 8990d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 9007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 9017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 9027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 9030d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 9043bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 90541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber); 9060d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 907cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 908cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 909cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 910cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 9110d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 912cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 9167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 917f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 9187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 920f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 9217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 92305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 92405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 92505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 92641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman stateToCommit->flags = 92741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask); 9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 930f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 9317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 93305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 9347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 9360d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 9377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 9397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 9417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 94205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 9457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 94741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) { 94841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Unexpected sync point frame number found", mName.string()); 949cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 950cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 951cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 952cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 953cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 954cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 955cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 9567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 9577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 95805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 9627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 9637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 964792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 965792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 9667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 96805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 9747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 9757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 9767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 9777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 9787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 9817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 9827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 98413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 9851c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 9861c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 9877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 98805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 98905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 9907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 9917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9931eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h); 996a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 997eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman if (sizeChanged) { 998cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 9999d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 100041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 100141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 100241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n" 100341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 100441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n", 10059eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman this, getName().string(), mCurrentTransform, 10069eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top, 10079eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w, 10089eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right, 10099eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w, 10109eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman s.requested.h); 1011a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 10122a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 10132a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1014eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setDefaultBufferSize(c.requested.w, c.requested.h); 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1016cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 1017e392b55de711657d2a955b9785588d009b5e922dRobert Carr // Don't let Layer::doTransaction update the drawing state 1018e392b55de711657d2a955b9785588d009b5e922dRobert Carr // if we have a pending resize, unless we are in fixed-size mode. 1019e392b55de711657d2a955b9785588d009b5e922dRobert Carr // the drawing state will be updated only once we receive a buffer 1020e392b55de711657d2a955b9785588d009b5e922dRobert Carr // with the correct size. 1021e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1022e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In particular, we want to make sure the clip (which is part 1023e392b55de711657d2a955b9785588d009b5e922dRobert Carr // of the geometry state) is latched together with the size but is 1024e392b55de711657d2a955b9785588d009b5e922dRobert Carr // latched immediately when no resizing is involved. 1025e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1026e392b55de711657d2a955b9785588d009b5e922dRobert Carr // If a sideband stream is attached, however, we want to skip this 1027e392b55de711657d2a955b9785588d009b5e922dRobert Carr // optimization so that transactions aren't missed when a buffer 1028e392b55de711657d2a955b9785588d009b5e922dRobert Carr // never arrives 1029e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1030e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In the case that we don't have a buffer we ignore other factors 1031e392b55de711657d2a955b9785588d009b5e922dRobert Carr // and avoid entering the resizePending state. At a high level the 1032e392b55de711657d2a955b9785588d009b5e922dRobert Carr // resizePending state is to avoid applying the state of the new buffer 1033e392b55de711657d2a955b9785588d009b5e922dRobert Carr // to the old buffer. However in the state where we don't have an old buffer 1034e392b55de711657d2a955b9785588d009b5e922dRobert Carr // there is no such concern but we may still be being used as a parent layer. 103541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) && 10360cc69188196037c06127c0bc56c516069dbaa558David Sodman (getBE().compositionInfo.mBuffer != nullptr); 10370cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 10380cc69188196037c06127c0bc56c516069dbaa558David Sodman if (resizePending && getBE().compositionInfo.hwc.sidebandStream == nullptr) { 10390cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 10400cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 10410cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 10420cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 10437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we apply various requested geometry states, depending on our 10447bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // latching configuration. See Layer.h for a detailed discussion of 10457bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // how geometry latching is controlled. 10467bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (!(flags & eDontUpdateGeometryState)) { 10477d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 10487bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 10497bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize 10507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // mode, which causes attributes which normally latch regardless of scaling mode, 10517bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to be delayed. We copy the requested state to the active state making sure 10527bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to respect these rules (again see Layer.h for a detailed discussion). 10537bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10547bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // There is an awkward asymmetry in the handling of the crop states in the position 10557bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // states, as can be seen below. Largely this arises from position and transform 10567bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // being stored in the same data structure while having different latching rules. 10577bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 10587bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10597bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Careful that "c" and editCurrentState may not begin as equivalent due to 10607bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // applyPendingStates in the presence of deferred transactions. 10617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mFreezeGeometryUpdates) { 106282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 106382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 106482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 106582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 106682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 106782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 106882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 106982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 107082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10731eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 107513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 107613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10781eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 107913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 108013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 108113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 108213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 108313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 10843dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 108541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE)); 108613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 108713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1088c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1089c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1090c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1091c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 10921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1093c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1094c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 109513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 109605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 109713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 110005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 110105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1102a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1103a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 110413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 110513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 110613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 110713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 110813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 110913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 111013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 111113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 111282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 11133dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 111413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 111513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 111669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 111769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 111869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 111969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 11203dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 11217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 11227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we directly update the active state 11237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // unlike other setters, because we store it within 11247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // the transform, but use different latching rules. 11257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 112682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 112782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 11287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 112969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 11307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 113113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 113213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 113313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 113482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 11351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 11361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 11371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 11381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 11391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 11401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 11411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 11421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 1143503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return true; 11441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1145503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return false; 11461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 11471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1148503c7046237f2797a5cf8584064223359d0e6d10Robert Carrbool Layer::setChildRelativeLayer(const sp<Layer>& childLayer, 1149503c7046237f2797a5cf8584064223359d0e6d10Robert Carr const sp<IBinder>& relativeToHandle, int32_t relativeZ) { 1150503c7046237f2797a5cf8584064223359d0e6d10Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 1151503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (idx < 0) { 1152503c7046237f2797a5cf8584064223359d0e6d10Robert Carr return false; 1153503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1154503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) { 1155503c7046237f2797a5cf8584064223359d0e6d10Robert Carr mCurrentChildren.removeAt(idx); 1156503c7046237f2797a5cf8584064223359d0e6d10Robert Carr mCurrentChildren.add(childLayer); 1157503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return true; 1158503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1159503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return false; 1160503c7046237f2797a5cf8584064223359d0e6d10Robert Carr} 1161503c7046237f2797a5cf8584064223359d0e6d10Robert Carr 1162ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 1163503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr if (mCurrentState.z == z && !usingRelativeZ(LayerVector::StateSet::Current)) return false; 116413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 116513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 11667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1167db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1168db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1169db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1170db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1171db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1172db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1173db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1174db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1175db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 117613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 117713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 117813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 11791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1180db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1181db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1182db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1183db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1184db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1185db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1186db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1187db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1188db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1189db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1190db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1191db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1192db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1193db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1194503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ) { 1195db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1196db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1197db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1198db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1199db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1200db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1201db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1202db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1203db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1204503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr if (mCurrentState.z == relativeZ && usingRelativeZ(LayerVector::StateSet::Current) && 1205503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr mCurrentState.zOrderRelativeOf == relative) { 1206503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return false; 1207503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr } 1208503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr 1209db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1210db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1211503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr mCurrentState.z = relativeZ; 1212db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 12139ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote(); 12149ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw if (oldZOrderRelativeOf != nullptr) { 12159ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw oldZOrderRelativeOf->removeZOrderRelative(this); 12169ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw } 1217db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1218db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1219db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1220db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1221db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1222db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1223db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1224db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 122513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 122641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false; 122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 12297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 123013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 123113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 123213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 12339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 123441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.color.a == alpha) return false; 123513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 123613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = alpha; 12377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 123813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 123913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 124013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 124113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 124213fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) { 124341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g && 124441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman color.b == mCurrentState.color.b) 124513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return false; 124613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 124713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.sequence++; 124813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.r = color.r; 124913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.g = color.g; 125013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.b = color.b; 125113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.modified = true; 125213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw setTransactionFlags(eTransactionNeeded); 125313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return true; 125413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 125513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 125613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 125841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 12597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 12642ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 12657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 126613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 126713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 126813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 127013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 127141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.flags == newFlags) return false; 127213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 127313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 12747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 12757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 127613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 127713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 127813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 127999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 128099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 128141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedCrop == crop) return false; 128213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 128399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 12847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 128599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 128699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 12877bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12887bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 12897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 129013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 129113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 129213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 12938d5227b8416b099c884429312daf2d60496fa484Robert Carr 12948d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 129541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedFinalCrop == crop) return false; 1296acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 12978d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 12987bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 12998d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 13008d5227b8416b099c884429312daf2d60496fa484Robert Carr } 13017bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 13027bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 1303acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1304acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1305acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1306acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 130713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1308c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 130941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (scalingMode == mOverrideScalingMode) return false; 1310c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 131182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1312c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1313c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1314c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 1315ccd348460ca25890a8fb709e82e6f780e3ce878erongliuvoid Layer::setInfo(int32_t type, int32_t appId) { 131641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.appId = appId; 131741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.type = type; 131841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.modified = true; 131941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman setTransactionFlags(eTransactionNeeded); 13202f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 13212f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 132213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 132341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.layerStack == layerStack) return false; 132413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 132513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 13267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 132713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 132813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1329a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1330a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 133134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linbool Layer::setDataSpace(ui::Dataspace dataSpace) { 133241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.dataSpace == dataSpace) return false; 1333bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1334bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1335bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1336bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1337bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1338bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1339bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 134034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linui::Dataspace Layer::getDataSpace() const { 1341532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1342532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1343532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 13441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 1345e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu auto p = mDrawingParent.promote(); 13461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 13471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 13481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 13501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 135241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) { 13530d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 13547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 13557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 13567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 13577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 13587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 13590d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1360792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 13617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 13620d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 13630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 136441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) { 13650d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 13660d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 13677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1369ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 13751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 1376e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& parent = mDrawingParent.promote(); 13771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 13781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 13791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 13811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 138341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const { 138413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 138513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 138613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 138713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 138903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 139003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 139103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 139713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 139913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 140013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 140213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 140413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 140513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 140613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 140713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 1408eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setTransformHint(orientation); 140913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 141013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 141113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 141213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 141313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 141413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1415a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const { 1416a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerDebugInfo info; 1417a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const Layer::State& ds = getDrawingState(); 1418a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mName = getName(); 14191acbec7884a47f316005ba4f2b5e47c74317ee43chaviw sp<Layer> parent = getParent(); 1420a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); 1421a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mType = String8(getTypeId()); 1422a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mTransparentRegion = ds.activeTransparentRegion; 1423a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mVisibleRegion = visibleRegion; 1424a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mSurfaceDamageRegion = surfaceDamageRegion; 1425a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mLayerStack = getLayerStack(); 1426a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mX = ds.active.transform.tx(); 1427a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mY = ds.active.transform.ty(); 1428a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mZ = ds.z; 1429a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mWidth = ds.active.w; 1430a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mHeight = ds.active.h; 1431a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mCrop = ds.crop; 1432a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFinalCrop = ds.finalCrop; 143313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw info.mColor = ds.color; 1434a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFlags = ds.flags; 1435a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mPixelFormat = getPixelFormat(); 143634beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin info.mDataSpace = static_cast<android_dataspace>(getDataSpace()); 1437a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][0] = ds.active.transform[0][0]; 1438a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][1] = ds.active.transform[0][1]; 1439a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][0] = ds.active.transform[1][0]; 1440a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][1] = ds.active.transform[1][1]; 1441a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 14420cc69188196037c06127c0bc56c516069dbaa558David Sodman sp<const GraphicBuffer> buffer = getBE().compositionInfo.mBuffer; 14435b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (buffer != 0) { 14445b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferWidth = buffer->getWidth(); 14455b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferHeight = buffer->getHeight(); 14465b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferStride = buffer->getStride(); 14475b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferFormat = buffer->format; 1448a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } else { 1449a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = 0; 1450a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = 0; 1451a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = 0; 1452a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = 0; 1453a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 1454bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 1455a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mNumQueuedFrames = getQueuedFrameCount(); 1456a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mRefreshPending = isBufferLatched(); 1457a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mIsOpaque = isOpaque(ds); 1458a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mContentDirty = contentDirty; 1459a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return info; 1460d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 146183ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu 1462e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 1463e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1464e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1465e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 1466e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 1467e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 1468e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 1469e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 1470e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1471e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1472e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1473e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1474e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 14756f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 1476e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 1477e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1478e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1479e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 1480e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 1481e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 1482e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 1483e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 1484e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 1485e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 1486e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 1487e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 1488e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1489e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1490e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 1491e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1492e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 14936f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId); 14941e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu if (layerState.zOrderRelativeOf != nullptr || mDrawingParent != nullptr) { 14951e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu result.appendFormat(" rel %6d | ", layerState.z); 14961e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu } else { 14971e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu result.appendFormat(" %10d | ", layerState.z); 14981e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu } 149941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str()); 1500e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 150141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom); 15025a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 150341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom); 1504e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1505e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 1506e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 1507e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1508e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1509d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 1510d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 151182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 151282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 1513d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 1514d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 151525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 151625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 15176547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 15186547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 15196547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 15206547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1521d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 1522d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 1523d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 1524d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 1525d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 152641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this); 1527d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1528d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 1529d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 1530d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 1531d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 15325ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 15335ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 15345ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 15350102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang mTimeStats.onDisconnect(getName().c_str()); 15365ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 15375ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 15383890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 153941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman FrameEventHistoryDelta* outDelta) { 15400102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang if (newTimestamps) { 15410102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang mTimeStats.setPostTime(getName().c_str(), newTimestamps->frameNumber, 15420102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang newTimestamps->postedTime); 15430102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang } 15440102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 1545d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1546d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 1547fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // If there are any unsignaled fences in the aquire timeline at this 1548fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // point, the previously queued frame hasn't been latched yet. Go ahead 1549fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // and try to get the signal time here so the syscall is taken out of 1550fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // the main thread's critical path. 1551fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mAcquireTimeline.updateSignalTimes(); 1552fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // Push the new fence after updating since it's likely still pending. 15533d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 1554d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 1555d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 155640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 15573890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 15583890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 1559d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 156040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 1561e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 156298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const { 156398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu size_t count = 0; 156498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu for (const sp<Layer>& child : mCurrentChildren) { 156598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu count += 1 + child->getChildrenCount(); 156698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu } 156798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu return count; 156898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu} 156998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu 15701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 15711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 15721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 15731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 15761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 15771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 15781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15801db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 15811db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 15821db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 15831db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 15841db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15851db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15861db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 15871db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 15881db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 15891db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 15901db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15911db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15921db73f66624e7d151710483dd58e03eed672f064Robert Carr 15931db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 1594e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu newParent->addChild(child); 15951db73f66624e7d151710483dd58e03eed672f064Robert Carr 15961db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 15971db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 159894c7d3d948beff287eed53e6d841e29e05cad8b3Robert Carr client->updateParent(newParent); 15991db73f66624e7d151710483dd58e03eed672f064Robert Carr } 16001db73f66624e7d151710483dd58e03eed672f064Robert Carr } 16011db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 16021db73f66624e7d151710483dd58e03eed672f064Robert Carr 16031db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 16041db73f66624e7d151710483dd58e03eed672f064Robert Carr} 16051db73f66624e7d151710483dd58e03eed672f064Robert Carr 160615eae09ebb293135dedce203bcb542a2e6e8d43aRobert Carrvoid Layer::setChildrenDrawingParent(const sp<Layer>& newParent) { 1607578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr for (const sp<Layer>& child : mDrawingChildren) { 1608578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr child->mDrawingParent = newParent; 1609578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr } 1610578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr} 1611578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr 1612f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) { 1613f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (newParentHandle == nullptr) { 16140617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 16150617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 16160617894190ea0c3ee50889bee1d4df0f369b0761chaviw 16170617894190ea0c3ee50889bee1d4df0f369b0761chaviw auto handle = static_cast<Handle*>(newParentHandle.get()); 16180617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Layer> newParent = handle->owner.promote(); 16190617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (newParent == nullptr) { 16200617894190ea0c3ee50889bee1d4df0f369b0761chaviw ALOGE("Unable to promote Layer handle"); 16210617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 16220617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 16230617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1624f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Layer> parent = getParent(); 1625f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (parent != nullptr) { 1626f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw parent->removeChild(this); 16270617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 1628f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw newParent->addChild(this); 16290617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1630f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Client> client(mClientRef.promote()); 16310617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Client> newParentClient(newParent->mClientRef.promote()); 16320617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1633f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (client != newParentClient) { 163494c7d3d948beff287eed53e6d841e29e05cad8b3Robert Carr client->updateParent(newParent); 16350617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 16360617894190ea0c3ee50889bee1d4df0f369b0761chaviw 16370617894190ea0c3ee50889bee1d4df0f369b0761chaviw return true; 16380617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 16390617894190ea0c3ee50889bee1d4df0f369b0761chaviw 16409524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 16417f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr for (const sp<Layer>& child : mCurrentChildren) { 1642161410b01a37bcc5522d8e91fe0a743989c86e70chaviw sp<Client> parentClient = mClientRef.promote(); 16439524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 1644161410b01a37bcc5522d8e91fe0a743989c86e70chaviw if (client != nullptr && parentClient != client) { 16457f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr client->detachLayer(child.get()); 16467f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr child->detachChildren(); 16479524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 16487f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr } 16499524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 16509524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 16519524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 16529524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 16531148147c4c06d9d5390c7b7c8b0ca5e0c245fc4aChia-I Wubool Layer::isLegacyDataSpace() const { 16541148147c4c06d9d5390c7b7c8b0ca5e0c245fc4aChia-I Wu // return true when no higher bits are set 16551148147c4c06d9d5390c7b7c8b0ca5e0c245fc4aChia-I Wu return !(mDrawingState.dataSpace & (ui::Dataspace::STANDARD_MASK | 16561148147c4c06d9d5390c7b7c8b0ca5e0c245fc4aChia-I Wu ui::Dataspace::TRANSFER_MASK | ui::Dataspace::RANGE_MASK)); 1657dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 1658dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 16591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 1660e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mCurrentParent = layer; 16611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 16661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 16691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 16701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 16711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 16731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 16761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 167929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carrbool Layer::usingRelativeZ(LayerVector::StateSet stateSet) { 168029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 168129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr const State& state = useDrawing ? mDrawingState : mCurrentState; 168229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr return state.zOrderRelativeOf != nullptr; 168329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr} 168429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 168541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList( 168629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr LayerVector::StateSet stateSet, bool* outSkipRelativeZUsers) { 1687412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 1688412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 1689412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1690412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1691412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 1692412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 169329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (state.zOrderRelatives.size() == 0) { 169429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr *outSkipRelativeZUsers = true; 169529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr return children; 169629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 169729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1698db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 1699412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 1700db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 1701db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1702db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 1703db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1704db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1705db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1706412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 1707503c7046237f2797a5cf8584064223359d0e6d10Robert Carr const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState; 1708503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (childState.zOrderRelativeOf != nullptr) { 1709503c7046237f2797a5cf8584064223359d0e6d10Robert Carr continue; 1710503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1711db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 1712db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1713db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1714db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 1715db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1716db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 17171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1718db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 17191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1720412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 172129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // In the case we have other layers who are using a relative Z to us, makeTraversalList will 172229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // produce a new list for traversing, including our relatives, and not including our children 172329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // who are relatives of another surface. In the case that there are no relative Z, 172429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // makeTraversalList returns our children directly to avoid significant overhead. 172529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // However in this case we need to take the responsibility for filtering children which 172629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // are relatives of another surface here. 172729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr bool skipRelativeZUsers = false; 172829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr const LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers); 1729db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 17301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 1731db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1732db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 173329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 173429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 173529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 173629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1737db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 17381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 1739db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1740412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 17411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 174229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1743412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 1744db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1745db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 174629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 174729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 174829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 174929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 1750412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 17511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 17541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1755db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 17561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1757412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 1758412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 175929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // See traverseInZOrder for documentation. 176029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr bool skipRelativeZUsers = false; 176129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers); 1762db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 17631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 1764bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson for (i = int32_t(list.size()) - 1; i >= 0; i--) { 1765db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 176629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 176729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 176829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 176929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 177029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1771db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 17721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 17731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1774412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 17751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1776412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 177741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (; i >= 0; i--) { 1778db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 177929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 178029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 178129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 178229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 178329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1784412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 17851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 17884b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviwLayerVector Layer::makeChildrenTraversalList(LayerVector::StateSet stateSet, 17894b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const std::vector<Layer*>& layersInTree) { 17904b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 17914b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw "makeTraversalList received invalid stateSet"); 1792a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1793a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 17944b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const State& state = useDrawing ? mDrawingState : mCurrentState; 17954b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 17964b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw LayerVector traverse; 17974b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 17984b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw sp<Layer> strongRelative = weakRelative.promote(); 17994b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw // Only add relative layers that are also descendents of the top most parent of the tree. 18004b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw // If a relative layer is not a descendent, then it should be ignored. 18014b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw if (std::binary_search(layersInTree.begin(), layersInTree.end(), strongRelative.get())) { 18024b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw traverse.add(strongRelative); 18034b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw } 18044b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw } 18054b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18064b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw for (const sp<Layer>& child : children) { 18074b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState; 18084b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw // If a layer has a relativeOf layer, only ignore if the layer it's relative to is a 18094b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw // descendent of the top most parent of the tree. If it's not a descendent, then just add 18104b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw // the child here since it won't be added later as a relative. 18114b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw if (std::binary_search(layersInTree.begin(), layersInTree.end(), 18124b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw childState.zOrderRelativeOf.promote().get())) { 18134b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw continue; 18144b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw } 18154b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw traverse.add(child); 18164b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw } 18174b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18184b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw return traverse; 18194b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw} 18204b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18214b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviwvoid Layer::traverseChildrenInZOrderInner(const std::vector<Layer*>& layersInTree, 18224b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw LayerVector::StateSet stateSet, 18234b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const LayerVector::Visitor& visitor) { 18244b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const LayerVector list = makeChildrenTraversalList(stateSet, layersInTree); 1825a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 1826a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw size_t i = 0; 18274b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw for (; i < list.size(); i++) { 18284b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const auto& relative = list[i]; 1829a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw if (relative->getZ() >= 0) { 1830a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw break; 1831a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 18324b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw relative->traverseChildrenInZOrderInner(layersInTree, stateSet, visitor); 1833a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 18344b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 1835a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw visitor(this); 18364b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw for (; i < list.size(); i++) { 18374b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const auto& relative = list[i]; 18384b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw relative->traverseChildrenInZOrderInner(layersInTree, stateSet, visitor); 18394b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw } 18404b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw} 18414b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18424b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviwstd::vector<Layer*> Layer::getLayersInTree(LayerVector::StateSet stateSet) { 18434b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 18444b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 18454b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18464b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw std::vector<Layer*> layersInTree = {this}; 18474b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw for (size_t i = 0; i < children.size(); i++) { 18484b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const auto& child = children[i]; 18494b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw std::vector<Layer*> childLayers = child->getLayersInTree(stateSet); 18504b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw layersInTree.insert(layersInTree.end(), childLayers.cbegin(), childLayers.cend()); 1851a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 18524b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18534b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw return layersInTree; 18544b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw} 18554b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw 18564b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet, 18574b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw const LayerVector::Visitor& visitor) { 18584b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw std::vector<Layer*> layersInTree = getLayersInTree(stateSet); 18594b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw std::sort(layersInTree.begin(), layersInTree.end()); 18604b129c2e3f581ad2d8d18c99dc7b0c5bff3bd348chaviw traverseChildrenInZOrderInner(layersInTree, stateSet, visitor); 1861a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw} 1862a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 18631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 18641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 1865e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 18661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 18671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 18689b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 18699b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 18709b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 18719b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 18729b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 18739b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 18740cc69188196037c06127c0bc56c516069dbaa558David Sodman if (p->isFixedSize() && p->getBE().compositionInfo.mBuffer != nullptr) { 18751725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 18761725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 18771725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 18780cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferWidth = p->getBE().compositionInfo.mBuffer->getWidth(); 18790cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferHeight = p->getBE().compositionInfo.mBuffer->getHeight(); 18801725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 18810cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferHeight = p->getBE().compositionInfo.mBuffer->getWidth(); 18820cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferWidth = p->getBE().compositionInfo.mBuffer->getHeight(); 18831725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 188441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth); 188541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight); 18869b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 18879b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 18889b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 18899b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 18901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 18921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 189413fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const { 1895e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 18966452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 189713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf; 189813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return parentAlpha * getDrawingState().color.a; 18996452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 19006452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 190113fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const { 190213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw const half4 color(getDrawingState().color); 190313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return half4(color.r, color.g, color.b, getAlpha()); 19046452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 19056452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 19061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 19071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 19081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 19091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 19101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 1912e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mDrawingParent = mCurrentParent; 19131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 19151d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) { 19161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 19171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 19181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const State& state = useDrawing ? mDrawingState : mCurrentState; 19191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform = state.active.transform; 19211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform = getTransform(); 19221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_id(sequence); 19241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_name(getName().c_str()); 19251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_type(String8(getTypeId())); 19261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const auto& child : children) { 19281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_children(child->sequence); 19291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 19321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw sp<Layer> strongRelative = weakRelative.promote(); 19331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (strongRelative != nullptr) { 19341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_relatives(strongRelative->sequence); 19351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.activeTransparentRegion, 19391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->mutable_transparent_region()); 19401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region()); 19411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region()); 19421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_layer_stack(getLayerStack()); 19441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z(state.z); 19451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* position = layerInfo->mutable_position(); 19471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_x(transform.tx()); 19481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_y(transform.ty()); 19491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* requestedPosition = layerInfo->mutable_requested_position(); 19511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_x(requestedTransform.tx()); 19521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_y(requestedTransform.ty()); 19531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw SizeProto* size = layerInfo->mutable_size(); 19551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_w(state.active.w); 19561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_h(state.active.h); 19571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop()); 19591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop()); 19601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_is_opaque(isOpaque(state)); 19621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_invalidate(contentDirty); 196334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin layerInfo->set_dataspace(dataspaceDetails(static_cast<android_dataspace>(getDataSpace()))); 19641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); 19651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color()); 19661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color()); 19671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_flags(state.flags); 19681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); 19701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform()); 19711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19728e0af3679ec73e07775142825d592448b255f61cJorim Jaggi auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote(); 19731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (parent != nullptr) { 19741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_parent(parent->sequence); 19751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); 19781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (zOrderRelativeOf != nullptr) { 19791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); 19801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19820cc69188196037c06127c0bc56c516069dbaa558David Sodman auto buffer = getBE().compositionInfo.mBuffer; 19835b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (buffer != nullptr) { 19845b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman LayerProtoHelper::writeToProto(buffer, layerInfo->mutable_active_buffer()); 19851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_queued_frames(getQueuedFrameCount()); 19881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_refresh_pending(isBufferLatched()); 1989ccd348460ca25890a8fb709e82e6f780e3ce878erongliu layerInfo->set_window_type(state.type); 1990ccd348460ca25890a8fb709e82e6f780e3ce878erongliu layerInfo->set_app_id(state.appId); 19911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} 19921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1993068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhangvoid Layer::writeToProto(LayerProto* layerInfo, int32_t hwcId) { 1994068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang writeToProto(layerInfo, LayerVector::StateSet::Drawing); 1995068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 1996068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang const auto& hwcInfo = getBE().mHwcLayers.at(hwcId); 1997068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 1998068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang const Rect& frame = hwcInfo.displayFrame; 1999068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang LayerProtoHelper::writeToProto(frame, layerInfo->mutable_hwc_frame()); 2000068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 2001068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang const FloatRect& crop = hwcInfo.sourceCrop; 2002068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang LayerProtoHelper::writeToProto(crop, layerInfo->mutable_hwc_crop()); 2003068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 2004068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang const int32_t transform = static_cast<int32_t>(hwcInfo.transform); 2005068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang layerInfo->set_hwc_transform(transform); 20067c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang 20077c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang const int32_t compositionType = static_cast<int32_t>(hwcInfo.compositionType); 20087c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang layerInfo->set_hwc_composition_type(compositionType); 20097c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang 20107c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang if (std::strcmp(getTypeId(), "BufferLayer") == 0 && 20117c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang static_cast<BufferLayer*>(this)->isProtected()) { 20127c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang layerInfo->set_is_protected(true); 20137c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang } else { 20147c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang layerInfo->set_is_protected(false); 20157c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang } 2016068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang} 2017068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 201813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 201913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 20203f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 20233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 20243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 20273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 20283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2029