Layer.cpp revision c9232edd34618360d099272fb0537cae2f715860
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h>
4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
5241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h"
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h"
60c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
6141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
6741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
6841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             uint32_t h, uint32_t flags)
690c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman      : contentDirty(false),
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mName(name),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
77a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
78399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
79a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
80a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
81c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
83cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
8482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
8513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
8613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
875cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
8813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
8903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
90a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
91a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
92a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
93a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
9465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
9582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
9641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mFreezeGeometryUpdates(false) {
979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
98a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1004d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
10141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden;
10241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque;
10341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure;
1044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
106f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    mTransactionName = String8("TX - ") + mName;
1074d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1094d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1100c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    mCurrentState.flags = layerFlags;
1113dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
112b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
113b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedFinalCrop = mCurrentState.finalCrop;
1157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedCrop = mCurrentState.crop;
1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
11713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = 1.0f;
1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1194d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1204d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
121bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1222f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1232f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1276547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1316547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1320a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1330a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1340a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
136e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
137e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
13841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {}
13996f0819f81293076e652792794a961543e6750d7Mathias Agopian
1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1416547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14296f0819f81293076e652792794a961543e6750d7Mathias Agopian}
14396f0819f81293076e652792794a961543e6750d7Mathias Agopian
14413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
14513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
14613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
14713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
148eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/*
149eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through
150eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer.  So, the implementation is done in BufferLayer.  When called on a
151eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP.
152eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */
153eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {}
15413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
155c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() {
156c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mCurrentState to mLayersPendingRemoval
157c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
1588b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw    mPendingRemoval = true;
1598b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw
1605edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1615edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1625edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
1635edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
164c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu            mFlinger->setTransactionFlags(eTraversalNeeded);
1655edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
1665edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1675edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
1685edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
169c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    for (const auto& child : mCurrentChildren) {
170c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        child->onRemovedFromCurrentState();
171c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
172c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu}
1733851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
174c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() {
175c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mLayersPendingRemoval
176eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    abandon();
177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
178b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    destroyAllHwcLayers();
1793851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
1801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
1811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
1821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
184cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
18513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
18613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
18713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
18813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1891eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
19013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
19113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
19213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
19313fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const {
19413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return mPremultipliedAlpha;
19513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
19613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
1974d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
1984d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
1994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
200582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
201582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
206b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
20741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Already have a layer for hwcId %d", hwcId);
208b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWC2::Layer* layer = hwc->createLayer(hwcId);
209b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (!layer) {
210b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return false;
211b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
212b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWCInfo& hwcInfo = mHwcLayers[hwcId];
213b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc = hwc;
214b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.layer = layer;
215b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    layer->setLayerDestroyedListener(
21641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            [this, hwcId](HWC2::Layer* /*layer*/) { mHwcLayers.erase(hwcId); });
217b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    return true;
218b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
219b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
220b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyHwcLayer(int32_t hwcId) {
221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (mHwcLayers.count(hwcId) == 0) {
222b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return;
223b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
224b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    auto& hwcInfo = mHwcLayers[hwcId];
22541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer");
226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
228b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // The layer destroyed listener should have cleared the entry from
229b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // mHwcLayers. Verify that.
23041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers");
231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
232b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() {
234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    size_t numLayers = mHwcLayers.size();
235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    for (size_t i = 0; i < numLayers; ++i) {
236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed");
237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        destroyHwcLayer(mHwcLayers.begin()->first);
238b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(),
24041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                        "All hardware composer layers should have been destroyed");
241b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
243a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
244a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
245a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
246f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
247f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
248a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
249f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
250a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
251a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
252a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
253f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
254a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
2554fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
256f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
257f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
258f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
259f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
260f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
261f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
262f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
263f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
264f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
265f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
266f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
267f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
268f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
269f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
2701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
2711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
2721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
2731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
2751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
2761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
2791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
2801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
28141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
28241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
28341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
28441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
285e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
2881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
2891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
2901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
2911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
2921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
2931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
2941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
2951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
30813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
3091eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
3106c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
3116c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
3126c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
3136c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
3146c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
316b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
317b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
318b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
322e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
324de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
325de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
326de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
3341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3366c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
3376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
341b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
3431eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
34413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
3476b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
3486b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
3496b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
3506b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
3510e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3520e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
353b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
354df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
3550e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
3560e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
359acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
360acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
361acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
362b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
36341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(s.finalCrop, &activeCrop)) {
364acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
366acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
367b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
368b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    const auto& p = mDrawingParent.promote();
369b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    if (p != nullptr) {
370b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        auto parentCrop = p->computeInitialCrop(hw);
371b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        activeCrop.intersect(parentCrop, &activeCrop);
372b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    }
373b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
3741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
3751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3775a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
3781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
3791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
3805a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
3811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
39013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
39128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
39228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
39328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
39428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
39528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
39628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
397acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
398acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
399acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
40013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
401f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
402f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
403f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
404acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
405acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
406acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
407acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
408cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
409acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
410021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
411021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
412acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
41341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform();
414acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
415acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
41641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
41713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
418acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
41941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation();
420acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
421acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
422acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
43341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
43841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h);
43913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
44141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float xScale = crop.getWidth() / float(winWidth);
442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
44313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
44441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetL = winCrop.left * xScale;
44541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetT = winCrop.top * yScale;
44641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetR = (winWidth - winCrop.right) * xScale;
447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
44941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.left += insetL;
45041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.top += insetT;
45141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.right -= insetR;
452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
45313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
45413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
45513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
45613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
457ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
458a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
4599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
4609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
461a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
4623e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
4639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
4649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
4669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
4679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
4689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
470dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
47113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
4721eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
473ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
4746452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
47541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        blendMode =
47641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
4779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
478ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
47941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
48041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set blend mode %s:"
48141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             " %s (%d)",
48241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
48341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
48413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
48513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
48613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
4876c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
489b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
490b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
49241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
493acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
494acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
49628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
49728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
49828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
49928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
50028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
50128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
50241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
503acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5056c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
5066c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
50741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h));
50841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom));
50941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(
51041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom));
5116c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
5121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
514b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
51541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!frame.intersect(s.finalCrop, &frame)) {
516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
519acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
5239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
524ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
525e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
52641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
52741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.left, transformedFrame.top, transformedFrame.right,
52841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
529e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
530e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
531e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5335a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
5349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
535e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
536e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              "%s (%d)",
53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
53941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
540e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
541e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
542e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
54413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    float alpha = static_cast<float>(getAlpha());
5456452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
54641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
54741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set plane alpha %.3f: "
54841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "%s (%d)",
54941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
5509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
551ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
55241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
55341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             to_string(error).c_str(), static_cast<int32_t>(error));
5542f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
5552a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
5562a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
557e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
5582a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
5592a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
5602a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
5612a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
5622a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
5632a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
5642a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
56541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
56641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
5679f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
56829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
56929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
57029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
57129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
57229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
57329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
57429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
57529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
57629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
5771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
578c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
579cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
580c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
581021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
582021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
583c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
58441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
585c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
586c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
58741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
588c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
589cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
590cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
591cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
592cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
593cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
594cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
595cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
596cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
597c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
59829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
59929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
60013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
6019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
6029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
6039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
6059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
6069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
60741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE_IF(error != HWC2::Error::None,
60841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "[%s] Failed to set transform %s: "
60941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "%s (%d)",
61041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
61141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 static_cast<int32_t>(error));
6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
613a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
614a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
6159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
6169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
6179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
6189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
6229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
623eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
624c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) {
625c9232edd34618360d099272fb0537cae2f715860chaviw    if (mHwcLayers.count(hwcId) == 0) {
626c9232edd34618360d099272fb0537cae2f715860chaviw        ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId);
627c9232edd34618360d099272fb0537cae2f715860chaviw        return false;
628c9232edd34618360d099272fb0537cae2f715860chaviw    }
629c9232edd34618360d099272fb0537cae2f715860chaviw
630c9232edd34618360d099272fb0537cae2f715860chaviw    return mHwcLayers[hwcId].forceClientComposition;
631c9232edd34618360d099272fb0537cae2f715860chaviw}
632c9232edd34618360d099272fb0537cae2f715860chaviw
6339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
6349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
63541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mHwcLayers.count(hwcId) == 0 || getCompositionType(hwcId) != HWC2::Composition::Cursor) {
6369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
6409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
641dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
6429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
6439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
6449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
645b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
646b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
6501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
652b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
653b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
654acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
6569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
6579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
65841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, position.top);
65941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
66041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set cursor position "
66141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "to (%d, %d): %s (%d)",
66241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), position.left, position.top, to_string(error).c_str(),
66341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
66503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
66613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
66713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
66813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
66913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
670a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const {
671a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, clip, false);
67213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
67313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
674a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const {
675a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform);
67613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
67713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
678a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const {
679a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), false);
680c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
681c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
68241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue,
68341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            float alpha) const {
68419733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
685a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    computeGeometry(renderArea, mMesh, false);
68619733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
68719733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
68813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
68913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
690a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const {
69141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    clearWithOpenGL(renderArea, 0, 0, 0, 0);
69213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
69313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
69441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
7009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
70141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(),
70241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman          static_cast<int>(callIntoHwc));
7039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
7049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
7059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
70841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE_IF(error != HWC2::Error::None,
70941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "[%s] Failed to set "
71041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "composition type %s: %s (%d)",
71141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     mName.string(), to_string(type).c_str(), to_string(error).c_str(),
71241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     static_cast<int32_t>(error));
7139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
7149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
718ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
719ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
720ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
721ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
722ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
7239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
724ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
7319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
746cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
747cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
748cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
749cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
750cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
7517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
752cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
753cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
754cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
755cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
7567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
7577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
75813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
75913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
76013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
76113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
76213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
76313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
76413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
76513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
76613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
76713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
76813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
76913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
770acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
771acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
772acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
773acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
774acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
775acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
776acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
777acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
778acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
779acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
780acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
781acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
782acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
783acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
784acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
785a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh,
786a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                            bool useIdentityTransform) const {
7871eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
788a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const Transform renderAreaTransform(renderArea.getTransform());
789a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const uint32_t height = renderArea.getHeight();
7901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
7913f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
792acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
793acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
794acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
795acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
796acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
7971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
798acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
7991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
8001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
8011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
8021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
803acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
805b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
806b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
807b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
808b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
809b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
811acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
812ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
813a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[0] = renderAreaTransform.transform(lt);
814a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[1] = renderAreaTransform.transform(lb);
815a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[2] = renderAreaTransform.transform(rb);
816a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[3] = renderAreaTransform.transform(rt);
81741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (size_t i = 0; i < 4; i++) {
818a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        position[i].y = height - position[i].y;
81913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
82013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
821ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
82241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const {
823231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
824231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
825231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
826231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
82713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
82813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
82913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
83013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
83113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
83213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
83313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
83413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
83513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
83613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
83741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
83813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
83913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
84013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
84113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
84213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
84313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
84413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
84513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
8467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
8477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
8487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
8497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
8527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
8530d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
8540d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
8550d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
8560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
8577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
8587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
8597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
8600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
8613bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
86241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber);
8630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
864cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
865cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
866cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
867cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
8680d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
869cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
8707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
8717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
8737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
874f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
8757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
877f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
8787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
8797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
88005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
88105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
88205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
88341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    stateToCommit->flags =
88441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask);
8857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
887f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
8887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
8897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
89005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
8927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
8930d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
8947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
8957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
8967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
8977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
8987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
89905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
9027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
90441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) {
90541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                ALOGE("[%s] Unexpected sync point frame number found", mName.string());
906cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
907cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
908cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
909cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
910cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
911cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
912cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
9147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
91505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
9197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
9207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
921792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
922792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
9237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
92505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
9277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
9317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
9337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
9347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
9397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
94113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
9421c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
9431c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
9447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
94505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
94605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
9477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
9487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9501eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
95241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h);
953a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
954eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    if (sizeChanged) {
955cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
9569d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
95741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
95841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
95941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n"
96041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
96141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n",
96241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 this, getName().string(), mCurrentTransform, getEffectiveScalingMode(), c.active.w,
96341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 c.active.h, c.crop.left, c.crop.top, c.crop.right, c.crop.bottom,
96441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 c.crop.getWidth(), c.crop.getHeight(), c.requested.w, c.requested.h, s.active.w,
96541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 s.active.h, s.crop.left, s.crop.top, s.crop.right, s.crop.bottom,
96641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 s.crop.getWidth(), s.crop.getHeight(), s.requested.w, s.requested.h);
967a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
9682a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
9692a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
970eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman        setDefaultBufferSize(c.requested.w, c.requested.h);
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
972cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
973e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // Don't let Layer::doTransaction update the drawing state
974e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // if we have a pending resize, unless we are in fixed-size mode.
975e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // the drawing state will be updated only once we receive a buffer
976e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // with the correct size.
977e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
978e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In particular, we want to make sure the clip (which is part
979e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // of the geometry state) is latched together with the size but is
980e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // latched immediately when no resizing is involved.
981e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
982e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // If a sideband stream is attached, however, we want to skip this
983e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // optimization so that transactions aren't missed when a buffer
984e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // never arrives
985e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
986e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In the case that we don't have a buffer we ignore other factors
987e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // and avoid entering the resizePending state. At a high level the
988e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // resizePending state is to avoid applying the state of the new buffer
989e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // to the old buffer. However in the state where we don't have an old buffer
990e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // there is no such concern but we may still be being used as a parent layer.
99141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) &&
99241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (mActiveBuffer != nullptr);
9930cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
9949e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
9950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
9960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
9970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
9980cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
9997bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
10007bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
10017bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
10027bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
10037d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
10047bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
10057bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
10067bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
10077bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
10087bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
10097bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10107bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
10117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
10127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
10137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
10147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
10167bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
10177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
101882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
101982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
102082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
102182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
102282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
102382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
102482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
102582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
102682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
102713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
102813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10291eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
103013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
103113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
103213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
103313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10341eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
103513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
103613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
103713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
103813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
103913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
10403dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
104141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE));
104213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
104313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1044c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1045c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1046c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1047c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
10481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1049c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1050c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
105113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
105205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
105313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
105705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1058a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1059a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
106213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
106513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
106713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
106882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
10693dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
107013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
107269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
107369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
107469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
107569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
10763dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
10777bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
10787bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
10797bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
10807bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
10817bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
108282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
108382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
10847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
108569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
10867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
108713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
108813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
108913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
109082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
10911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
10921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
10931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
10941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
10951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
10961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
10971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
10981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
10991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
11001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
11011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
11021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1103ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
110441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.z == z) return false;
110513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
110613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
11077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1108db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1109db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1110db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1111db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1112db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1113db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1114db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1115db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1116db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
111813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
111913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
11201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1121db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1122db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1123db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1124db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1125db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1126db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1127db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1128db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1129db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1130db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1131db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1132db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1133db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1134db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1135db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1136db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1137db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1138db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1139db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1140db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1141db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1142db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1143db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1144db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1145db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1146db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1147db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1148db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
11499ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
11509ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    if (oldZOrderRelativeOf != nullptr) {
11519ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw        oldZOrderRelativeOf->removeZOrderRelative(this);
11529ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    }
1153db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1154db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1155db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1156db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1157db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1158db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1159db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1160db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
116113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
116241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false;
116313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
116413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
11657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
116613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
116713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
116813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
117041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.color.a == alpha) return false;
117113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
117213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = alpha;
11737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
117413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
117513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
117613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
117713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
117813fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) {
117941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g &&
118041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        color.b == mCurrentState.color.b)
118113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw        return false;
118213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
118313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.sequence++;
118413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.r = color.r;
118513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.g = color.g;
118613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.b = color.b;
118713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.modified = true;
118813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    setTransactionFlags(eTransactionNeeded);
118913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return true;
119013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
119113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
119213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
119313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
119441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
11957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
119613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
119713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
119813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
119913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
12002ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
12017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
120213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
120313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
120413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
120513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
120613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
120741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.flags == newFlags) return false;
120813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
120913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
12107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
12117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
121213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
121313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
121413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
121599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
121699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
121741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedCrop == crop) return false;
121813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
121999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
12207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
122199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
122299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
12237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
12257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
122613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
12298d5227b8416b099c884429312daf2d60496fa484Robert Carr
12308d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
123141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedFinalCrop == crop) return false;
1232acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
12338d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
12347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
12358d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
12368d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
12377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1239acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1240acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1241acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1242acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
124313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1244c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
124541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (scalingMode == mOverrideScalingMode) return false;
1246c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
124782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1248c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1249c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1250c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
12512f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
125241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.appId = appId;
125341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.type = type;
125441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.modified = true;
125541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    setTransactionFlags(eTransactionNeeded);
12562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
12572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
125941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.layerStack == layerStack) return false;
126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
12627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1265a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1266a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1267bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
126841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.dataSpace == dataSpace) return false;
1269bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1270bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1271bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1272bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1273bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1274bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1275bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1276532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1277532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1278532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1279532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
12801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1281e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
12821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
12831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
12841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
12851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
12861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
12871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
128841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
12890d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
12907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
12917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
12927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
12937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
12947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
12950d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1296792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
12977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
12980d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
12990d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
130041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) {
13010d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
13020d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
13037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1305ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
13111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
1312e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
13131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
13141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
13151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
13171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
131941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const {
132013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
132113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
132213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
132313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
132413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
132503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
132603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
132703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
132813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
132913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
133013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
133113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
133313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
133413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
133513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
133613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
133713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
134013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
134113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
134213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
134313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
1344eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    setTransformHint(orientation);
134513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
134613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
134713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
134813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
134913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
135013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1351a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const {
1352a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    LayerDebugInfo info;
1353a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    const Layer::State& ds = getDrawingState();
1354a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mName = getName();
13551acbec7884a47f316005ba4f2b5e47c74317ee43chaviw    sp<Layer> parent = getParent();
1356a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
1357a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mType = String8(getTypeId());
1358a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mTransparentRegion = ds.activeTransparentRegion;
1359a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mVisibleRegion = visibleRegion;
1360a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mSurfaceDamageRegion = surfaceDamageRegion;
1361a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mLayerStack = getLayerStack();
1362a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mX = ds.active.transform.tx();
1363a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mY = ds.active.transform.ty();
1364a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mZ = ds.z;
1365a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mWidth = ds.active.w;
1366a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mHeight = ds.active.h;
1367a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mCrop = ds.crop;
1368a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFinalCrop = ds.finalCrop;
136913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    info.mColor = ds.color;
1370a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFlags = ds.flags;
1371a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mPixelFormat = getPixelFormat();
1372a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mDataSpace = getDataSpace();
1373a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][0] = ds.active.transform[0][0];
1374a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][1] = ds.active.transform[0][1];
1375a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][0] = ds.active.transform[1][0];
1376a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][1] = ds.active.transform[1][1];
1377a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
1378a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        sp<const GraphicBuffer> activeBuffer = getActiveBuffer();
1379a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (activeBuffer != 0) {
1380a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = activeBuffer->getWidth();
1381a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = activeBuffer->getHeight();
1382a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = activeBuffer->getStride();
1383a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = activeBuffer->format;
1384a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        } else {
1385a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = 0;
1386a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = 0;
1387a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = 0;
1388a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = 0;
1389a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
1390bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
1391a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mNumQueuedFrames = getQueuedFrameCount();
1392a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mRefreshPending = isBufferLatched();
1393a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mIsOpaque = isOpaque(ds);
1394a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mContentDirty = contentDirty;
1395a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    return info;
1396d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
139783ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu
1398e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
1399e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1400e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1401e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
1402e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
1403e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
1404e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
1405e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
1406e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1407e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1408e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1409e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1410e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
1411e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1412e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
1413e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1414e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1415e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
1416e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
1417e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
1418e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
1419e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
1420e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
1421e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
1422e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
1423e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
1424e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1425e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1426e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
1427e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1428e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
1429e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
14308c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck    result.appendFormat("  %10d | ", layerState.z);
143141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
1432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
143341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
14345a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
143541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
1436e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1437e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
1438e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
1439e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1440e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1441d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
1442d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
144382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
144482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
1445d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
1446d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
144725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
144825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
14496547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
14506547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14516547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
14526547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1453d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
1454d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
1455d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
1456d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
1457d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
145841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this);
1459d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1460d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
1461d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
1462d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
1463d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
14645ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
14655ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
14665ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
14675ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
14685ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
14693890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
147041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                     FrameEventHistoryDelta* outDelta) {
1471d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1472d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
1473fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // If there are any unsignaled fences in the aquire timeline at this
1474fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // point, the previously queued frame hasn't been latched yet. Go ahead
1475fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // and try to get the signal time here so the syscall is taken out of
1476fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // the main thread's critical path.
1477fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mAcquireTimeline.updateSignalTimes();
1478fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // Push the new fence after updating since it's likely still pending.
14793d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
1480d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
1481d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
148240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
14833890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
14843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
1485d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
148640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
1487e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
148898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
148998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
149098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
149198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
149298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
149398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
149498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
149598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
14961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
14971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
14981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
14991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
15021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
15031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
15041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15061db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
15071db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
15081db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
15091db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
15101db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15111db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15121db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
15131db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
15141db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
15151db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
15161db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15171db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15181db73f66624e7d151710483dd58e03eed672f064Robert Carr
15191db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1520e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
15211db73f66624e7d151710483dd58e03eed672f064Robert Carr
15221db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
15231db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
15241db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
15251db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
15261db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15271db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
15281db73f66624e7d151710483dd58e03eed672f064Robert Carr
15291db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
15301db73f66624e7d151710483dd58e03eed672f064Robert Carr}
15311db73f66624e7d151710483dd58e03eed672f064Robert Carr
1532f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) {
1533f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (newParentHandle == nullptr) {
15340617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15350617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15360617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15370617894190ea0c3ee50889bee1d4df0f369b0761chaviw    auto handle = static_cast<Handle*>(newParentHandle.get());
15380617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Layer> newParent = handle->owner.promote();
15390617894190ea0c3ee50889bee1d4df0f369b0761chaviw    if (newParent == nullptr) {
15400617894190ea0c3ee50889bee1d4df0f369b0761chaviw        ALOGE("Unable to promote Layer handle");
15410617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15420617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15430617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1544f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Layer> parent = getParent();
1545f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (parent != nullptr) {
1546f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        parent->removeChild(this);
15470617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
1548f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    newParent->addChild(this);
15490617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1550f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Client> client(mClientRef.promote());
15510617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Client> newParentClient(newParent->mClientRef.promote());
15520617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1553f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (client != newParentClient) {
1554f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        client->setParentLayer(newParent);
15550617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15560617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15570617894190ea0c3ee50889bee1d4df0f369b0761chaviw    return true;
15580617894190ea0c3ee50889bee1d4df0f369b0761chaviw}
15590617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15609524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
1561412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) {
15629524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
15639524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
15649524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
15659524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
1566161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        sp<Client> parentClient = mClientRef.promote();
15679524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
1568161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        if (client != nullptr && parentClient != client) {
15699524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
15709524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
15719524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
15729524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
15739524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
15749524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
15759524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
15761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
1577e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
15781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
15811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
15821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
15831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
15841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
15861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
15871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
15881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
15891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
15901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
15931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
15941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
159641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(
159741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        LayerVector::StateSet stateSet) {
1598412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1599412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
1600412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1601412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1602412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
1603412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
1604412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    if (state.zOrderRelatives.size() == 0) {
1605412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        return children;
1606db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1607db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
1608db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1609412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1610db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
1611db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1612db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
1613db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1614db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1615db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1616412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
1617db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
1618db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1619db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1620db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
1621db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1622db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1624db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
16251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1626412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
1627412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
1628db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
1630db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1631db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1632db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
16331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
1634db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1635412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
16361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1637412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
1638db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1639db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1640412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
16411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1645db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
16461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1647412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
1648412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
1649412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
1650db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
1652bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson    for (i = int32_t(list.size()) - 1; i >= 0; i--) {
1653db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1654db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
16551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
16561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
1657412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
16581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1659412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
166041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (; i >= 0; i--) {
1661db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1662412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
16631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1666a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/**
1667a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers.
1668a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */
1669a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet,
1670a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                                     const LayerVector::Visitor& visitor) {
1671a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1672a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1673a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
1674a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    size_t i = 0;
1675a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1676a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1677a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        if (relative->getZ() >= 0) {
1678a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            break;
1679a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
1680a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1681a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1682a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    visitor(this);
1683a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1684a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1685a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1686a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1687a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw}
1688a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
16891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
16901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
1691e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
16921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
16931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
16949b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
16959b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
16969b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
16979b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
16989b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
16999b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
17000a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu        if (p->isFixedSize() && p->mActiveBuffer != nullptr) {
17011725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
17021725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
17031725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
17041725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getWidth();
17051725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getHeight();
17061725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
17071725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getWidth();
17081725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getHeight();
17091725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
171041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth);
171141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight);
17129b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
17139b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
17149b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
17159b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
17161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
17181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
172013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const {
1721e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
17226452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
172313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf;
172413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return parentAlpha * getDrawingState().color.a;
17256452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
17266452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
172713fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const {
172813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    const half4 color(getDrawingState().color);
172913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return half4(color.r, color.g, color.b, getAlpha());
17306452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
17316452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
17321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
17331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
17341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
17351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
17361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
1738e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
17391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
17411d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) {
17421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
17431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
17441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const State& state = useDrawing ? mDrawingState : mCurrentState;
17451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform requestedTransform = state.active.transform;
17471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform transform = getTransform();
17481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_id(sequence);
17501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_name(getName().c_str());
17511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_type(String8(getTypeId()));
17521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const auto& child : children) {
17541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->add_children(child->sequence);
17551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
17561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
17581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        sp<Layer> strongRelative = weakRelative.promote();
17591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        if (strongRelative != nullptr) {
17601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw            layerInfo->add_relatives(strongRelative->sequence);
17611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        }
17621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
17631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.activeTransparentRegion,
17651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw                                   layerInfo->mutable_transparent_region());
17661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region());
17671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region());
17681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_layer_stack(getLayerStack());
17701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_z(state.z);
17711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* position = layerInfo->mutable_position();
17731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_x(transform.tx());
17741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_y(transform.ty());
17751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* requestedPosition = layerInfo->mutable_requested_position();
17771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_x(requestedTransform.tx());
17781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_y(requestedTransform.ty());
17791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    SizeProto* size = layerInfo->mutable_size();
17811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_w(state.active.w);
17821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_h(state.active.h);
17831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop());
17851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop());
17861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_is_opaque(isOpaque(state));
17881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_invalidate(contentDirty);
17891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_dataspace(dataspaceDetails(getDataSpace()));
17901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat()));
17911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color());
17921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color());
17931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_flags(state.flags);
17941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());
17961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform());
17971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto parent = getParent();
17991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (parent != nullptr) {
18001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_parent(parent->sequence);
18011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto zOrderRelativeOf = state.zOrderRelativeOf.promote();
18041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (zOrderRelativeOf != nullptr) {
18051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence);
18061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto activeBuffer = getActiveBuffer();
18091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (activeBuffer != nullptr) {
18101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        LayerProtoHelper::writeToProto(activeBuffer, layerInfo->mutable_active_buffer());
18111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_queued_frames(getQueuedFrameCount());
18141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_refresh_pending(isBufferLatched());
18151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}
18161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
181813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
18193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
18223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
18233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
18263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
18273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1828