Layer.cpp revision f3bd94a776d69730ddb95bbf7104f2fb89d92ae4
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer" 201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 42a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h> 4390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 453e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 487b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 5141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h" 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h" 59c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 6041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 649eeae69005ef9a774bde19195b9c06eba7e463c2David SodmanLayerBE::LayerBE() 650cc69188196037c06127c0bc56c516069dbaa558David Sodman : mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) { 669eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman} 679eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 689eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 7141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w, 7241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t h, uint32_t flags) 730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman : contentDirty(false), 7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 770c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mName(name), 7813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 82399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 83a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 85c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 86a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 87cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 8882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 8913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 93a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 94a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 95a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 9765476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 9882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 9941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFreezeGeometryUpdates(false) { 1009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 101a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1024d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 10441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden; 10541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque; 10641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure; 1074d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 109f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza mTransactionName = String8("TX - ") + mName; 1104d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1114d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1130c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mCurrentState.flags = layerFlags; 1143dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 115b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 116b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedFinalCrop = mCurrentState.finalCrop; 1187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedCrop = mCurrentState.crop; 1194d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 12013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = 1.0f; 1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 124bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1252f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1262f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1306547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1346547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1360a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1370a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 1399eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman 140e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 141e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 14241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {} 14396f0819f81293076e652792794a961543e6750d7Mathias Agopian 1444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 145577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman sp<Client> c(mClientRef.promote()); 146577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman if (c != 0) { 147577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman c->detachLayer(this); 148577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman } 149577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman 150577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman for (auto& point : mRemoteSyncPoints) { 151577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman point->setTransactionApplied(); 152577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman } 153577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman for (auto& point : mLocalSyncPoints) { 154577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman point->setFrameAvailable(); 155577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman } 1566547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 15796f0819f81293076e652792794a961543e6750d7Mathias Agopian} 15896f0819f81293076e652792794a961543e6750d7Mathias Agopian 15913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 16013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 16113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 16213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 163eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/* 164eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through 165eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer. So, the implementation is done in BufferLayer. When called on a 166eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP. 167eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */ 168eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {} 16913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 170c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() { 171c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mCurrentState to mLayersPendingRemoval 172c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 1738b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw mPendingRemoval = true; 1748b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw 1755edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1765edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1775edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 1785edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 179c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mFlinger->setTransactionFlags(eTraversalNeeded); 1805edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1815edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1825edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1835edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 184c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu for (const auto& child : mCurrentChildren) { 185c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu child->onRemovedFromCurrentState(); 186c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 187c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu} 1883851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 189c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() { 190c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mLayersPendingRemoval 191eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman abandon(); 192c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 193b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyAllHwcLayers(); 1943851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 1951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 1961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 1971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19848d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 199cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 20013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 20613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 20713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 20813fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const { 20913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return mPremultipliedAlpha; 21013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 21113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 2124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 2134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 2144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 215582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 216582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 21713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 21913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 22013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { 2226f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0, 2239eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman "Already have a layer for hwcId %d", hwcId); 224b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWC2::Layer* layer = hwc->createLayer(hwcId); 225b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (!layer) { 226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return false; 227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2286f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers[hwcId]; 229b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc = hwc; 230b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.layer = layer; 231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas layer->setLayerDestroyedListener( 2326f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman [this, hwcId](HWC2::Layer* /*layer*/) { getBE().mHwcLayers.erase(hwcId); }); 233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return true; 234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 23683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wubool Layer::destroyHwcLayer(int32_t hwcId) { 2376f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 23883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return false; 239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2406f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 24141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer"); 242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer"); 243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer); 244b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // The layer destroyed listener should have cleared the entry from 245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // mHwcLayers. Verify that. 2466f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0, 2476f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman "Stale layer entry in getBE().mHwcLayers"); 24883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return true; 249b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 250b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() { 2526f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman size_t numLayers = getBE().mHwcLayers.size(); 253b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas for (size_t i = 0; i < numLayers; ++i) { 2546f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.empty(), "destroyAllHwcLayers failed"); 2556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman destroyHwcLayer(getBE().mHwcLayers.begin()->first); 256b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 2576f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman LOG_ALWAYS_FATAL_IF(!getBE().mHwcLayers.empty(), 25841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "All hardware composer layers should have been destroyed"); 259b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 260b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 261a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 262a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 263a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 264f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 265f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 266a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 267f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 268566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin } else if (getBE().compositionInfo.mBuffer != nullptr) { 269a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 2700cc69188196037c06127c0bc56c516069dbaa558David Sodman crop = getBE().compositionInfo.mBuffer->getBounds(); 271f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 272a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 2734fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 274f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 275f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 276f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 277f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 278f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 279f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 280f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 281f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 282f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 283f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 284f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 285f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 286f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 287f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 28880d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stozastatic FloatRect reduce(const FloatRect& win, const Region& exclude) { 28980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza if (CC_LIKELY(exclude.isEmpty())) { 29080d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza return win; 29180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza } 29280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza // Convert through Rect (by rounding) for lack of FloatRegion 29380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza return Region(Rect{win}).subtract(exclude).getBounds().toFloatRect(); 29480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza} 29580d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza 2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 30741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr if (!s.finalCrop.isEmpty()) { 30841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr win.intersect(s.finalCrop, &win); 30941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr } 31041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr 311e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const sp<Layer>& p = mDrawingParent.promote(); 3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 3181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 3191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 33480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan StozaFloatRect Layer::computeBounds() const { 3351eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 3366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 3376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 3386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 33980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan StozaFloatRect Layer::computeBounds(const Region& activeTransparentRegion) const { 3406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 342b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 343b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 344b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 3461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 348e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 3491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 350de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 351de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 352de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 3531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 35680d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza 35780d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza FloatRect floatWin = win.toFloatRect(); 3581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 35980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza floatWin = t.transform(floatWin); 36080d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza floatWin = floatWin.intersect(bounds.toFloatRect()); 36180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza floatWin = t.inverse().transform(floatWin); 3621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3646c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 36580d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza return reduce(floatWin, activeTransparentRegion); 36613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 36713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 369b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 37013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 3711eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 37213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 37313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 37413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 3756b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 3766b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 3776b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 3786b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 3790e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3800e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 381b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 382df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu activeCrop.intersect(s.crop, &activeCrop); 3830e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 3840e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 387acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 388acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 389acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 390b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 39141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(s.finalCrop, &activeCrop)) { 392acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 393acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 394acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 395b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 396b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw const auto& p = mDrawingParent.promote(); 397b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw if (p != nullptr) { 398b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw auto parentCrop = p->computeInitialCrop(hw); 399b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw activeCrop.intersect(parentCrop, &activeCrop); 400b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw } 401b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4055a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 4085a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 41813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 41928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 42028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 42128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 42228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 42328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 42428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 42813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 429f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 430f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 431f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 436cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 438021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 439021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 44141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform(); 442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 443acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 44441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 44513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 44741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation(); 448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 451acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 46141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 464acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 465acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 46641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h); 46713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 46941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float xScale = crop.getWidth() / float(winWidth); 470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 47113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 47241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetL = winCrop.left * xScale; 47341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetT = winCrop.top * yScale; 47441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetR = (winWidth - winCrop.right) * xScale; 475acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 476acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 47741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.left += insetL; 47841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.top += insetT; 47941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.right -= insetR; 480acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 48113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 48213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 48313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 48413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 485ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 486a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 4879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 4886f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 489a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 4903e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 4919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 4929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 4949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 4959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 4969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 498dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 49913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 5001eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 501ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 5026452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 50341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman blendMode = 50441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 5059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 506ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 50741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 50841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set blend mode %s:" 50941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " %s (%d)", 51041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(), 51141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 51213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 51313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 51413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 5156c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 5161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 517b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 518b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 5191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 52041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 522acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 52428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 52528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 52628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 52728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 52828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 52928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 53041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5336c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 5346c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 53541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h)); 53641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom)); 53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf( 53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom)); 5396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 5401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 54180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza // computeBounds returns a FloatRect to provide more accuracy during the 54280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza // transformation. We then round upon constructing 'frame'. 54380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza Rect frame{t.transform(computeBounds(activeTransparentRegion))}; 544b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 54541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!frame.intersect(s.finalCrop, &frame)) { 546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 5539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 554ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 555e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 55641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(), 55741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.left, transformedFrame.top, transformedFrame.right, 55841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error)); 559e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 560e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 561e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5635a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 5649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 565e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 566e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 56741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 56841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom, 56941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 570e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 571e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 572e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 57413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw float alpha = static_cast<float>(getAlpha()); 5756452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 57641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 57741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set plane alpha %.3f: " 57841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 57941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error)); 5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 581ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 58241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z, 58341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 5842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 5852a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int type = s.type; 5862a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int appId = s.appId; 587e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> parent = mDrawingParent.promote(); 5882a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk if (parent.get()) { 5892a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk auto& parentState = parent->getDrawingState(); 590ccd348460ca25890a8fb709e82e6f780e3ce878erongliu if (parentState.type >= 0 || parentState.appId >= 0) { 591ccd348460ca25890a8fb709e82e6f780e3ce878erongliu type = parentState.type; 592ccd348460ca25890a8fb709e82e6f780e3ce878erongliu appId = parentState.appId; 593ccd348460ca25890a8fb709e82e6f780e3ce878erongliu } 5942a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk } 5952a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk 5962a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk error = hwcLayer->setInfo(type, appId); 59741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(), 59841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 5999f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 60029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 60129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 60229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 60329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 60429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 60529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 60629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 60729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 60829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 6091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 610c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 611cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 612c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 613021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 614021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 615c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 61641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform(); 617c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 618c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 61941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 620c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 621cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 622cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 623cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 624cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 625cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 626cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 627cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 628cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 629c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 63029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 63129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 63213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 633f3bd94a776d69730ddb95bbf7104f2fb89d92ae4Jorim Jaggi if (orientation & Transform::ROT_INVALID) { 6349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 6359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 6379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 6389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 63941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 64041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set transform %s: " 64141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 64241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(transform).c_str(), to_string(error).c_str(), 64341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 645a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 646a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 6486f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6536f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman getBE().mHwcLayers[hwcId].forceClientComposition = true; 6549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 655eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman 656c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) { 6576f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 658c9232edd34618360d099272fb0537cae2f715860chaviw ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId); 659c9232edd34618360d099272fb0537cae2f715860chaviw return false; 660c9232edd34618360d099272fb0537cae2f715860chaviw } 661c9232edd34618360d099272fb0537cae2f715860chaviw 6626f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers[hwcId].forceClientComposition; 663c9232edd34618360d099272fb0537cae2f715860chaviw} 664c9232edd34618360d099272fb0537cae2f715860chaviw 6659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 6676f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0 || 6689eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman getCompositionType(hwcId) != HWC2::Composition::Cursor) { 6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 6739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 674dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 6779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 678b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 679b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 6829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 6831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 6849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 685b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 686b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 687acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6916f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto error = getBE().mHwcLayers[hwcId].layer->setCursorPosition(position.left, 6929eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman position.top); 69341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 69441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set cursor position " 69541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "to (%d, %d): %s (%d)", 69641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), position.left, position.top, to_string(error).c_str(), 69741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 69903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 70013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 70113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 70213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 70313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 704a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const { 705a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, clip, false); 70613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 70713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 708a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const { 709a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform); 71013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 71113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 712a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const { 713a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), false); 714c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 715c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 71641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue, 71741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float alpha) const { 718144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique auto& engine(mFlinger->getRenderEngine()); 7199eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman computeGeometry(renderArea, getBE().mMesh, false); 72019733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 7219eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman engine.drawMesh(getBE().mMesh); 72213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 72313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 724a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const { 72541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman clearWithOpenGL(renderArea, 0, 0, 0, 0); 72613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 72713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 72841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) { 7296f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 7319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7336f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman auto& hwcInfo = getBE().mHwcLayers[hwcId]; 7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 73541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(), 73641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int>(callIntoHwc)); 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 74241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 74341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set " 74441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "composition type %s: %s (%d)", 74541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(type).c_str(), to_string(error).c_str(), 74641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 752ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 753ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 754ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 755ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 756ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 7576f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 758ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 7609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7616f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers.at(hwcId).compositionType; 7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 7656f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7696f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman getBE().mHwcLayers[hwcId].clearClientTarget = clear; 7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 7736f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7776f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman return getBE().mHwcLayers.at(hwcId).clearClientTarget; 7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 780cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 781cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 782cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 783cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 784cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 7857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 786cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 787cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 788cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 789cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 7907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 7917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 79213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 79313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 79413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 79513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 79613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 79713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 79813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 79913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 80013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 80113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 80213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 80313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 805acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 806acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 807acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 808acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 809acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 811acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 812acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 813acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 814acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 815acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 816acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 817acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 818acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 819a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh, 820a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool useIdentityTransform) const { 8211eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 822a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const Transform renderAreaTransform(renderArea.getTransform()); 823a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const uint32_t height = renderArea.getHeight(); 82480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza FloatRect win = computeBounds(); 8253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 826acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 827acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 828acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 829acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 830acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 8311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 832acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 8331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 8341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 8351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 8361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 837acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 838acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 839b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 840b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 841b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 842b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 843b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 844acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 845acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 846ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 847a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[0] = renderAreaTransform.transform(lt); 848a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[1] = renderAreaTransform.transform(lb); 849a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[2] = renderAreaTransform.transform(rb); 850a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[3] = renderAreaTransform.transform(rt); 85141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (size_t i = 0; i < 4; i++) { 852a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[i].y = height - position[i].y; 85313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 85413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 855ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 85641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const { 857231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 858231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 859231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 860231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 86113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 86213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 86313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 86413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 86513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 86613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 86713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 86813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 86913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 87013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 87141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) { 87213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 87313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 87413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 87513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 876e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carrvoid Layer::clearVisibilityRegions() { 877e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr visibleRegion.clear(); 878e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr visibleNonTransparentRegion.clear(); 879e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr coveredRegion.clear(); 880e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr} 881e5f4f694f11ad1e8a9bb3b1b9579a175435c7c19Robert Carr 88213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 88313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 88413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 88513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 8867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 8877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 8887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 8897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 8927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 8930d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 8940d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 8950d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 8960d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 8977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 8987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 8997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 9000d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 9013bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 90241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber); 9030d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 904cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 905cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 906cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 907cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 9080d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 909cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 9107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 914f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 9157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 917f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 9187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 92005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 92105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 92205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 92341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman stateToCommit->flags = 92441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask); 9257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 927f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 93005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 9317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 9330d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 9347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 9367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 9377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 93905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 9427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 94441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) { 94541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Unexpected sync point frame number found", mName.string()); 946cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 947cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 948cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 949cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 950cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 951cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 952cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 9537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 9547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 95505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 9597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 9607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 961792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 962792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 9637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 96505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 9717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 9727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 9737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 9747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 9757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 9787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 9797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 98113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 9821c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 9831c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 9847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 98505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 98605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 9877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 9887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9901eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h); 993a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 994eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman if (sizeChanged) { 995cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 9969d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 99741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 99841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 99941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n" 100041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 100141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n", 10029eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman this, getName().string(), mCurrentTransform, 10039eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top, 10049eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w, 10059eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right, 10069eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w, 10079eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman s.requested.h); 1008a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 10092a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 10102a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1011eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setDefaultBufferSize(c.requested.w, c.requested.h); 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1013cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 1014e392b55de711657d2a955b9785588d009b5e922dRobert Carr // Don't let Layer::doTransaction update the drawing state 1015e392b55de711657d2a955b9785588d009b5e922dRobert Carr // if we have a pending resize, unless we are in fixed-size mode. 1016e392b55de711657d2a955b9785588d009b5e922dRobert Carr // the drawing state will be updated only once we receive a buffer 1017e392b55de711657d2a955b9785588d009b5e922dRobert Carr // with the correct size. 1018e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1019e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In particular, we want to make sure the clip (which is part 1020e392b55de711657d2a955b9785588d009b5e922dRobert Carr // of the geometry state) is latched together with the size but is 1021e392b55de711657d2a955b9785588d009b5e922dRobert Carr // latched immediately when no resizing is involved. 1022e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1023e392b55de711657d2a955b9785588d009b5e922dRobert Carr // If a sideband stream is attached, however, we want to skip this 1024e392b55de711657d2a955b9785588d009b5e922dRobert Carr // optimization so that transactions aren't missed when a buffer 1025e392b55de711657d2a955b9785588d009b5e922dRobert Carr // never arrives 1026e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1027e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In the case that we don't have a buffer we ignore other factors 1028e392b55de711657d2a955b9785588d009b5e922dRobert Carr // and avoid entering the resizePending state. At a high level the 1029e392b55de711657d2a955b9785588d009b5e922dRobert Carr // resizePending state is to avoid applying the state of the new buffer 1030e392b55de711657d2a955b9785588d009b5e922dRobert Carr // to the old buffer. However in the state where we don't have an old buffer 1031e392b55de711657d2a955b9785588d009b5e922dRobert Carr // there is no such concern but we may still be being used as a parent layer. 103241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) && 10330cc69188196037c06127c0bc56c516069dbaa558David Sodman (getBE().compositionInfo.mBuffer != nullptr); 10340cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 10350cc69188196037c06127c0bc56c516069dbaa558David Sodman if (resizePending && getBE().compositionInfo.hwc.sidebandStream == nullptr) { 10360cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 10370cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 10380cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 10390cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 10407bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we apply various requested geometry states, depending on our 10417bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // latching configuration. See Layer.h for a detailed discussion of 10427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // how geometry latching is controlled. 10437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (!(flags & eDontUpdateGeometryState)) { 10447d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 10457bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 10467bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize 10477bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // mode, which causes attributes which normally latch regardless of scaling mode, 10487bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to be delayed. We copy the requested state to the active state making sure 10497bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to respect these rules (again see Layer.h for a detailed discussion). 10507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10517bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // There is an awkward asymmetry in the handling of the crop states in the position 10527bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // states, as can be seen below. Largely this arises from position and transform 10537bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // being stored in the same data structure while having different latching rules. 10547bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 10557bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10567bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Careful that "c" and editCurrentState may not begin as equivalent due to 10577bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // applyPendingStates in the presence of deferred transactions. 10587bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mFreezeGeometryUpdates) { 105982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 106082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 106182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 106282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 106382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 106482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 106582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 106682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 106782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 106813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 106913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10701eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 107313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10751eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 107613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 107813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 107913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 108013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 10813dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 108241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE)); 108313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 108413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1085c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1086c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1087c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1088c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 10891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1090c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1091c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 109213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 109305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 109413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 109805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1099a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1100a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 110113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 110213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 110313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 110413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 110513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 110613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 110713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 110813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 110982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 11103dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 111113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 111213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 111369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 111469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 111569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 111669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 11173dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 11187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 11197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we directly update the active state 11207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // unlike other setters, because we store it within 11217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // the transform, but use different latching rules. 11227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 112382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 112482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 11257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 112669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 11277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 112913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 113013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 113182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 11321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 11331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 11341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 11351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 11361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 11371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 11381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 11391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 1140503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return true; 11411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1142503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return false; 11431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 11441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1145503c7046237f2797a5cf8584064223359d0e6d10Robert Carrbool Layer::setChildRelativeLayer(const sp<Layer>& childLayer, 1146503c7046237f2797a5cf8584064223359d0e6d10Robert Carr const sp<IBinder>& relativeToHandle, int32_t relativeZ) { 1147503c7046237f2797a5cf8584064223359d0e6d10Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 1148503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (idx < 0) { 1149503c7046237f2797a5cf8584064223359d0e6d10Robert Carr return false; 1150503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1151503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) { 1152503c7046237f2797a5cf8584064223359d0e6d10Robert Carr mCurrentChildren.removeAt(idx); 1153503c7046237f2797a5cf8584064223359d0e6d10Robert Carr mCurrentChildren.add(childLayer); 1154503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return true; 1155503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1156503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return false; 1157503c7046237f2797a5cf8584064223359d0e6d10Robert Carr} 1158503c7046237f2797a5cf8584064223359d0e6d10Robert Carr 1159ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 1160503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr if (mCurrentState.z == z && !usingRelativeZ(LayerVector::StateSet::Current)) return false; 116113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 116213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 11637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1164db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1165db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1166db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1167db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1168db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1169db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1170db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1171db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1172db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 117313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 117413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 117513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 11761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1177db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1178db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1179db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1180db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1181db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1182db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1183db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1184db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1185db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1186db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1187db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1188db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1189db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1190db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1191503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ) { 1192db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1193db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1194db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1195db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1196db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1197db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1198db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1199db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1200db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1201503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr if (mCurrentState.z == relativeZ && usingRelativeZ(LayerVector::StateSet::Current) && 1202503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr mCurrentState.zOrderRelativeOf == relative) { 1203503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr return false; 1204503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr } 1205503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr 1206db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1207db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1208503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr mCurrentState.z = relativeZ; 1209db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 12109ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote(); 12119ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw if (oldZOrderRelativeOf != nullptr) { 12129ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw oldZOrderRelativeOf->removeZOrderRelative(this); 12139ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw } 1214db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1215db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1216db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1217db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1218db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1219db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1220db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1221db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 122213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 122341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false; 122413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 122513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 12267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 122913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 12309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 123141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.color.a == alpha) return false; 123213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 123313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = alpha; 12347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 123513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 123613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 123713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 123813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 123913fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) { 124041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g && 124141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman color.b == mCurrentState.color.b) 124213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return false; 124313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 124413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.sequence++; 124513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.r = color.r; 124613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.g = color.g; 124713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.b = color.b; 124813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.modified = true; 124913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw setTransactionFlags(eTransactionNeeded); 125013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return true; 125113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 125213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 125313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 125541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 12567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 12612ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 12627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 126513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 126713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 126841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.flags == newFlags) return false; 126913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 127013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 12717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 12727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 127313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 127413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 127513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 127699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 127799e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 127841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedCrop == crop) return false; 127913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 128099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 12817bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 128299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 128399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 12847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12857bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 12867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 128813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 12908d5227b8416b099c884429312daf2d60496fa484Robert Carr 12918d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 129241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedFinalCrop == crop) return false; 1293acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 12948d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 12957bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 12968d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 12978d5227b8416b099c884429312daf2d60496fa484Robert Carr } 12987bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12997bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 1300acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1301acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1302acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1303acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 130413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1305c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 130641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (scalingMode == mOverrideScalingMode) return false; 1307c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 130882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1309c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1310c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1311c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 1312ccd348460ca25890a8fb709e82e6f780e3ce878erongliuvoid Layer::setInfo(int32_t type, int32_t appId) { 131341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.appId = appId; 131441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.type = type; 131541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.modified = true; 131641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman setTransactionFlags(eTransactionNeeded); 13172f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 13182f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 131913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 132041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.layerStack == layerStack) return false; 132113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 132213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 13237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 132413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 132513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1326a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1327a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1328bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 132941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.dataSpace == dataSpace) return false; 1330bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1331bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1332bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1333bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1334bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1335bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1336bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 1337532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 1338532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1339532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1340532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 13411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 1342e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu auto p = mDrawingParent.promote(); 13431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 13441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 13451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 13471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 134941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) { 13500d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 13517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 13527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 13537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 13547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 13557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 13560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1357792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 13587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 13590d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 13600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 136141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) { 13620d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 13630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 13647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1366ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 13721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 1373e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& parent = mDrawingParent.promote(); 13741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 13751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 13761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 13781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 138041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const { 138113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 138213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 138313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 138413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 138513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 138603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 138703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 138803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 138913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 139713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 139913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 140013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 140213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 140413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 1405eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setTransformHint(orientation); 140613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 140713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 140813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 140913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 141013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 141113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1412a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const { 1413a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerDebugInfo info; 1414a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const Layer::State& ds = getDrawingState(); 1415a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mName = getName(); 14161acbec7884a47f316005ba4f2b5e47c74317ee43chaviw sp<Layer> parent = getParent(); 1417a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); 1418a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mType = String8(getTypeId()); 1419a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mTransparentRegion = ds.activeTransparentRegion; 1420a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mVisibleRegion = visibleRegion; 1421a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mSurfaceDamageRegion = surfaceDamageRegion; 1422a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mLayerStack = getLayerStack(); 1423a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mX = ds.active.transform.tx(); 1424a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mY = ds.active.transform.ty(); 1425a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mZ = ds.z; 1426a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mWidth = ds.active.w; 1427a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mHeight = ds.active.h; 1428a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mCrop = ds.crop; 1429a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFinalCrop = ds.finalCrop; 143013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw info.mColor = ds.color; 1431a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFlags = ds.flags; 1432a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mPixelFormat = getPixelFormat(); 1433a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mDataSpace = getDataSpace(); 1434a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][0] = ds.active.transform[0][0]; 1435a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][1] = ds.active.transform[0][1]; 1436a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][0] = ds.active.transform[1][0]; 1437a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][1] = ds.active.transform[1][1]; 1438a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 14390cc69188196037c06127c0bc56c516069dbaa558David Sodman sp<const GraphicBuffer> buffer = getBE().compositionInfo.mBuffer; 14405b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (buffer != 0) { 14415b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferWidth = buffer->getWidth(); 14425b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferHeight = buffer->getHeight(); 14435b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferStride = buffer->getStride(); 14445b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman info.mActiveBufferFormat = buffer->format; 1445a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } else { 1446a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = 0; 1447a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = 0; 1448a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = 0; 1449a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = 0; 1450a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 1451bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 1452a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mNumQueuedFrames = getQueuedFrameCount(); 1453a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mRefreshPending = isBufferLatched(); 1454a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mIsOpaque = isOpaque(ds); 1455a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mContentDirty = contentDirty; 1456a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return info; 1457d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 145883ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu 1459e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 1460e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1461e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1462e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 1463e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 1464e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 1465e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 1466e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 1467e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1468e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1469e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1470e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1471e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 14726f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman if (getBE().mHwcLayers.count(hwcId) == 0) { 1473e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 1474e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1475e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1476e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 1477e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 1478e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 1479e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 1480e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 1481e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 1482e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 1483e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 1484e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 1485e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1486e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1487e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 1488e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1489e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 14906f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId); 14918c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck result.appendFormat(" %10d | ", layerState.z); 149241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str()); 1493e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 149441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom); 14955a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 149641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom); 1497e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1498e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 1499e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 1500e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1501e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1502d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 1503d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 150482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 150582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 1506d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 1507d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 150825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 150925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 15106547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 15116547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 15126547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 15136547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1514d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 1515d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 1516d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 1517d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 1518d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 151941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this); 1520d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1521d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 1522d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 1523d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 1524d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 15255ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 15265ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 15275ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 15285ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 15295ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 15303890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 153141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman FrameEventHistoryDelta* outDelta) { 1532d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1533d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 1534fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // If there are any unsignaled fences in the aquire timeline at this 1535fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // point, the previously queued frame hasn't been latched yet. Go ahead 1536fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // and try to get the signal time here so the syscall is taken out of 1537fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // the main thread's critical path. 1538fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mAcquireTimeline.updateSignalTimes(); 1539fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // Push the new fence after updating since it's likely still pending. 15403d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 1541d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 1542d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 154340845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 15443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 15453890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 1546d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 154740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 1548e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 154998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const { 155098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu size_t count = 0; 155198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu for (const sp<Layer>& child : mCurrentChildren) { 155298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu count += 1 + child->getChildrenCount(); 155398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu } 155498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu return count; 155598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu} 155698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu 15571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 15581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 15591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 15601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 15631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 15641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 15651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15671db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 15681db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 15691db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 15701db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 15711db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15721db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15731db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 15741db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 15751db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 15761db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 15771db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15781db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15791db73f66624e7d151710483dd58e03eed672f064Robert Carr 15801db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 1581e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu newParent->addChild(child); 15821db73f66624e7d151710483dd58e03eed672f064Robert Carr 15831db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 15841db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 15851db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 15861db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15871db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15881db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 15891db73f66624e7d151710483dd58e03eed672f064Robert Carr 15901db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 15911db73f66624e7d151710483dd58e03eed672f064Robert Carr} 15921db73f66624e7d151710483dd58e03eed672f064Robert Carr 1593578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carrvoid Layer::reparentChildrenForDrawing(const sp<Layer>& newParent) { 1594578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr for (const sp<Layer>& child : mDrawingChildren) { 1595578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr child->mDrawingParent = newParent; 1596578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr } 1597578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr} 1598578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr 1599f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) { 1600f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (newParentHandle == nullptr) { 16010617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 16020617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 16030617894190ea0c3ee50889bee1d4df0f369b0761chaviw 16040617894190ea0c3ee50889bee1d4df0f369b0761chaviw auto handle = static_cast<Handle*>(newParentHandle.get()); 16050617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Layer> newParent = handle->owner.promote(); 16060617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (newParent == nullptr) { 16070617894190ea0c3ee50889bee1d4df0f369b0761chaviw ALOGE("Unable to promote Layer handle"); 16080617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 16090617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 16100617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1611f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Layer> parent = getParent(); 1612f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (parent != nullptr) { 1613f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw parent->removeChild(this); 16140617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 1615f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw newParent->addChild(this); 16160617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1617f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Client> client(mClientRef.promote()); 16180617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Client> newParentClient(newParent->mClientRef.promote()); 16190617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1620f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (client != newParentClient) { 1621f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw client->setParentLayer(newParent); 16220617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 16230617894190ea0c3ee50889bee1d4df0f369b0761chaviw 16240617894190ea0c3ee50889bee1d4df0f369b0761chaviw return true; 16250617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 16260617894190ea0c3ee50889bee1d4df0f369b0761chaviw 16279524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 16287f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr for (const sp<Layer>& child : mCurrentChildren) { 1629161410b01a37bcc5522d8e91fe0a743989c86e70chaviw sp<Client> parentClient = mClientRef.promote(); 16309524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 1631161410b01a37bcc5522d8e91fe0a743989c86e70chaviw if (client != nullptr && parentClient != client) { 16327f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr client->detachLayer(child.get()); 16337f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr child->detachChildren(); 16349524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 16357f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr } 16369524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 16379524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 16389524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 16399524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 16401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 1641e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mCurrentParent = layer; 16421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 16451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 16461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 16471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 16501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 16511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 16521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 16541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 16571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 16581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 166029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carrbool Layer::usingRelativeZ(LayerVector::StateSet stateSet) { 166129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 166229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr const State& state = useDrawing ? mDrawingState : mCurrentState; 166329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr return state.zOrderRelativeOf != nullptr; 166429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr} 166529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 166641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList( 166729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr LayerVector::StateSet stateSet, bool* outSkipRelativeZUsers) { 1668412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 1669412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 1670412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1671412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1672412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 1673412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 167429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (state.zOrderRelatives.size() == 0) { 167529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr *outSkipRelativeZUsers = true; 167629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr return children; 167729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 167829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1679db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 1680412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 1681db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 1682db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1683db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 1684db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1685db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1686db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1687412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 1688503c7046237f2797a5cf8584064223359d0e6d10Robert Carr const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState; 1689503c7046237f2797a5cf8584064223359d0e6d10Robert Carr if (childState.zOrderRelativeOf != nullptr) { 1690503c7046237f2797a5cf8584064223359d0e6d10Robert Carr continue; 1691503c7046237f2797a5cf8584064223359d0e6d10Robert Carr } 1692db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 1693db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1694db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1695db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 1696db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1697db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1699db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 17001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1701412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 170229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // In the case we have other layers who are using a relative Z to us, makeTraversalList will 170329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // produce a new list for traversing, including our relatives, and not including our children 170429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // who are relatives of another surface. In the case that there are no relative Z, 170529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // makeTraversalList returns our children directly to avoid significant overhead. 170629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // However in this case we need to take the responsibility for filtering children which 170729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // are relatives of another surface here. 170829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr bool skipRelativeZUsers = false; 170929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr const LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers); 1710db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 17111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 1712db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1713db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 171429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 171529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 171629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 171729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1718db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 17191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 1720db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1721412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 17221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 172329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1724412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 1725db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1726db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 172729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 172829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 172929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 173029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 1731412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 17321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 17351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1736db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 17371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1738412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 1739412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 174029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr // See traverseInZOrder for documentation. 174129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr bool skipRelativeZUsers = false; 174229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers); 1743db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 17441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 1745bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson for (i = int32_t(list.size()) - 1; i >= 0; i--) { 1746db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 174729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 174829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 174929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 175029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 175129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1752db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 17531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 17541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1755412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 17561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1757412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 175841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (; i >= 0; i--) { 1759db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 176029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 176129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) { 176229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr continue; 176329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr } 176429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr 1765412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 17661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1769a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/** 1770a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers. 1771a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */ 1772a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet, 1773a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector::Visitor& visitor) { 1774a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1775a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1776a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 1777a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw size_t i = 0; 1778a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 1779a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 1780a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw if (relative->getZ() >= 0) { 1781a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw break; 1782a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1783a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 1784a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1785a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw visitor(this); 1786a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 1787a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 1788a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 1789a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1790a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw} 1791a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 17921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 17931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 1794e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 17951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 17961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 17979b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 17989b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 17999b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 18009b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 18019b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 18029b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 18030cc69188196037c06127c0bc56c516069dbaa558David Sodman if (p->isFixedSize() && p->getBE().compositionInfo.mBuffer != nullptr) { 18041725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 18051725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 18061725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 18070cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferWidth = p->getBE().compositionInfo.mBuffer->getWidth(); 18080cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferHeight = p->getBE().compositionInfo.mBuffer->getHeight(); 18091725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 18100cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferHeight = p->getBE().compositionInfo.mBuffer->getWidth(); 18110cc69188196037c06127c0bc56c516069dbaa558David Sodman bufferWidth = p->getBE().compositionInfo.mBuffer->getHeight(); 18121725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 181341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth); 181441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight); 18159b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 18169b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 18179b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 18189b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 18191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 18211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 182313fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const { 1824e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 18256452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 182613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf; 182713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return parentAlpha * getDrawingState().color.a; 18286452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 18296452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 183013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const { 183113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw const half4 color(getDrawingState().color); 183213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return half4(color.r, color.g, color.b, getAlpha()); 18336452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 18346452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 18351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 18361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 18371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 18381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 18391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 1841e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mDrawingParent = mCurrentParent; 18421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 18441d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) { 18451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 18461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 18471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const State& state = useDrawing ? mDrawingState : mCurrentState; 18481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform = state.active.transform; 18501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform = getTransform(); 18511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_id(sequence); 18531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_name(getName().c_str()); 18541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_type(String8(getTypeId())); 18551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const auto& child : children) { 18571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_children(child->sequence); 18581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 18611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw sp<Layer> strongRelative = weakRelative.promote(); 18621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (strongRelative != nullptr) { 18631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_relatives(strongRelative->sequence); 18641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.activeTransparentRegion, 18681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->mutable_transparent_region()); 18691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region()); 18701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region()); 18711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_layer_stack(getLayerStack()); 18731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z(state.z); 18741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* position = layerInfo->mutable_position(); 18761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_x(transform.tx()); 18771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_y(transform.ty()); 18781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* requestedPosition = layerInfo->mutable_requested_position(); 18801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_x(requestedTransform.tx()); 18811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_y(requestedTransform.ty()); 18821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw SizeProto* size = layerInfo->mutable_size(); 18841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_w(state.active.w); 18851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_h(state.active.h); 18861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop()); 18881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop()); 18891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_is_opaque(isOpaque(state)); 18911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_invalidate(contentDirty); 18921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_dataspace(dataspaceDetails(getDataSpace())); 18931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); 18941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color()); 18951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color()); 18961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_flags(state.flags); 18971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); 18991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform()); 19001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19018e0af3679ec73e07775142825d592448b255f61cJorim Jaggi auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote(); 19021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (parent != nullptr) { 19031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_parent(parent->sequence); 19041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); 19071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (zOrderRelativeOf != nullptr) { 19081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); 19091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19110cc69188196037c06127c0bc56c516069dbaa558David Sodman auto buffer = getBE().compositionInfo.mBuffer; 19125b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman if (buffer != nullptr) { 19135b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman LayerProtoHelper::writeToProto(buffer, layerInfo->mutable_active_buffer()); 19141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 19151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 19161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_queued_frames(getQueuedFrameCount()); 19171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_refresh_pending(isBufferLatched()); 1918ccd348460ca25890a8fb709e82e6f780e3ce878erongliu layerInfo->set_window_type(state.type); 1919ccd348460ca25890a8fb709e82e6f780e3ce878erongliu layerInfo->set_app_id(state.appId); 19201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} 19211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 192213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 192313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 19243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 19273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 19283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 19313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 19323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 1933