Layer.cpp revision 503d2bd9a0c64f90fc321f9d65fc65e592f1fa2b
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h>
4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
5241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h"
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h"
60c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
6141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
659eeae69005ef9a774bde19195b9c06eba7e463c2David SodmanLayerBE::LayerBE()
665b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman      : mBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
675b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        mBuffer(nullptr),
685b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) {
699eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman}
709eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
719eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
7441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
7541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             uint32_t h, uint32_t flags)
760c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman      : contentDirty(false),
7713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
7913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
800c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mName(name),
8113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
85399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
86a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
87a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
88c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
89a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
90cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
9182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
9413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
98a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10065476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mFreezeGeometryUpdates(false) {
1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
104a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1064d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
10741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden;
10841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque;
10941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure;
1104d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1114d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
112f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    mTransactionName = String8("TX - ") + mName;
1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1160c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    mCurrentState.flags = layerFlags;
1173dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
118b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
119b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedFinalCrop = mCurrentState.finalCrop;
1217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedCrop = mCurrentState.crop;
1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
12313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = 1.0f;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
127bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1282f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1292f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1336547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1376547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1390a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1410a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
1429eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
143e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
144e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
14541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {}
14696f0819f81293076e652792794a961543e6750d7Mathias Agopian
1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14996f0819f81293076e652792794a961543e6750d7Mathias Agopian}
15096f0819f81293076e652792794a961543e6750d7Mathias Agopian
15113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
15213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
15313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
15413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
155eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/*
156eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through
157eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer.  So, the implementation is done in BufferLayer.  When called on a
158eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP.
159eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */
160eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {}
16113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
162c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() {
163c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mCurrentState to mLayersPendingRemoval
164c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
1658b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw    mPendingRemoval = true;
1668b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw
1675edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1685edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1695edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
1705edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
171c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu            mFlinger->setTransactionFlags(eTraversalNeeded);
1725edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
1735edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1745edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
1755edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
176c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    for (const auto& child : mCurrentChildren) {
177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        child->onRemovedFromCurrentState();
178c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
179c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu}
1803851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
181c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() {
182c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mLayersPendingRemoval
183eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    abandon();
184c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
185b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    destroyAllHwcLayers();
1863851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
1871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
1881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
1891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19048d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
191cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
19213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
19313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
19413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
19513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1961eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
19713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
19813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
19913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
20013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const {
20113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return mPremultipliedAlpha;
20213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
20313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
2044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
2054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
2064d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
207582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
208582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
20913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
21113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
213b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
2146f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0,
2159eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                        "Already have a layer for hwcId %d", hwcId);
216b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWC2::Layer* layer = hwc->createLayer(hwcId);
217b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (!layer) {
218b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return false;
219b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
2206f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers[hwcId];
221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc = hwc;
222b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.layer = layer;
223b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    layer->setLayerDestroyedListener(
2246f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman            [this, hwcId](HWC2::Layer* /*layer*/) { getBE().mHwcLayers.erase(hwcId); });
225b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    return true;
226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
22883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wubool Layer::destroyHwcLayer(int32_t hwcId) {
2296f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
23083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu        return false;
231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
2326f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto& hwcInfo = getBE().mHwcLayers[hwcId];
23341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer");
234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // The layer destroyed listener should have cleared the entry from
237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // mHwcLayers. Verify that.
2386f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0,
2396f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman                        "Stale layer entry in getBE().mHwcLayers");
24083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    return true;
241b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() {
2446f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    size_t numLayers = getBE().mHwcLayers.size();
245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    for (size_t i = 0; i < numLayers; ++i) {
2466f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman        LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.empty(), "destroyAllHwcLayers failed");
2476f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman        destroyHwcLayer(getBE().mHwcLayers.begin()->first);
248b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
2496f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LOG_ALWAYS_FATAL_IF(!getBE().mHwcLayers.empty(),
25041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                        "All hardware composer layers should have been destroyed");
251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
252b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
253a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
254a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
255a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
256f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
257f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
258a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
259f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
2605b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman    } else if (getBE().mBuffer != NULL) {
261a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
2625b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        crop = getBE().mBuffer->getBounds();
263f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
264a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
2654fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
266f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
267f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
268f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
269f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
270f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
271f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
272f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
273f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
274f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
275f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
276f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
277f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
278f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
279f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
2801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
2811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
2821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
2831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
2851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
2891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
2901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
29141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
29241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
29341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
29441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
295e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
3071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
3081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
3111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
31813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
3191eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
3206c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
3216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
3226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
3236c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
3246c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
326b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
327b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
328b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
332e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
334de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
335de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
336de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
3371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
3421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
3431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
3441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3466c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
3476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
34813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
34913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
351b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
35213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
3531eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
3576b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
3586b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
3596b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
3606b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
3610e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3620e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
363b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
364df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
3650e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
3660e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
370acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
371acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
372b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
37341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(s.finalCrop, &activeCrop)) {
374acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
375acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
376acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
377b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
378b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    const auto& p = mDrawingParent.promote();
379b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    if (p != nullptr) {
380b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        auto parentCrop = p->computeInitialCrop(hw);
381b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        activeCrop.intersect(parentCrop, &activeCrop);
382b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    }
383b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3875a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
3905a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
40013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
40128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
40228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
40328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
40428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
40528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
40628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
407acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
408acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
409acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
41013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
411f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
412f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
413f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
414acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
415acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
416acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
417acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
418cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
419acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
420021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
421021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
422acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
42341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform();
424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
42641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
42713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
42941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation();
430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
438acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
439acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
441acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
44341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
445acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
44841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h);
44913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
45141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float xScale = crop.getWidth() / float(winWidth);
452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
45313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
45441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetL = winCrop.left * xScale;
45541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetT = winCrop.top * yScale;
45641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetR = (winWidth - winCrop.right) * xScale;
457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
45941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.left += insetL;
46041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.top += insetT;
46141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.right -= insetR;
462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
46313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
46413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
46513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
46613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
467ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
468a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
4699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
4706f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto& hwcInfo = getBE().mHwcLayers[hwcId];
471a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
4723e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
4739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
4749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
4769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
4779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
4789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
480dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
48113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
4821eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
483ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
4846452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
48541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        blendMode =
48641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
4879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
488ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
48941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
49041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set blend mode %s:"
49141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             " %s (%d)",
49241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
49341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
49413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
49513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
49613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
4976c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
4981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
499b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
500b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
5011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
50241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
503acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
50628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
50728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
50828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
50928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
51028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
51128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
51241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
513acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
514acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5156c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
5166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
51741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h));
51841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom));
51941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(
52041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom));
5216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
5221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
524b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
52541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!frame.intersect(s.finalCrop, &frame)) {
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
5339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
534ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
535e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
53641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.left, transformedFrame.top, transformedFrame.right,
53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
539e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
540e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
541e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5435a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
5449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
545e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
546e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
54741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              "%s (%d)",
54841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
54941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
550e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
551e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
552e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
55413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    float alpha = static_cast<float>(getAlpha());
5556452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
55641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
55741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set plane alpha %.3f: "
55841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "%s (%d)",
55941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
5609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
561ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
56241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
56341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             to_string(error).c_str(), static_cast<int32_t>(error));
5642f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
5652a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
5662a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
567e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
5682a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
5692a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
5702a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
5712a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
5722a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
5732a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
5742a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
57541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
57641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
5779f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
57829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
57929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
58029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
58129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
58229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
58329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
58429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
58529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
58629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
5871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
588c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
589cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
590c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
591021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
593c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
59441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
595c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
596c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
59741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
598c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
599cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
600cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
601cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
602cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
603cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
604cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
605cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
606cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
607c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
60829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
60929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
61013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
6119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
6139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
6159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
6169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
61741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE_IF(error != HWC2::Error::None,
61841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "[%s] Failed to set transform %s: "
61941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "%s (%d)",
62041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
62141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 static_cast<int32_t>(error));
6229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
623a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
624a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
6259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
6266f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
6279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
6289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6316f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    getBE().mHwcLayers[hwcId].forceClientComposition = true;
6329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
633eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
634c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) {
6356f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
636c9232edd34618360d099272fb0537cae2f715860chaviw        ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId);
637c9232edd34618360d099272fb0537cae2f715860chaviw        return false;
638c9232edd34618360d099272fb0537cae2f715860chaviw    }
639c9232edd34618360d099272fb0537cae2f715860chaviw
6406f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    return getBE().mHwcLayers[hwcId].forceClientComposition;
641c9232edd34618360d099272fb0537cae2f715860chaviw}
642c9232edd34618360d099272fb0537cae2f715860chaviw
6439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
6449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
6456f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0 ||
6469eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman        getCompositionType(hwcId) != HWC2::Composition::Cursor) {
6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
652dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
6539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
6549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
6559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
656b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
657b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
6611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
663b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
664b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
665acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6696f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto error = getBE().mHwcLayers[hwcId].layer->setCursorPosition(position.left,
6709eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                                                                              position.top);
67141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
67241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set cursor position "
67341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "to (%d, %d): %s (%d)",
67441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), position.left, position.top, to_string(error).c_str(),
67541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
67703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
67813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
67913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
68013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
68113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
682a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const {
683a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, clip, false);
68413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
68513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
686a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const {
687a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform);
68813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
68913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
690a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const {
691a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), false);
692c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
693c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
69441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue,
69541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            float alpha) const {
69619733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
6979eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    computeGeometry(renderArea, getBE().mMesh, false);
69819733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
6999eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    engine.drawMesh(getBE().mMesh);
70013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
70113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
702a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const {
70341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    clearWithOpenGL(renderArea, 0, 0, 0, 0);
70413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
70513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
70641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
7076f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
7089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7116f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto& hwcInfo = getBE().mHwcLayers[hwcId];
7129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
71341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(),
71441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman          static_cast<int>(callIntoHwc));
7159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
7189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
7199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
72041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE_IF(error != HWC2::Error::None,
72141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "[%s] Failed to set "
72241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "composition type %s: %s (%d)",
72341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     mName.string(), to_string(type).c_str(), to_string(error).c_str(),
72441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     static_cast<int32_t>(error));
7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
730ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
731ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
732ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
733ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
734ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
7356f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
736ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7396f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    return getBE().mHwcLayers.at(hwcId).compositionType;
7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
7436f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7476f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    getBE().mHwcLayers[hwcId].clearClientTarget = clear;
7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
7516f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    return getBE().mHwcLayers.at(hwcId).clearClientTarget;
7569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
758cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
759cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
760cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
761cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
762cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
7637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
764cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
765cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
766cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
767cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
7687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
7697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
77013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
77113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
77213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
77313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
77413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
77513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
77613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
77713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
77813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
77913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
78013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
78113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
782acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
783acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
784acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
785acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
786acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
787acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
788acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
789acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
790acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
791acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
792acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
793acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
794acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
795acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
796acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
797a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh,
798a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                            bool useIdentityTransform) const {
7991eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
800a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const Transform renderAreaTransform(renderArea.getTransform());
801a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const uint32_t height = renderArea.getHeight();
8021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
8033f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
805acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
806acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
807acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
808acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
8091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
8111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
8121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
8131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
8141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
815acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
816acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
817b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
818b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
819b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
820b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
821b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
822acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
823acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
824ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
825a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[0] = renderAreaTransform.transform(lt);
826a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[1] = renderAreaTransform.transform(lb);
827a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[2] = renderAreaTransform.transform(rb);
828a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[3] = renderAreaTransform.transform(rt);
82941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (size_t i = 0; i < 4; i++) {
830a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        position[i].y = height - position[i].y;
83113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
83213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
833ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
83441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const {
835231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
836231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
837231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
838231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
83913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
84013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
84113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
84213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
84313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
84413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
84513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
84613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
84713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
84813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
84941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
85013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
85113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
85213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
85313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
85413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
85513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
85613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
85713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
8587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
8597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
8607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
8617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
8647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
8650d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
8660d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
8670d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
8680d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
8697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
8707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
8717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
8720d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
8733bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
87441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber);
8750d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
876cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
877cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
878cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
879cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
8800d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
881cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
8827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
8837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
8857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
886f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
8877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
889f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
8907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
89205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
89305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
89405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
89541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    stateToCommit->flags =
89641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask);
8977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
899f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
9007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
90205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
9037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
9047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
9050d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
9067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
9077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
9087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
9097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
9107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
91105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
9147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
91641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) {
91741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                ALOGE("[%s] Unexpected sync point frame number found", mName.string());
918cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
919cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
920cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
921cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
922cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
923cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
924cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
9257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
92705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
9317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
933792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
934792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
93705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
9397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
9437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
9447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
9457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
9467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
9477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
9507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
9517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
95313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
9541c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
9551c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
9567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
95705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
95805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
9597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
9607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9621eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h);
965a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
966eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    if (sizeChanged) {
967cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
9689d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
96941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
97041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
97141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n"
97241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
97341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n",
9749eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 this, getName().string(), mCurrentTransform,
9759eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top,
9769eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w,
9779eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right,
9789eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w,
9799eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 s.requested.h);
980a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
9812a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
9822a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
983eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman        setDefaultBufferSize(c.requested.w, c.requested.h);
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
985cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
986e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // Don't let Layer::doTransaction update the drawing state
987e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // if we have a pending resize, unless we are in fixed-size mode.
988e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // the drawing state will be updated only once we receive a buffer
989e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // with the correct size.
990e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
991e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In particular, we want to make sure the clip (which is part
992e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // of the geometry state) is latched together with the size but is
993e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // latched immediately when no resizing is involved.
994e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
995e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // If a sideband stream is attached, however, we want to skip this
996e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // optimization so that transactions aren't missed when a buffer
997e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // never arrives
998e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
999e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In the case that we don't have a buffer we ignore other factors
1000e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // and avoid entering the resizePending state. At a high level the
1001e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // resizePending state is to avoid applying the state of the new buffer
1002e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // to the old buffer. However in the state where we don't have an old buffer
1003e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // there is no such concern but we may still be being used as a parent layer.
100441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) &&
10055b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            (getBE().mBuffer != nullptr);
10060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
1007386c22e70d63ecc8bf6ae3e7c2f623f42fcd8718David Sodman        if (resizePending && getBE().mSidebandStream == NULL) {
10080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
10090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
10100cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
10110cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
10127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
10137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
10147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
10157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
10167d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
10177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
10187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
10197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
10207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
10217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
10227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
10247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
10257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
10267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
10277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
10297bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
10307bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
103182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
103282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
103382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
103482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
103582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
103682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
103782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
103882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
103982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
104013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
104113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10421eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
104313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
104413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
104513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
104613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10471eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
104813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
104913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
105013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
105113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
105213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
10533dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
105441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE));
105513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
105613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1057c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1058c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1059c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1060c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
10611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1062c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1063c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
106505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
107005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1071a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1072a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
107313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
107513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
107613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
107813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
107913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
108013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
108182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
10823dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
108313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
108413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
108569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
108669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
108769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
108869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
10893dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
10907bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
10917bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
10927bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
10937bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
10947bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
109582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
109682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
10977bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
109869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
10997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
110013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
110113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
110213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
110382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
11041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
11051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
11061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
11071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
11081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
11091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
11101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
11111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
1112503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr        return true;
11131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1114503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr    return false;
11151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
11161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1117503c7046237f2797a5cf8584064223359d0e6d10Robert Carrbool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
1118503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
1119503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
1120503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    if (idx < 0) {
1121503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        return false;
1122503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    }
1123503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) {
1124503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        mCurrentChildren.removeAt(idx);
1125503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        mCurrentChildren.add(childLayer);
1126503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr        return true;
1127503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    }
1128503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr    return false;
1129503c7046237f2797a5cf8584064223359d0e6d10Robert Carr}
1130503c7046237f2797a5cf8584064223359d0e6d10Robert Carr
1131ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
1132503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr    if (mCurrentState.z == z && !usingRelativeZ(LayerVector::StateSet::Current)) return false;
113313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
113413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
11357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1136db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1137db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1138db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1139db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1140db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1141db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1142db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1143db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1144db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
114513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
114613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
114713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
11481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1149db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1150db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1151db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1152db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1153db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1154db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1155db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1156db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1157db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1158db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1159db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1160db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1161db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1162db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1163503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
1164db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1165db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1166db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1167db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1168db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1169db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1170db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1171db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1172db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1173503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr    if (mCurrentState.z == relativeZ && usingRelativeZ(LayerVector::StateSet::Current) &&
1174503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr            mCurrentState.zOrderRelativeOf == relative) {
1175503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr        return false;
1176503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr    }
1177503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr
1178db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1179db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1180503d2bd9a0c64f90fc321f9d65fc65e592f1fa2bRobert Carr    mCurrentState.z = relativeZ;
1181db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
11829ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
11839ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    if (oldZOrderRelativeOf != nullptr) {
11849ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw        oldZOrderRelativeOf->removeZOrderRelative(this);
11859ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    }
1186db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1187db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1188db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1189db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1190db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1191db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1192db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1193db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
119413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
119541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false;
119613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
119713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
11987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
119913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
120013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
120113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
120341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.color.a == alpha) return false;
120413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
120513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = alpha;
12067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
120713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
120813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
120913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
121013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
121113fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) {
121241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g &&
121341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        color.b == mCurrentState.color.b)
121413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw        return false;
121513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
121613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.sequence++;
121713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.r = color.r;
121813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.g = color.g;
121913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.b = color.b;
122013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.modified = true;
122113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    setTransactionFlags(eTransactionNeeded);
122213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return true;
122313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
122413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
122513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
122613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
122741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
12287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
122913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
123013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
123113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
123213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
12332ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
12347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
123513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
123613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
123713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
123813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
123913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
124041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.flags == newFlags) return false;
124113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
124213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
12437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
12447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
124513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
124613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
124713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
124899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
124999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
125041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedCrop == crop) return false;
125113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
125299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
12537bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
125499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
125599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
12567bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12577bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
12587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
12628d5227b8416b099c884429312daf2d60496fa484Robert Carr
12638d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
126441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedFinalCrop == crop) return false;
1265acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
12668d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
12677bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
12688d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
12698d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
12707bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12717bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1272acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1273acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1274acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1275acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
127613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1277c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
127841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (scalingMode == mOverrideScalingMode) return false;
1279c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
128082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1281c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1282c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1283c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
12842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
128541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.appId = appId;
128641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.type = type;
128741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.modified = true;
128841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    setTransactionFlags(eTransactionNeeded);
12892f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
12902f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
129113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
129241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.layerStack == layerStack) return false;
129313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
129413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
12957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
129613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
129713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1298a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1299a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1300bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
130141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.dataSpace == dataSpace) return false;
1302bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1303bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1304bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1305bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1306bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1307bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1308bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1309532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1310532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1311532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1312532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
13131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1314e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
13151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
13161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
13171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
13191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
132141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
13220d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
13237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
13247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
13257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
13267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
13277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
13280d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1329792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
13307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
13310d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
13320d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
133341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) {
13340d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
13350d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
13367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1338ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
13441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
1345e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
13461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
13471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
13481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
13501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
135241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const {
135313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
135413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
135513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
135613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
135713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
135803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
135903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
136003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
136113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
136313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
136413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
136513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
136613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
136713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
136813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
137013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
137113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
137213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
137313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
137513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
137613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
1377eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    setTransformHint(orientation);
137813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
137913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
138013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
138113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
138213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
138313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1384a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const {
1385a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    LayerDebugInfo info;
1386a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    const Layer::State& ds = getDrawingState();
1387a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mName = getName();
13881acbec7884a47f316005ba4f2b5e47c74317ee43chaviw    sp<Layer> parent = getParent();
1389a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
1390a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mType = String8(getTypeId());
1391a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mTransparentRegion = ds.activeTransparentRegion;
1392a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mVisibleRegion = visibleRegion;
1393a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mSurfaceDamageRegion = surfaceDamageRegion;
1394a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mLayerStack = getLayerStack();
1395a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mX = ds.active.transform.tx();
1396a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mY = ds.active.transform.ty();
1397a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mZ = ds.z;
1398a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mWidth = ds.active.w;
1399a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mHeight = ds.active.h;
1400a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mCrop = ds.crop;
1401a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFinalCrop = ds.finalCrop;
140213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    info.mColor = ds.color;
1403a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFlags = ds.flags;
1404a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mPixelFormat = getPixelFormat();
1405a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mDataSpace = getDataSpace();
1406a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][0] = ds.active.transform[0][0];
1407a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][1] = ds.active.transform[0][1];
1408a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][0] = ds.active.transform[1][0];
1409a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][1] = ds.active.transform[1][1];
1410a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
14115b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        sp<const GraphicBuffer> buffer = getBE().mBuffer;
14125b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        if (buffer != 0) {
14135b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferWidth = buffer->getWidth();
14145b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferHeight = buffer->getHeight();
14155b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferStride = buffer->getStride();
14165b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferFormat = buffer->format;
1417a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        } else {
1418a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = 0;
1419a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = 0;
1420a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = 0;
1421a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = 0;
1422a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
1423bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
1424a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mNumQueuedFrames = getQueuedFrameCount();
1425a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mRefreshPending = isBufferLatched();
1426a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mIsOpaque = isOpaque(ds);
1427a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mContentDirty = contentDirty;
1428a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    return info;
1429d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
143083ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu
1431e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
1432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1433e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1434e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
1435e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
1436e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
1437e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
1438e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
1439e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1440e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1441e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1442e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1443e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
14446f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
1445e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
1446e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1447e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1448e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
1449e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
1450e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
1451e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
1452e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
1453e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
1454e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
1455e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
1456e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
1457e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1458e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1459e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
1460e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1461e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
14626f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId);
14638c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck    result.appendFormat("  %10d | ", layerState.z);
146441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
1465e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
146641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
14675a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
146841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
1469e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1470e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
1471e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
1472e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1473e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1474d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
1475d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
147682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
147782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
1478d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
1479d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
148025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
148125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
14826547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
14836547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14846547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
14856547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1486d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
1487d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
1488d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
1489d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
1490d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
149141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this);
1492d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1493d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
1494d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
1495d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
1496d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
14975ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
14985ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
14995ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
15005ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
15015ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
15023890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
150341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                     FrameEventHistoryDelta* outDelta) {
1504d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1505d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
1506fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // If there are any unsignaled fences in the aquire timeline at this
1507fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // point, the previously queued frame hasn't been latched yet. Go ahead
1508fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // and try to get the signal time here so the syscall is taken out of
1509fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // the main thread's critical path.
1510fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mAcquireTimeline.updateSignalTimes();
1511fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // Push the new fence after updating since it's likely still pending.
15123d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
1513d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
1514d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
151540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
15163890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
15173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
1518d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
151940845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
1520e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
152198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
152298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
152398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
152498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
152598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
152698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
152798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
152898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
15291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
15301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
15311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
15321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
15351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
15361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
15371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15391db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
15401db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
15411db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
15421db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
15431db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15441db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15451db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
15461db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
15471db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
15481db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
15491db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15501db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15511db73f66624e7d151710483dd58e03eed672f064Robert Carr
15521db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1553e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
15541db73f66624e7d151710483dd58e03eed672f064Robert Carr
15551db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
15561db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
15571db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
15581db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
15591db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15601db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
15611db73f66624e7d151710483dd58e03eed672f064Robert Carr
15621db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
15631db73f66624e7d151710483dd58e03eed672f064Robert Carr}
15641db73f66624e7d151710483dd58e03eed672f064Robert Carr
1565f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) {
1566f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (newParentHandle == nullptr) {
15670617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15680617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15690617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15700617894190ea0c3ee50889bee1d4df0f369b0761chaviw    auto handle = static_cast<Handle*>(newParentHandle.get());
15710617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Layer> newParent = handle->owner.promote();
15720617894190ea0c3ee50889bee1d4df0f369b0761chaviw    if (newParent == nullptr) {
15730617894190ea0c3ee50889bee1d4df0f369b0761chaviw        ALOGE("Unable to promote Layer handle");
15740617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15750617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15760617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1577f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Layer> parent = getParent();
1578f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (parent != nullptr) {
1579f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        parent->removeChild(this);
15800617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
1581f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    newParent->addChild(this);
15820617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1583f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Client> client(mClientRef.promote());
15840617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Client> newParentClient(newParent->mClientRef.promote());
15850617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1586f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (client != newParentClient) {
1587f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        client->setParentLayer(newParent);
15880617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15890617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15900617894190ea0c3ee50889bee1d4df0f369b0761chaviw    return true;
15910617894190ea0c3ee50889bee1d4df0f369b0761chaviw}
15920617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15939524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
15947f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1595161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        sp<Client> parentClient = mClientRef.promote();
15969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
1597161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        if (client != nullptr && parentClient != client) {
15987f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr            client->detachLayer(child.get());
15997f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr            child->detachChildren();
16009524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
16017f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr    }
16029524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
16039524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
16049524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
16059524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
16061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
1607e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
16081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
16111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
16121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
16131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
16161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
16171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
16181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
16201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
16231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
16241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
162629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carrbool Layer::usingRelativeZ(LayerVector::StateSet stateSet) {
162729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
162829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    const State& state = useDrawing ? mDrawingState : mCurrentState;
162929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    return state.zOrderRelativeOf != nullptr;
163029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr}
163129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
163241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(
163329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        LayerVector::StateSet stateSet, bool* outSkipRelativeZUsers) {
1634412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1635412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
1636412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1637412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1638412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
1639412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
164029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    if (state.zOrderRelatives.size() == 0) {
164129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        *outSkipRelativeZUsers = true;
164229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        return children;
164329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    }
164429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1645db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
1646412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1647db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
1648db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1649db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
1650db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1651db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1652db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1653412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
1654503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState;
1655503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        if (childState.zOrderRelativeOf != nullptr) {
1656503c7046237f2797a5cf8584064223359d0e6d10Robert Carr            continue;
1657503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        }
1658db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
1659db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1660db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1661db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
1662db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1663db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1665db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
16661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1667412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
166829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // In the case we have other layers who are using a relative Z to us, makeTraversalList will
166929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // produce a new list for traversing, including our relatives, and not including our children
167029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // who are relatives of another surface. In the case that there are no relative Z,
167129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // makeTraversalList returns our children directly to avoid significant overhead.
167229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // However in this case we need to take the responsibility for filtering children which
167329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // are relatives of another surface here.
167429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    bool skipRelativeZUsers = false;
167529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    const LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers);
1676db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
1678db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1679db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
168029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
168129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
168229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
168329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1684db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
16851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
1686db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1687412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
16881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
168929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1690412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
1691db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1692db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
169329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
169429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
169529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
169629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
1697412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
16981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
17011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1702db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
17031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1704412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
1705412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
170629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // See traverseInZOrder for documentation.
170729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    bool skipRelativeZUsers = false;
170829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers);
1709db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
17101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
1711bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson    for (i = int32_t(list.size()) - 1; i >= 0; i--) {
1712db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
171329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
171429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
171529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
171629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
171729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1718db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
17191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
17201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
1721412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
17221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1723412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
172441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (; i >= 0; i--) {
1725db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
172629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
172729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
172829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
172929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
173029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1731412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
17321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1735a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/**
1736a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers.
1737a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */
1738a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet,
1739a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                                     const LayerVector::Visitor& visitor) {
1740a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1741a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1742a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
1743a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    size_t i = 0;
1744a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1745a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1746a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        if (relative->getZ() >= 0) {
1747a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            break;
1748a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
1749a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1750a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1751a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    visitor(this);
1752a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1753a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1754a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1755a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1756a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw}
1757a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
17581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
17591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
1760e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
17611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
17621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
17639b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
17649b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
17659b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
17669b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
17679b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
17689b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
17695b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        if (p->isFixedSize() && p->getBE().mBuffer != nullptr) {
17701725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
17711725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
17721725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
17735b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman                bufferWidth = p->getBE().mBuffer->getWidth();
17745b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman                bufferHeight = p->getBE().mBuffer->getHeight();
17751725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
17765b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman                bufferHeight = p->getBE().mBuffer->getWidth();
17775b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman                bufferWidth = p->getBE().mBuffer->getHeight();
17781725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
177941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth);
178041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight);
17819b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
17829b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
17839b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
17849b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
17851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
17871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
178913fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const {
1790e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
17916452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
179213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf;
179313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return parentAlpha * getDrawingState().color.a;
17946452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
17956452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
179613fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const {
179713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    const half4 color(getDrawingState().color);
179813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return half4(color.r, color.g, color.b, getAlpha());
17996452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
18006452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
18011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
18021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
18031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
18041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
18051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
1807e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
18081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18101d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) {
18111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
18121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
18131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const State& state = useDrawing ? mDrawingState : mCurrentState;
18141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform requestedTransform = state.active.transform;
18161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform transform = getTransform();
18171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_id(sequence);
18191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_name(getName().c_str());
18201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_type(String8(getTypeId()));
18211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const auto& child : children) {
18231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->add_children(child->sequence);
18241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
18271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        sp<Layer> strongRelative = weakRelative.promote();
18281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        if (strongRelative != nullptr) {
18291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw            layerInfo->add_relatives(strongRelative->sequence);
18301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        }
18311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.activeTransparentRegion,
18341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw                                   layerInfo->mutable_transparent_region());
18351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region());
18361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region());
18371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_layer_stack(getLayerStack());
18391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_z(state.z);
18401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* position = layerInfo->mutable_position();
18421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_x(transform.tx());
18431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_y(transform.ty());
18441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* requestedPosition = layerInfo->mutable_requested_position();
18461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_x(requestedTransform.tx());
18471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_y(requestedTransform.ty());
18481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    SizeProto* size = layerInfo->mutable_size();
18501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_w(state.active.w);
18511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_h(state.active.h);
18521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop());
18541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop());
18551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_is_opaque(isOpaque(state));
18571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_invalidate(contentDirty);
18581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_dataspace(dataspaceDetails(getDataSpace()));
18591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat()));
18601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color());
18611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color());
18621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_flags(state.flags);
18631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());
18651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform());
18661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18678e0af3679ec73e07775142825d592448b255f61cJorim Jaggi    auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote();
18681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (parent != nullptr) {
18691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_parent(parent->sequence);
18701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto zOrderRelativeOf = state.zOrderRelativeOf.promote();
18731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (zOrderRelativeOf != nullptr) {
18741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence);
18751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18775b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman    auto buffer = getBE().mBuffer;
18785b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman    if (buffer != nullptr) {
18795b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        LayerProtoHelper::writeToProto(buffer, layerInfo->mutable_active_buffer());
18801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_queued_frames(getQueuedFrameCount());
18831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_refresh_pending(isBufferLatched());
18841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}
18851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
188613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
188713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
18883f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18903f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
18913f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
18923f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18943f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
18953f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
18963f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1897