Layer.cpp revision 80d611613ef1a9c05a31cd3f47badfd4de9b1418
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
42a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h>
4390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
453e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
487b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
5141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h"
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h"
59c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
6041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
649eeae69005ef9a774bde19195b9c06eba7e463c2David SodmanLayerBE::LayerBE()
650cc69188196037c06127c0bc56c516069dbaa558David Sodman      : mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) {
669eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman}
679eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
689eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
7141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
7241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             uint32_t h, uint32_t flags)
730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman      : contentDirty(false),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
770c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mName(name),
7813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
82399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
83a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
85c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
86a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
87cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
8882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
8913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
93a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
94a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
95a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
9765476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
9882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
9941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mFreezeGeometryUpdates(false) {
1009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
101a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1024d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
10441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden;
10541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque;
10641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure;
1074d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
109f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    mTransactionName = String8("TX - ") + mName;
1104d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1114d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1130c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    mCurrentState.flags = layerFlags;
1143dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
115b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
116b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedFinalCrop = mCurrentState.finalCrop;
1187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedCrop = mCurrentState.crop;
1194d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
12013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = 1.0f;
1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
124bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1252f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1262f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1306547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1346547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1360a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1370a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
1399eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
140e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
141e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
14241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {}
14396f0819f81293076e652792794a961543e6750d7Mathias Agopian
1444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
145577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    sp<Client> c(mClientRef.promote());
146577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    if (c != 0) {
147577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman        c->detachLayer(this);
148577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    }
149577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman
150577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    for (auto& point : mRemoteSyncPoints) {
151577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman        point->setTransactionApplied();
152577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    }
153577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    for (auto& point : mLocalSyncPoints) {
154577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman        point->setFrameAvailable();
155577c896102ebb13f9496a94674b4ca9cd15fe0adDavid Sodman    }
1566547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
15796f0819f81293076e652792794a961543e6750d7Mathias Agopian}
15896f0819f81293076e652792794a961543e6750d7Mathias Agopian
15913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
16013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
16113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
16213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
163eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/*
164eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through
165eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer.  So, the implementation is done in BufferLayer.  When called on a
166eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP.
167eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */
168eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {}
16913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
170c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() {
171c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mCurrentState to mLayersPendingRemoval
172c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
1738b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw    mPendingRemoval = true;
1748b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw
1755edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1765edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1775edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
1785edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
179c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu            mFlinger->setTransactionFlags(eTraversalNeeded);
1805edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
1815edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1825edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
1835edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
184c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    for (const auto& child : mCurrentChildren) {
185c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        child->onRemovedFromCurrentState();
186c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
187c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu}
1883851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
189c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() {
190c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mLayersPendingRemoval
191eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    abandon();
192c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
193b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    destroyAllHwcLayers();
1943851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
1951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
1961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
1971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19848d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
199cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
20013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
20613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
20713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
20813fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const {
20913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return mPremultipliedAlpha;
21013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
21113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
2124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
2134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
2144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
215582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
216582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
21713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
21913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
22013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
2226f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0,
2239eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                        "Already have a layer for hwcId %d", hwcId);
224b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWC2::Layer* layer = hwc->createLayer(hwcId);
225b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (!layer) {
226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return false;
227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
2286f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers[hwcId];
229b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc = hwc;
230b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.layer = layer;
231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    layer->setLayerDestroyedListener(
2326f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman            [this, hwcId](HWC2::Layer* /*layer*/) { getBE().mHwcLayers.erase(hwcId); });
233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    return true;
234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
23683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wubool Layer::destroyHwcLayer(int32_t hwcId) {
2376f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
23883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu        return false;
239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
2406f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto& hwcInfo = getBE().mHwcLayers[hwcId];
24141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer");
242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
244b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // The layer destroyed listener should have cleared the entry from
245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // mHwcLayers. Verify that.
2466f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0,
2476f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman                        "Stale layer entry in getBE().mHwcLayers");
24883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    return true;
249b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
250b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() {
2526f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    size_t numLayers = getBE().mHwcLayers.size();
253b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    for (size_t i = 0; i < numLayers; ++i) {
2546f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman        LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.empty(), "destroyAllHwcLayers failed");
2556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman        destroyHwcLayer(getBE().mHwcLayers.begin()->first);
256b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
2576f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    LOG_ALWAYS_FATAL_IF(!getBE().mHwcLayers.empty(),
25841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                        "All hardware composer layers should have been destroyed");
259b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
260b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
261a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
262a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
263a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
264f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
265f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
266a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
267f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
2680cc69188196037c06127c0bc56c516069dbaa558David Sodman    } else if (getBE().compositionInfo.mBuffer != NULL) {
269a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
2700cc69188196037c06127c0bc56c516069dbaa558David Sodman        crop = getBE().compositionInfo.mBuffer->getBounds();
271f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
272a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
2734fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
274f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
275f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
276f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
277f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
278f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
279f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
280f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
281f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
282f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
283f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
284f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
285f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
286f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
287f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
28880d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stozastatic FloatRect reduce(const FloatRect& win, const Region& exclude) {
28980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    if (CC_LIKELY(exclude.isEmpty())) {
29080d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza        return win;
29180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    }
29280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    // Convert through Rect (by rounding) for lack of FloatRegion
29380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    return Region(Rect{win}).subtract(exclude).getBounds().toFloatRect();
29480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza}
29580d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza
2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
30741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
30841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
30941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
31041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
311e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
3181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
3191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
33480d611613ef1a9c05a31cd3f47badfd4de9b1418Dan StozaFloatRect Layer::computeBounds() const {
3351eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
3366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
3376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
3386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
33980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan StozaFloatRect Layer::computeBounds(const Region& activeTransparentRegion) const {
3406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
342b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
343b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
344b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
3461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
348e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
3491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
350de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
351de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
352de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
3531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
35680d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza
35780d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    FloatRect floatWin = win.toFloatRect();
3581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
35980d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza        floatWin = t.transform(floatWin);
36080d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza        floatWin = floatWin.intersect(bounds.toFloatRect());
36180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza        floatWin = t.inverse().transform(floatWin);
3621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3646c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
36580d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    return reduce(floatWin, activeTransparentRegion);
36613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
36713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
369b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
37013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
3711eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
37213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
37313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
37413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
3756b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
3766b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
3776b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
3786b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
3790e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3800e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
381b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
382df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
3830e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
3840e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
387acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
388acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
389acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
390b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
39141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(s.finalCrop, &activeCrop)) {
392acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
393acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
394acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
395b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
396b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    const auto& p = mDrawingParent.promote();
397b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    if (p != nullptr) {
398b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        auto parentCrop = p->computeInitialCrop(hw);
399b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        activeCrop.intersect(parentCrop, &activeCrop);
400b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    }
401b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4055a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4085a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
41813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
41928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
42028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
42128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
42228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
42328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
42428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
42813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
429f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
430f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
431f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
436cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
438021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
439021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
44141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform();
442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
443acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
44441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
44513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
44741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation();
448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
451acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
46141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
464acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
465acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
46641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h);
46713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
46941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float xScale = crop.getWidth() / float(winWidth);
470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
47113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
47241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetL = winCrop.left * xScale;
47341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetT = winCrop.top * yScale;
47441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetR = (winWidth - winCrop.right) * xScale;
475acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
476acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
47741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.left += insetL;
47841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.top += insetT;
47941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.right -= insetR;
480acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
48113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
48213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
48313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
48413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
485ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
486a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
4879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
4886f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto& hwcInfo = getBE().mHwcLayers[hwcId];
489a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
4903e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
4919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
4929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
4949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
4959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
4969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
498dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
49913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
5001eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
501ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
5026452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
50341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        blendMode =
50441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
5059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
506ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
50741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
50841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set blend mode %s:"
50941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             " %s (%d)",
51041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
51141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
51213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
51313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
51413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
5156c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
5161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
517b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
518b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
5191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
52041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
522acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
52428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
52528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
52628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
52728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
52828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
52928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
53041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5336c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
5346c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
53541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h));
53641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom));
53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(
53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom));
5396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
5401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
54180d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    // computeBounds returns a FloatRect to provide more accuracy during the
54280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    // transformation. We then round upon constructing 'frame'.
54380d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    Rect frame{t.transform(computeBounds(activeTransparentRegion))};
544b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
54541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!frame.intersect(s.finalCrop, &frame)) {
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
5539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
554ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
555e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
55641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
55741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.left, transformedFrame.top, transformedFrame.right,
55841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
559e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
560e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
561e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5635a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
5649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
565e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
566e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
56741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              "%s (%d)",
56841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
56941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
570e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
571e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
572e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
57413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    float alpha = static_cast<float>(getAlpha());
5756452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
57641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
57741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set plane alpha %.3f: "
57841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "%s (%d)",
57941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
581ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
58241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
58341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             to_string(error).c_str(), static_cast<int32_t>(error));
5842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
5852a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
5862a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
587e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
5882a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
5892a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
5902a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
5912a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
5922a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
5932a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
5942a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
59541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
59641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
5979f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
59829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
59929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
60029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
60129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
60229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
60329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
60429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
60529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
60629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
6071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
608c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
609cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
610c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
611021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
612021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
613c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
61441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
615c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
616c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
61741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
618c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
619cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
620cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
621cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
622cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
623cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
624cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
625cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
626cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
627c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
62829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
62929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
63013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
6319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
6329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
6339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
6359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
6369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
63741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE_IF(error != HWC2::Error::None,
63841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "[%s] Failed to set transform %s: "
63941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "%s (%d)",
64041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
64141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 static_cast<int32_t>(error));
6429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
643a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
644a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
6459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
6466f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
6489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6516f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    getBE().mHwcLayers[hwcId].forceClientComposition = true;
6529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
653eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
654c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) {
6556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
656c9232edd34618360d099272fb0537cae2f715860chaviw        ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId);
657c9232edd34618360d099272fb0537cae2f715860chaviw        return false;
658c9232edd34618360d099272fb0537cae2f715860chaviw    }
659c9232edd34618360d099272fb0537cae2f715860chaviw
6606f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    return getBE().mHwcLayers[hwcId].forceClientComposition;
661c9232edd34618360d099272fb0537cae2f715860chaviw}
662c9232edd34618360d099272fb0537cae2f715860chaviw
6639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
6656f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0 ||
6669eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman        getCompositionType(hwcId) != HWC2::Composition::Cursor) {
6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
6719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
672dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
6739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
6749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
676b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
677b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
6811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
6829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
683b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
684b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
685acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6896f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto error = getBE().mHwcLayers[hwcId].layer->setCursorPosition(position.left,
6909eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                                                                              position.top);
69141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
69241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set cursor position "
69341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "to (%d, %d): %s (%d)",
69441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), position.left, position.top, to_string(error).c_str(),
69541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
69703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
69813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
69913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
70013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
70113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
702a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const {
703a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, clip, false);
70413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
70513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
706a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const {
707a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform);
70813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
70913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
710a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const {
711a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), false);
712c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
713c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
71441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue,
71541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            float alpha) const {
71619733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
7179eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    computeGeometry(renderArea, getBE().mMesh, false);
71819733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
7199eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    engine.drawMesh(getBE().mMesh);
72013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
72113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
722a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const {
72341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    clearWithOpenGL(renderArea, 0, 0, 0, 0);
72413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
72513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
72641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
7276f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7316f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    auto& hwcInfo = getBE().mHwcLayers[hwcId];
7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
73341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(),
73441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman          static_cast<int>(callIntoHwc));
7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
74041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE_IF(error != HWC2::Error::None,
74141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "[%s] Failed to set "
74241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "composition type %s: %s (%d)",
74341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     mName.string(), to_string(type).c_str(), to_string(error).c_str(),
74441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     static_cast<int32_t>(error));
7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
750ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
751ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
752ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
753ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
754ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
7556f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
756ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7596f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    return getBE().mHwcLayers.at(hwcId).compositionType;
7609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
7636f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7676f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    getBE().mHwcLayers[hwcId].clearClientTarget = clear;
7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
7716f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7756f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    return getBE().mHwcLayers.at(hwcId).clearClientTarget;
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
778cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
779cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
780cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
781cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
782cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
7837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
784cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
785cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
786cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
787cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
7887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
7897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
79013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
79113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
79213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
79313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
79413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
79513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
79613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
79713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
79813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
79913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
80013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
80113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
802acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
803acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
805acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
806acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
807acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
808acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
809acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
811acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
812acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
813acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
814acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
815acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
816acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
817a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh,
818a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                            bool useIdentityTransform) const {
8191eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
820a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const Transform renderAreaTransform(renderArea.getTransform());
821a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const uint32_t height = renderArea.getHeight();
82280d611613ef1a9c05a31cd3f47badfd4de9b1418Dan Stoza    FloatRect win = computeBounds();
8233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
824acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
825acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
826acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
827acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
828acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
8291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
830acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
8311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
8321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
8331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
8341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
835acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
836acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
837b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
838b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
839b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
840b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
841b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
842acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
843acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
844ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
845a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[0] = renderAreaTransform.transform(lt);
846a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[1] = renderAreaTransform.transform(lb);
847a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[2] = renderAreaTransform.transform(rb);
848a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[3] = renderAreaTransform.transform(rt);
84941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (size_t i = 0; i < 4; i++) {
850a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        position[i].y = height - position[i].y;
85113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
85213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
853ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
85441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const {
855231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
856231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
857231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
858231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
85913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
86013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
86113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
86213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
86313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
86413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
86513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
86613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
86713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
86813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
86941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
87013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
87113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
87213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
87313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
87413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
87513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
87613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
87713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
8787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
8797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
8807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
8817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
8847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
8850d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
8860d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
8870d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
8880d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
8897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
8907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
8920d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
8933bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
89441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber);
8950d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
896cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
897cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
898cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
899cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
9000d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
901cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
9027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
9037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
9057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
906f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
9077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
909f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
9107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
91205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
91305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
91405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
91541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    stateToCommit->flags =
91641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask);
9177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
919f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
9207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
92205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
9237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
9247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
9250d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
9277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
9307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
93105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
9347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
93641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) {
93741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                ALOGE("[%s] Unexpected sync point frame number found", mName.string());
938cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
939cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
940cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
941cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
942cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
943cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
944cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
9457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
9467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
94705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
9517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
9527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
953792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
954792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
9557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
95705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
9587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
9597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
9607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
9637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
9647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
9657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
9667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
9677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
9707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
9717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
97313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
9741c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
9751c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
9767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
97705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
97805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
9797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
9807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9821eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h);
985a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
986eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    if (sizeChanged) {
987cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
9889d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
98941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
99041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
99141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n"
99241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
99341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n",
9949eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 this, getName().string(), mCurrentTransform,
9959eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top,
9969eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w,
9979eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right,
9989eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w,
9999eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 s.requested.h);
1000a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
10012a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
10022a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1003eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman        setDefaultBufferSize(c.requested.w, c.requested.h);
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1005cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
1006e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // Don't let Layer::doTransaction update the drawing state
1007e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // if we have a pending resize, unless we are in fixed-size mode.
1008e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // the drawing state will be updated only once we receive a buffer
1009e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // with the correct size.
1010e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
1011e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In particular, we want to make sure the clip (which is part
1012e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // of the geometry state) is latched together with the size but is
1013e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // latched immediately when no resizing is involved.
1014e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
1015e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // If a sideband stream is attached, however, we want to skip this
1016e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // optimization so that transactions aren't missed when a buffer
1017e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // never arrives
1018e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
1019e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In the case that we don't have a buffer we ignore other factors
1020e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // and avoid entering the resizePending state. At a high level the
1021e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // resizePending state is to avoid applying the state of the new buffer
1022e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // to the old buffer. However in the state where we don't have an old buffer
1023e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // there is no such concern but we may still be being used as a parent layer.
102441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) &&
10250cc69188196037c06127c0bc56c516069dbaa558David Sodman            (getBE().compositionInfo.mBuffer != nullptr);
10260cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
10270cc69188196037c06127c0bc56c516069dbaa558David Sodman        if (resizePending && getBE().compositionInfo.hwc.sidebandStream == nullptr) {
10280cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
10290cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
10300cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
10310cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
10327bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
10337bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
10347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
10357bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
10367d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
10377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
10387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
10397bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
10407bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
10417bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
10427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
10447bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
10457bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
10467bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
10477bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10487bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
10497bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
10507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
105182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
105282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
105382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
105482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
105582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
105682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
105782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
105882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
105982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10621eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
106513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10671eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
106813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
106913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
107013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
10733dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
107441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE));
107513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
107613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1077c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1078c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1079c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1080c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
10811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1082c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1083c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
108413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
108505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
108613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
109005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1091a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1092a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
109313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
109413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
109513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
109613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
109713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
109813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
109913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
110013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
110182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
11023dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
110313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
110413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
110569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
110669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
110769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
110869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
11093dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
11107bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
11117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
11127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
11137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
11147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
111582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
111682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
11177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
111869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
11197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
112013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
112113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
112382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
11241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
11251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
11261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
11271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
11281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
11291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
11301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
11311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
11321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
11331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
11341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
11351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1136503c7046237f2797a5cf8584064223359d0e6d10Robert Carrbool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
1137503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
1138503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
1139503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    if (idx < 0) {
1140503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        return false;
1141503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    }
1142503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) {
1143503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        mCurrentChildren.removeAt(idx);
1144503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        mCurrentChildren.add(childLayer);
1145503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    }
1146503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    return true;
1147503c7046237f2797a5cf8584064223359d0e6d10Robert Carr}
1148503c7046237f2797a5cf8584064223359d0e6d10Robert Carr
1149ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
115041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.z == z) return false;
115113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
115213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
11537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1154db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1155db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1156db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1157db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1158db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1159db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1160db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1161db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1162db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
116313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
116413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
116513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
11661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1167db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1168db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1169db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1170db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1171db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1172db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1173db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1174db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1175db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1176db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1177db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1178db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1179db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1180db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1181db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1182db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1183db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1184db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1185db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1186db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1187db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1188db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1189db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1190db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1191db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1192db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1193db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1194db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
11959ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
11969ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    if (oldZOrderRelativeOf != nullptr) {
11979ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw        oldZOrderRelativeOf->removeZOrderRelative(this);
11989ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    }
1199db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1200db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1201db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1202db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1203db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1204db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1205db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1206db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
120713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
120841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false;
120913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
121013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
12117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
121213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
121313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
121413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
121641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.color.a == alpha) return false;
121713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
121813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = alpha;
12197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
122013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
122113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
122213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
122313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
122413fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) {
122541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g &&
122641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        color.b == mCurrentState.color.b)
122713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw        return false;
122813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
122913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.sequence++;
123013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.r = color.r;
123113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.g = color.g;
123213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.b = color.b;
123313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.modified = true;
123413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    setTransactionFlags(eTransactionNeeded);
123513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return true;
123613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
123713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
123813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
123913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
124041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
12417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
124213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
124313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
124413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
124513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
12462ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
12477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
124813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
124913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
125013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
125113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
125213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
125341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.flags == newFlags) return false;
125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
12567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
12577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
126199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
126299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
126341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedCrop == crop) return false;
126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
126599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
12667bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
126799e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
126899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
12697bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12707bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
12717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
127213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
127313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
127413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
12758d5227b8416b099c884429312daf2d60496fa484Robert Carr
12768d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
127741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedFinalCrop == crop) return false;
1278acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
12798d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
12807bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
12818d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
12828d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
12837bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1285acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1286acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1287acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1288acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1290c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
129141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (scalingMode == mOverrideScalingMode) return false;
1292c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
129382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1294c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1295c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1296c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
12972f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
129841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.appId = appId;
129941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.type = type;
130041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.modified = true;
130141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    setTransactionFlags(eTransactionNeeded);
13022f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
13032f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
130413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
130541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.layerStack == layerStack) return false;
130613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
130713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
13087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
130913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
131013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1311a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1312a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1313bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
131441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.dataSpace == dataSpace) return false;
1315bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1316bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1317bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1318bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1319bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1320bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1321bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1322532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1323532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1324532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1325532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
13261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1327e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
13281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
13291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
13301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
13321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
133441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
13350d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
13367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
13377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
13387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
13397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
13407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
13410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1342792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
13437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
13440d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
13450d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
134641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) {
13470d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
13480d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
13497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1351ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
13571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
1358e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
13591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
13601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
13611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
13631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
136541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const {
136613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
136713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
136813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
137013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
137103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
137203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
137303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
137513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
137613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
137713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
137813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
137913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
138013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
138113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
138213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
138313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
138413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
138513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
138613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
138713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
138913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
1390eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    setTransformHint(orientation);
139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1397a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const {
1398a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    LayerDebugInfo info;
1399a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    const Layer::State& ds = getDrawingState();
1400a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mName = getName();
14011acbec7884a47f316005ba4f2b5e47c74317ee43chaviw    sp<Layer> parent = getParent();
1402a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
1403a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mType = String8(getTypeId());
1404a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mTransparentRegion = ds.activeTransparentRegion;
1405a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mVisibleRegion = visibleRegion;
1406a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mSurfaceDamageRegion = surfaceDamageRegion;
1407a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mLayerStack = getLayerStack();
1408a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mX = ds.active.transform.tx();
1409a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mY = ds.active.transform.ty();
1410a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mZ = ds.z;
1411a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mWidth = ds.active.w;
1412a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mHeight = ds.active.h;
1413a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mCrop = ds.crop;
1414a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFinalCrop = ds.finalCrop;
141513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    info.mColor = ds.color;
1416a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFlags = ds.flags;
1417a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mPixelFormat = getPixelFormat();
1418a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mDataSpace = getDataSpace();
1419a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][0] = ds.active.transform[0][0];
1420a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][1] = ds.active.transform[0][1];
1421a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][0] = ds.active.transform[1][0];
1422a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][1] = ds.active.transform[1][1];
1423a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
14240cc69188196037c06127c0bc56c516069dbaa558David Sodman        sp<const GraphicBuffer> buffer = getBE().compositionInfo.mBuffer;
14255b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        if (buffer != 0) {
14265b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferWidth = buffer->getWidth();
14275b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferHeight = buffer->getHeight();
14285b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferStride = buffer->getStride();
14295b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman            info.mActiveBufferFormat = buffer->format;
1430a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        } else {
1431a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = 0;
1432a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = 0;
1433a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = 0;
1434a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = 0;
1435a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
1436bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
1437a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mNumQueuedFrames = getQueuedFrameCount();
1438a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mRefreshPending = isBufferLatched();
1439a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mIsOpaque = isOpaque(ds);
1440a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mContentDirty = contentDirty;
1441a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    return info;
1442d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
144383ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu
1444e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
1445e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1446e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1447e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
1448e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
1449e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
1450e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
1451e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
1452e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1453e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1454e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1455e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1456e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
14576f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    if (getBE().mHwcLayers.count(hwcId) == 0) {
1458e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
1459e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1460e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1461e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
1462e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
1463e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
1464e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
1465e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
1466e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
1467e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
1468e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
1469e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
1470e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1471e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1472e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
1473e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1474e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
14756f65f3e7caab86a76419e7c1d1c787634a0852d8David Sodman    const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId);
14768c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck    result.appendFormat("  %10d | ", layerState.z);
147741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
1478e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
147941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
14805a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
148141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
1482e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1483e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
1484e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
1485e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1486e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1487d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
1488d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
148982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
149082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
1491d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
1492d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
149325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
149425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
14956547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
14966547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14976547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
14986547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1499d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
1500d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
1501d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
1502d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
1503d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
150441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this);
1505d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1506d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
1507d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
1508d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
1509d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
15105ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
15115ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
15125ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
15135ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
15145ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
15153890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
151641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                     FrameEventHistoryDelta* outDelta) {
1517d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1518d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
1519fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // If there are any unsignaled fences in the aquire timeline at this
1520fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // point, the previously queued frame hasn't been latched yet. Go ahead
1521fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // and try to get the signal time here so the syscall is taken out of
1522fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // the main thread's critical path.
1523fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mAcquireTimeline.updateSignalTimes();
1524fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // Push the new fence after updating since it's likely still pending.
15253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
1526d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
1527d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
152840845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
15293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
15303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
1531d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
153240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
1533e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
153498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
153598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
153698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
153798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
153898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
153998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
154098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
154198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
15421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
15431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
15441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
15451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
15481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
15491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
15501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15521db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
15531db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
15541db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
15551db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
15561db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15571db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15581db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
15591db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
15601db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
15611db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
15621db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15631db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15641db73f66624e7d151710483dd58e03eed672f064Robert Carr
15651db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1566e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
15671db73f66624e7d151710483dd58e03eed672f064Robert Carr
15681db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
15691db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
15701db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
15711db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
15721db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15731db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
15741db73f66624e7d151710483dd58e03eed672f064Robert Carr
15751db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
15761db73f66624e7d151710483dd58e03eed672f064Robert Carr}
15771db73f66624e7d151710483dd58e03eed672f064Robert Carr
1578f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) {
1579f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (newParentHandle == nullptr) {
15800617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15810617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15820617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15830617894190ea0c3ee50889bee1d4df0f369b0761chaviw    auto handle = static_cast<Handle*>(newParentHandle.get());
15840617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Layer> newParent = handle->owner.promote();
15850617894190ea0c3ee50889bee1d4df0f369b0761chaviw    if (newParent == nullptr) {
15860617894190ea0c3ee50889bee1d4df0f369b0761chaviw        ALOGE("Unable to promote Layer handle");
15870617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15880617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15890617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1590f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Layer> parent = getParent();
1591f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (parent != nullptr) {
1592f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        parent->removeChild(this);
15930617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
1594f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    newParent->addChild(this);
15950617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1596f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Client> client(mClientRef.promote());
15970617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Client> newParentClient(newParent->mClientRef.promote());
15980617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1599f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (client != newParentClient) {
1600f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        client->setParentLayer(newParent);
16010617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
16020617894190ea0c3ee50889bee1d4df0f369b0761chaviw
16030617894190ea0c3ee50889bee1d4df0f369b0761chaviw    return true;
16040617894190ea0c3ee50889bee1d4df0f369b0761chaviw}
16050617894190ea0c3ee50889bee1d4df0f369b0761chaviw
16069524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
16077f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1608161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        sp<Client> parentClient = mClientRef.promote();
16099524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
1610161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        if (client != nullptr && parentClient != client) {
16117f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr            client->detachLayer(child.get());
16127f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr            child->detachChildren();
16139524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
16147f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr    }
16159524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
16169524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
16179524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
16189524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
16191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
1620e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
16211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
16241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
16251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
16261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
16291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
16301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
16311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
16331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
16361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
16371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
163929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carrbool Layer::usingRelativeZ(LayerVector::StateSet stateSet) {
164029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
164129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    const State& state = useDrawing ? mDrawingState : mCurrentState;
164229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    return state.zOrderRelativeOf != nullptr;
164329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr}
164429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
164541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(
164629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        LayerVector::StateSet stateSet, bool* outSkipRelativeZUsers) {
1647412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1648412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
1649412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1650412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1651412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
1652412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
165329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    if (state.zOrderRelatives.size() == 0) {
165429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        *outSkipRelativeZUsers = true;
165529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        return children;
165629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    }
165729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1658db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
1659412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1660db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
1661db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1662db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
1663db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1664db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1665db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1666412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
1667503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState;
1668503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        if (childState.zOrderRelativeOf != nullptr) {
1669503c7046237f2797a5cf8584064223359d0e6d10Robert Carr            continue;
1670503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        }
1671db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
1672db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1673db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1674db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
1675db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1676db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1678db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
16791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1680412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
168129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // In the case we have other layers who are using a relative Z to us, makeTraversalList will
168229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // produce a new list for traversing, including our relatives, and not including our children
168329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // who are relatives of another surface. In the case that there are no relative Z,
168429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // makeTraversalList returns our children directly to avoid significant overhead.
168529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // However in this case we need to take the responsibility for filtering children which
168629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // are relatives of another surface here.
168729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    bool skipRelativeZUsers = false;
168829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    const LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers);
1689db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
1691db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1692db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
169329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
169429abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
169529abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
169629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1697db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
16981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
1699db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1700412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
17011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
170229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1703412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
1704db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1705db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
170629abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
170729abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
170829abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
170929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
1710412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
17111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
17141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1715db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
17161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1717412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
1718412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
171929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    // See traverseInZOrder for documentation.
172029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    bool skipRelativeZUsers = false;
172129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr    LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers);
1722db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
17231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
1724bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson    for (i = int32_t(list.size()) - 1; 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
1731db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
17321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
17331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
1734412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
17351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1736412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
173741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (; i >= 0; i--) {
1738db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
173929abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
174029abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
174129abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr            continue;
174229abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr        }
174329abff83bb6e148961c2319add7bd72eb76af3d4Robert Carr
1744412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
17451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1748a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/**
1749a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers.
1750a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */
1751a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet,
1752a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                                     const LayerVector::Visitor& visitor) {
1753a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1754a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1755a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
1756a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    size_t i = 0;
1757a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1758a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1759a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        if (relative->getZ() >= 0) {
1760a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            break;
1761a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
1762a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1763a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1764a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    visitor(this);
1765a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1766a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1767a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1768a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1769a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw}
1770a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
17711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
17721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
1773e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
17741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
17751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
17769b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
17779b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
17789b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
17799b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
17809b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
17819b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
17820cc69188196037c06127c0bc56c516069dbaa558David Sodman        if (p->isFixedSize() && p->getBE().compositionInfo.mBuffer != nullptr) {
17831725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
17841725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
17851725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
17860cc69188196037c06127c0bc56c516069dbaa558David Sodman                bufferWidth = p->getBE().compositionInfo.mBuffer->getWidth();
17870cc69188196037c06127c0bc56c516069dbaa558David Sodman                bufferHeight = p->getBE().compositionInfo.mBuffer->getHeight();
17881725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
17890cc69188196037c06127c0bc56c516069dbaa558David Sodman                bufferHeight = p->getBE().compositionInfo.mBuffer->getWidth();
17900cc69188196037c06127c0bc56c516069dbaa558David Sodman                bufferWidth = p->getBE().compositionInfo.mBuffer->getHeight();
17911725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
179241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth);
179341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight);
17949b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
17959b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
17969b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
17979b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
17981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
18001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
180213fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const {
1803e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
18046452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
180513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf;
180613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return parentAlpha * getDrawingState().color.a;
18076452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
18086452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
180913fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const {
181013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    const half4 color(getDrawingState().color);
181113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return half4(color.r, color.g, color.b, getAlpha());
18126452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
18136452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
18141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
18151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
18161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
18171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
18181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
1820e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
18211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18231d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) {
18241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
18251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
18261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const State& state = useDrawing ? mDrawingState : mCurrentState;
18271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform requestedTransform = state.active.transform;
18291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform transform = getTransform();
18301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_id(sequence);
18321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_name(getName().c_str());
18331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_type(String8(getTypeId()));
18341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const auto& child : children) {
18361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->add_children(child->sequence);
18371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
18401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        sp<Layer> strongRelative = weakRelative.promote();
18411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        if (strongRelative != nullptr) {
18421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw            layerInfo->add_relatives(strongRelative->sequence);
18431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        }
18441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.activeTransparentRegion,
18471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw                                   layerInfo->mutable_transparent_region());
18481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region());
18491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region());
18501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_layer_stack(getLayerStack());
18521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_z(state.z);
18531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* position = layerInfo->mutable_position();
18551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_x(transform.tx());
18561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_y(transform.ty());
18571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* requestedPosition = layerInfo->mutable_requested_position();
18591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_x(requestedTransform.tx());
18601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_y(requestedTransform.ty());
18611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    SizeProto* size = layerInfo->mutable_size();
18631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_w(state.active.w);
18641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_h(state.active.h);
18651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop());
18671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop());
18681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_is_opaque(isOpaque(state));
18701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_invalidate(contentDirty);
18711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_dataspace(dataspaceDetails(getDataSpace()));
18721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat()));
18731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color());
18741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color());
18751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_flags(state.flags);
18761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());
18781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform());
18791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18808e0af3679ec73e07775142825d592448b255f61cJorim Jaggi    auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote();
18811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (parent != nullptr) {
18821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_parent(parent->sequence);
18831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto zOrderRelativeOf = state.zOrderRelativeOf.promote();
18861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (zOrderRelativeOf != nullptr) {
18871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence);
18881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18900cc69188196037c06127c0bc56c516069dbaa558David Sodman    auto buffer = getBE().compositionInfo.mBuffer;
18915b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman    if (buffer != nullptr) {
18925b4cffc352f7f5d3711d4b7798a07434a998b2d7David Sodman        LayerProtoHelper::writeToProto(buffer, layerInfo->mutable_active_buffer());
18931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_queued_frames(getQueuedFrameCount());
18961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_refresh_pending(isBufferLatched());
18971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}
18981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
189913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
190013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
19013f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19033f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
19043f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
19053f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19073f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
19083f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
19093f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1910