Layer.cpp revision 386c22e70d63ecc8bf6ae3e7c2f623f42fcd8718
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h>
4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
5241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h"
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h"
60c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
6141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
659eeae69005ef9a774bde19195b9c06eba7e463c2David SodmanLayerBE::LayerBE()
669eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman      : mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) {
679eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman}
689eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
699eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
7241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
7341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             uint32_t h, uint32_t flags)
740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman      : contentDirty(false),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
7713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
780c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mName(name),
7913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
83399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
84a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
85a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
86c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
87a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
88cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
8982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
94a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
95a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
9865476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
9982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mFreezeGeometryUpdates(false) {
1019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
102a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
10541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden;
10641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque;
10741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure;
1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1094d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
110f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    mTransactionName = String8("TX - ") + mName;
1114d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1140c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    mCurrentState.flags = layerFlags;
1153dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
116b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
117b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedFinalCrop = mCurrentState.finalCrop;
1197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedCrop = mCurrentState.crop;
1204d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
12113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = 1.0f;
1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
125bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1262f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1272f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1316547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1356547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1360a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1370a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1390a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
1409eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman
141e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
142e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
14341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {}
14496f0819f81293076e652792794a961543e6750d7Mathias Agopian
1454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14796f0819f81293076e652792794a961543e6750d7Mathias Agopian}
14896f0819f81293076e652792794a961543e6750d7Mathias Agopian
14913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
15013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
15113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
15213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
153eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/*
154eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through
155eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer.  So, the implementation is done in BufferLayer.  When called on a
156eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP.
157eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */
158eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {}
15913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
160c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() {
161c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mCurrentState to mLayersPendingRemoval
162c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
1638b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw    mPendingRemoval = true;
1648b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw
1655edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1665edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1675edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
1685edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
169c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu            mFlinger->setTransactionFlags(eTraversalNeeded);
1705edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
1715edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1725edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
1735edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
174c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    for (const auto& child : mCurrentChildren) {
175c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        child->onRemovedFromCurrentState();
176c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu}
1783851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
179c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() {
180c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mLayersPendingRemoval
181eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    abandon();
182c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
183b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    destroyAllHwcLayers();
1843851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
1851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
1861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
1871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18848d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
189cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
19013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
19113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
19213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
19313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1941eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
19513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
19613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
19713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
19813fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const {
19913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return mPremultipliedAlpha;
20013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
20113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
2024d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
2034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
2044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
205582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
206582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
20713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
20913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
211b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
2129eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0,
2139eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                        "Already have a layer for hwcId %d", hwcId);
214b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWC2::Layer* layer = hwc->createLayer(hwcId);
215b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (!layer) {
216b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return false;
217b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
218b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWCInfo& hwcInfo = mHwcLayers[hwcId];
219b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc = hwc;
220b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.layer = layer;
221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    layer->setLayerDestroyedListener(
22241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            [this, hwcId](HWC2::Layer* /*layer*/) { mHwcLayers.erase(hwcId); });
223b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    return true;
224b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
225b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
22683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wubool Layer::destroyHwcLayer(int32_t hwcId) {
227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (mHwcLayers.count(hwcId) == 0) {
22883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu        return false;
229b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
230b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    auto& hwcInfo = mHwcLayers[hwcId];
23141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer");
232b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // The layer destroyed listener should have cleared the entry from
235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // mHwcLayers. Verify that.
23641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers");
23783806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu
23883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    return true;
239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
240b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
241b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() {
242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    size_t numLayers = mHwcLayers.size();
243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    for (size_t i = 0; i < numLayers; ++i) {
244b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed");
245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        destroyHwcLayer(mHwcLayers.begin()->first);
246b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
247b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(),
24841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                        "All hardware composer layers should have been destroyed");
249b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
250b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
251a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
252a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
253a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
254f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
255f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
256a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
257f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
258a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
259a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
260a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
261f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
262a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
2634fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
264f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
265f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
266f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
267f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
268f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
269f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
270f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
271f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
272f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
273f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
274f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
275f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
276f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
277f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
2781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
2791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
2801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
2811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
2831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
2841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
2881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
28941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
29041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
29141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
29241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
293e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
2941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
2951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
3091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
3101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
3111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
31613127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
3171eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
3186c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
3196c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
3206c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
3216c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
3226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
324b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
325b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
326b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
330e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
332de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
333de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
334de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
3351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
3401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
3411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
3421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3446c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
3456c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
349b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
35013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
3511eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
35213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
35313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
3556b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
3566b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
3576b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
3586b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
3590e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3600e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
361b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
362df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
3630e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
3640e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
367acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
368acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
370b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
37141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(s.finalCrop, &activeCrop)) {
372acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
373acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
374acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
375b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
376b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    const auto& p = mDrawingParent.promote();
377b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    if (p != nullptr) {
378b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        auto parentCrop = p->computeInitialCrop(hw);
379b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        activeCrop.intersect(parentCrop, &activeCrop);
380b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    }
381b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3855a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
3885a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
39813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
39928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
40028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
40128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
40228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
40328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
40428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
405acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
406acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
407acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
40813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
409f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
410f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
411f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
412acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
413acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
414acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
415acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
416cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
417acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
418021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
419021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
420acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
42141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform();
422acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
42441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
42513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
42741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation();
428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
438acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
439acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
44141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
443acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
445acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
44641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h);
44713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
44941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float xScale = crop.getWidth() / float(winWidth);
450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
45113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
45241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetL = winCrop.left * xScale;
45341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetT = winCrop.top * yScale;
45441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetR = (winWidth - winCrop.right) * xScale;
455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
45741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.left += insetL;
45841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.top += insetT;
45941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.right -= insetR;
460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
46113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
46213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
46313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
46413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
465ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
466a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
4679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
4689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
469a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
4703e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
4719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
4729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
4749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
4759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
4769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
4779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
478dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
47913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
4801eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
481ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
4826452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
48341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        blendMode =
48441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
4859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
486ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
48741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
48841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set blend mode %s:"
48941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             " %s (%d)",
49041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
49141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
49213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
49313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
49413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
4956c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
4961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
497b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
498b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
4991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
50041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
501acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
502acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
50428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
50528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
50628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
50728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
50828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
50928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
51041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
511acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
512acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5136c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
5146c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
51541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h));
51641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom));
51741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(
51841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom));
5196c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
5201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
522b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
52341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!frame.intersect(s.finalCrop, &frame)) {
524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
5319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
532ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
533e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
53441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
53541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.left, transformedFrame.top, transformedFrame.right,
53641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
537e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
538e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
539e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5415a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
5429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
543e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
544e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
54541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              "%s (%d)",
54641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
54741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
548e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
549e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
550e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
55213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    float alpha = static_cast<float>(getAlpha());
5536452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
55441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
55541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set plane alpha %.3f: "
55641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "%s (%d)",
55741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
5589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
559ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
56041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
56141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             to_string(error).c_str(), static_cast<int32_t>(error));
5622f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
5632a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
5642a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
565e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
5662a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
5672a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
5682a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
5692a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
5702a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
5712a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
5722a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
57341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
57441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
5759f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
57629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
57729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
57829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
57929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
58029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
58129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
58229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
58329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
58429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
5851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
586c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
587cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
588c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
589021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
590021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
591c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
59241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
593c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
594c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
59541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
596c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
597cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
598cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
599cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
600cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
601cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
602cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
603cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
604cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
605c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
60629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
60729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
60813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
6099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
6109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
6119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
6139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
6149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
61541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE_IF(error != HWC2::Error::None,
61641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "[%s] Failed to set transform %s: "
61741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "%s (%d)",
61841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
61941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 static_cast<int32_t>(error));
6209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
621a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
622a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
6239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
6249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
6259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
6269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
6309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
631eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
632c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) {
633c9232edd34618360d099272fb0537cae2f715860chaviw    if (mHwcLayers.count(hwcId) == 0) {
634c9232edd34618360d099272fb0537cae2f715860chaviw        ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId);
635c9232edd34618360d099272fb0537cae2f715860chaviw        return false;
636c9232edd34618360d099272fb0537cae2f715860chaviw    }
637c9232edd34618360d099272fb0537cae2f715860chaviw
638c9232edd34618360d099272fb0537cae2f715860chaviw    return mHwcLayers[hwcId].forceClientComposition;
639c9232edd34618360d099272fb0537cae2f715860chaviw}
640c9232edd34618360d099272fb0537cae2f715860chaviw
6419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
6429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
6439eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    if (mHwcLayers.count(hwcId) == 0 ||
6449eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman        getCompositionType(hwcId) != HWC2::Composition::Cursor) {
6459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
650dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
6529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
6539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
654b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
655b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
6569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
6591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
661b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
662b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
663acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
6659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6679eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
6689eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                                                                              position.top);
66941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
67041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set cursor position "
67141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "to (%d, %d): %s (%d)",
67241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), position.left, position.top, to_string(error).c_str(),
67341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
6749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
67503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
67613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
67713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
67813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
67913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
680a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const {
681a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, clip, false);
68213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
68313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
684a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const {
685a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform);
68613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
68713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
688a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const {
689a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), false);
690c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
691c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
69241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue,
69341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            float alpha) const {
69419733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
6959eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    computeGeometry(renderArea, getBE().mMesh, false);
69619733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
6979eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman    engine.drawMesh(getBE().mMesh);
69813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
69913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
700a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const {
70141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    clearWithOpenGL(renderArea, 0, 0, 0, 0);
70213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
70313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
70441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
7059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
7109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
71141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(),
71241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman          static_cast<int>(callIntoHwc));
7139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
7149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
7159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
71841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE_IF(error != HWC2::Error::None,
71941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "[%s] Failed to set "
72041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "composition type %s: %s (%d)",
72141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     mName.string(), to_string(type).c_str(), to_string(error).c_str(),
72241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     static_cast<int32_t>(error));
7239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
7249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
728ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
729ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
730ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
731ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
732ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
734ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
756cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
757cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
758cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
759cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
760cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
7617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
762cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
763cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
764cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
765cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
7667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
7677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
76813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
76913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
77013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
77113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
77213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
77313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
77413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
77513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
77613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
77713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
77813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
77913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
780acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
781acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
782acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
783acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
784acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
785acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
786acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
787acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
788acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
789acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
790acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
791acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
792acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
793acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
794acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
795a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh,
796a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                            bool useIdentityTransform) const {
7971eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
798a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const Transform renderAreaTransform(renderArea.getTransform());
799a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const uint32_t height = renderArea.getHeight();
8001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
8013f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
802acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
803acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
805acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
806acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
8071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
808acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
8091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
8101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
8111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
8121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
813acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
814acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
815b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
816b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
817b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
818b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
819b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
820acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
821acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
822ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
823a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[0] = renderAreaTransform.transform(lt);
824a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[1] = renderAreaTransform.transform(lb);
825a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[2] = renderAreaTransform.transform(rb);
826a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[3] = renderAreaTransform.transform(rt);
82741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (size_t i = 0; i < 4; i++) {
828a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        position[i].y = height - position[i].y;
82913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
83013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
831ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
83241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const {
833231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
834231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
835231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
836231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
83713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
83813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
83913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
84013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
84113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
84213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
84313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
84413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
84513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
84613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
84741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
84813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
84913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
85013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
85113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
85213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
85313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
85413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
85513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
8567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
8577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
8587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
8597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
8627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
8630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
8640d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
8650d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
8660d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
8677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
8687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
8697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
8700d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
8713bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
87241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber);
8730d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
874cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
875cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
876cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
877cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
8780d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
879cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
8807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
8817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
8837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
884f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
8857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
8867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
887f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
8887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
8897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
89005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
89105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
89205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
89341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    stateToCommit->flags =
89441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask);
8957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
8967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
897f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
8987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
8997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
90005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
9017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
9027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
9030d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
9047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
9057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
9067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
9077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
9087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
90905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
9127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
91441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) {
91541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                ALOGE("[%s] Unexpected sync point frame number found", mName.string());
916cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
917cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
918cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
919cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
920cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
921cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
922cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
9237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
9247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
92505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
9277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
9307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
931792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
932792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
9337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
9347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
93505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
9367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
9377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
9417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
9427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
9437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
9447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
9457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
9487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
9497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
95113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
9521c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
9531c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
9547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
95505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
95605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
9577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
9587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
9597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
9601eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h);
963a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
964eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    if (sizeChanged) {
965cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
9669d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
96741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
96841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
96941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n"
97041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
97141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n",
9729eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 this, getName().string(), mCurrentTransform,
9739eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top,
9749eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w,
9759eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right,
9769eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w,
9779eeae69005ef9a774bde19195b9c06eba7e463c2David Sodman                 s.requested.h);
978a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
9792a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
9802a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
981eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman        setDefaultBufferSize(c.requested.w, c.requested.h);
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
983cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
984e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // Don't let Layer::doTransaction update the drawing state
985e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // if we have a pending resize, unless we are in fixed-size mode.
986e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // the drawing state will be updated only once we receive a buffer
987e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // with the correct size.
988e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
989e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In particular, we want to make sure the clip (which is part
990e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // of the geometry state) is latched together with the size but is
991e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // latched immediately when no resizing is involved.
992e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
993e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // If a sideband stream is attached, however, we want to skip this
994e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // optimization so that transactions aren't missed when a buffer
995e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // never arrives
996e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
997e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In the case that we don't have a buffer we ignore other factors
998e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // and avoid entering the resizePending state. At a high level the
999e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // resizePending state is to avoid applying the state of the new buffer
1000e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // to the old buffer. However in the state where we don't have an old buffer
1001e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // there is no such concern but we may still be being used as a parent layer.
100241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) &&
100341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (mActiveBuffer != nullptr);
10040cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
1005386c22e70d63ecc8bf6ae3e7c2f623f42fcd8718David Sodman        if (resizePending && getBE().mSidebandStream == NULL) {
10060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
10070cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
10080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
10090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
10107bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
10117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
10127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
10137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
10147d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
10157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
10167bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
10177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
10187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
10197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
10207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
10227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
10237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
10247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
10257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
10267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
10277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
10287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
102982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
103082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
103182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
103282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
103382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
103482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
103582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
103682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
103782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
103813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
103913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10401eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
104113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
104213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
104313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
104413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10451eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
104613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
104713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
104813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
104913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
105013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
10513dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
105241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE));
105313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
105413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1055c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1056c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1057c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1058c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
10591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1060c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1061c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
106213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
106305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
106805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1069a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1070a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
107313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
107513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
107613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
107813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
107982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
10803dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
108113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
108213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
108369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
108469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
108569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
108669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
10873dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
10887bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
10897bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
10907bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
10917bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
10927bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
109382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
109482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
10957bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
109669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
10977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
109813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
109913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
110013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
110182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
11021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
11031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
11041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
11051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
11061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
11071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
11081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
11091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
11101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
11111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
11121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
11131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1114503c7046237f2797a5cf8584064223359d0e6d10Robert Carrbool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
1115503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
1116503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
1117503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    if (idx < 0) {
1118503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        return false;
1119503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    }
1120503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) {
1121503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        mCurrentChildren.removeAt(idx);
1122503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        mCurrentChildren.add(childLayer);
1123503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    }
1124503c7046237f2797a5cf8584064223359d0e6d10Robert Carr    return true;
1125503c7046237f2797a5cf8584064223359d0e6d10Robert Carr}
1126503c7046237f2797a5cf8584064223359d0e6d10Robert Carr
1127ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
112841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.z == z) return false;
112913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
113013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
11317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1132db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1133db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1134db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1135db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1136db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1137db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1138db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1139db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1140db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
114113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
114213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
114313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
11441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1145db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1146db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1147db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1148db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1149db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1150db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1151db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1152db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1153db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1154db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1155db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1156db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1157db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1158db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1159db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1160db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1161db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1162db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1163db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1164db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1165db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1166db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1167db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1168db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1169db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1170db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1171db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1172db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
11739ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
11749ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    if (oldZOrderRelativeOf != nullptr) {
11759ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw        oldZOrderRelativeOf->removeZOrderRelative(this);
11769ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    }
1177db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1178db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1179db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1180db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1181db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1182db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1183db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1184db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
118513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
118641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false;
118713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
118813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
11897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
119013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
119113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
119213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
11939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
119441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.color.a == alpha) return false;
119513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
119613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = alpha;
11977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
119813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
119913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
120013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
120113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
120213fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) {
120341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g &&
120441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        color.b == mCurrentState.color.b)
120513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw        return false;
120613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
120713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.sequence++;
120813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.r = color.r;
120913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.g = color.g;
121013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.b = color.b;
121113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.modified = true;
121213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    setTransactionFlags(eTransactionNeeded);
121313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return true;
121413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
121513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
121613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
121713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
121841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
12197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
122013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
122113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
122213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
122313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
12242ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
12257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
122613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
122913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
123013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
123141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.flags == newFlags) return false;
123213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
123313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
12347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
12357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
123613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
123713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
123813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
123999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
124099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
124141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedCrop == crop) return false;
124213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
124399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
12447bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
124599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
124699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
12477bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12487bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
12497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
125013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
125113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
125213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
12538d5227b8416b099c884429312daf2d60496fa484Robert Carr
12548d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
125541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedFinalCrop == crop) return false;
1256acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
12578d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
12587bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
12598d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
12608d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
12617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
12627bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1263acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1264acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1265acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1266acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
126713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1268c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
126941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (scalingMode == mOverrideScalingMode) return false;
1270c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
127182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1272c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1273c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1274c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
12752f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
127641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.appId = appId;
127741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.type = type;
127841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.modified = true;
127941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    setTransactionFlags(eTransactionNeeded);
12802f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
12812f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
128213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
128341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.layerStack == layerStack) return false;
128413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
128513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
12867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
128813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1289a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1290a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1291bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
129241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.dataSpace == dataSpace) return false;
1293bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1294bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1295bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1296bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1297bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1298bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1299bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1300532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1301532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1302532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1303532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
13041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1305e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
13061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
13071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
13081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
13101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
131241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
13130d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
13147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
13157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
13167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
13177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
13187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
13190d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1320792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
13217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
13220d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
13230d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
132441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) {
13250d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
13260d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
13277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1329ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
13351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
1336e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
13371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
13381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
13391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
13411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
134341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const {
134413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
134513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
134613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
134713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
134813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
134903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
135003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
135103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
135213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
135313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
135413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
135513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
135613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
135713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
135813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
135913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
136013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
136113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
136313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
136413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
136513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
136613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
136713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
1368eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    setTransformHint(orientation);
136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
137013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
137113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
137213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
137313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1375a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const {
1376a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    LayerDebugInfo info;
1377a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    const Layer::State& ds = getDrawingState();
1378a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mName = getName();
13791acbec7884a47f316005ba4f2b5e47c74317ee43chaviw    sp<Layer> parent = getParent();
1380a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
1381a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mType = String8(getTypeId());
1382a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mTransparentRegion = ds.activeTransparentRegion;
1383a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mVisibleRegion = visibleRegion;
1384a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mSurfaceDamageRegion = surfaceDamageRegion;
1385a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mLayerStack = getLayerStack();
1386a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mX = ds.active.transform.tx();
1387a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mY = ds.active.transform.ty();
1388a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mZ = ds.z;
1389a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mWidth = ds.active.w;
1390a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mHeight = ds.active.h;
1391a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mCrop = ds.crop;
1392a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFinalCrop = ds.finalCrop;
139313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    info.mColor = ds.color;
1394a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFlags = ds.flags;
1395a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mPixelFormat = getPixelFormat();
1396a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mDataSpace = getDataSpace();
1397a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][0] = ds.active.transform[0][0];
1398a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][1] = ds.active.transform[0][1];
1399a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][0] = ds.active.transform[1][0];
1400a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][1] = ds.active.transform[1][1];
1401a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
1402a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        sp<const GraphicBuffer> activeBuffer = getActiveBuffer();
1403a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (activeBuffer != 0) {
1404a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = activeBuffer->getWidth();
1405a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = activeBuffer->getHeight();
1406a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = activeBuffer->getStride();
1407a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = activeBuffer->format;
1408a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        } else {
1409a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = 0;
1410a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = 0;
1411a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = 0;
1412a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = 0;
1413a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
1414bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
1415a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mNumQueuedFrames = getQueuedFrameCount();
1416a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mRefreshPending = isBufferLatched();
1417a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mIsOpaque = isOpaque(ds);
1418a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mContentDirty = contentDirty;
1419a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    return info;
1420d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
142183ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu
1422e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
1423e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1424e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1425e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
1426e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
1427e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
1428e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
1429e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
1430e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1431e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1433e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1434e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
1435e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1436e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
1437e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1438e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1439e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
1440e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
1441e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
1442e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
1443e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
1444e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
1445e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
1446e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
1447e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
1448e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1449e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1450e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
1451e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1452e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
1453e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
14548c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck    result.appendFormat("  %10d | ", layerState.z);
145541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
1456e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
145741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
14585a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
145941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
1460e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1461e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
1462e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
1463e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1464e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1465d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
1466d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
146782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
146882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
1469d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
1470d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
147125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
147225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
14736547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
14746547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
14756547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
14766547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1477d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
1478d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
1479d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
1480d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
1481d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
148241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this);
1483d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1484d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
1485d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
1486d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
1487d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
14885ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
14895ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
14905ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
14915ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
14925ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
14933890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
149441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                     FrameEventHistoryDelta* outDelta) {
1495d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1496d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
1497fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // If there are any unsignaled fences in the aquire timeline at this
1498fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // point, the previously queued frame hasn't been latched yet. Go ahead
1499fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // and try to get the signal time here so the syscall is taken out of
1500fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // the main thread's critical path.
1501fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mAcquireTimeline.updateSignalTimes();
1502fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // Push the new fence after updating since it's likely still pending.
15033d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
1504d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
1505d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
150640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
15073890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
15083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
1509d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
151040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
1511e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
151298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
151398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
151498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
151598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
151698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
151798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
151898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
151998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
15201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
15211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
15221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
15231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
15261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
15271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
15281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
15301db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
15311db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
15321db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
15331db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
15341db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15351db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15361db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
15371db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
15381db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
15391db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
15401db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
15411db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15421db73f66624e7d151710483dd58e03eed672f064Robert Carr
15431db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1544e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
15451db73f66624e7d151710483dd58e03eed672f064Robert Carr
15461db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
15471db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
15481db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
15491db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
15501db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
15511db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
15521db73f66624e7d151710483dd58e03eed672f064Robert Carr
15531db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
15541db73f66624e7d151710483dd58e03eed672f064Robert Carr}
15551db73f66624e7d151710483dd58e03eed672f064Robert Carr
1556f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) {
1557f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (newParentHandle == nullptr) {
15580617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15590617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15600617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15610617894190ea0c3ee50889bee1d4df0f369b0761chaviw    auto handle = static_cast<Handle*>(newParentHandle.get());
15620617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Layer> newParent = handle->owner.promote();
15630617894190ea0c3ee50889bee1d4df0f369b0761chaviw    if (newParent == nullptr) {
15640617894190ea0c3ee50889bee1d4df0f369b0761chaviw        ALOGE("Unable to promote Layer handle");
15650617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
15660617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15670617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1568f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Layer> parent = getParent();
1569f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (parent != nullptr) {
1570f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        parent->removeChild(this);
15710617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
1572f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    newParent->addChild(this);
15730617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1574f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Client> client(mClientRef.promote());
15750617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Client> newParentClient(newParent->mClientRef.promote());
15760617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1577f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (client != newParentClient) {
1578f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        client->setParentLayer(newParent);
15790617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
15800617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15810617894190ea0c3ee50889bee1d4df0f369b0761chaviw    return true;
15820617894190ea0c3ee50889bee1d4df0f369b0761chaviw}
15830617894190ea0c3ee50889bee1d4df0f369b0761chaviw
15849524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
15857f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1586161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        sp<Client> parentClient = mClientRef.promote();
15879524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
1588161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        if (client != nullptr && parentClient != client) {
15897f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr            client->detachLayer(child.get());
15907f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr            child->detachChildren();
15919524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
15927f619b2350d46eede639efa13d7ac3697551b2ccRobert Carr    }
15939524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
15949524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
15959524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
15969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
15971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
1598e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
15991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
16021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
16031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
16041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
16071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
16081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
16091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
16111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
16141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
16151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
161741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(
161841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        LayerVector::StateSet stateSet) {
1619412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1620412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
1621412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1622412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1623412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
1624412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
1625db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
1626412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1627db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
1628db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1629db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
1630db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1631db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1632db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1633412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
1634503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState;
1635503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        if (childState.zOrderRelativeOf != nullptr) {
1636503c7046237f2797a5cf8584064223359d0e6d10Robert Carr            continue;
1637503c7046237f2797a5cf8584064223359d0e6d10Robert Carr        }
1638db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
1639db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1640db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1641db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
1642db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1643db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1645db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
16461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1647412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
1648412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
1649db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
1651db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1652db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1653db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
16541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
1655db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1656412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
16571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1658412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
1659db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1660db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1661412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
16621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1666db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
16671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1668412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
1669412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
1670412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
1671db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
16721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
1673bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson    for (i = int32_t(list.size()) - 1; i >= 0; i--) {
1674db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1675db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
16761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
1678412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
16791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1680412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
168141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (; i >= 0; i--) {
1682db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1683412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
16841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1687a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/**
1688a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers.
1689a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */
1690a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet,
1691a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                                     const LayerVector::Visitor& visitor) {
1692a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1693a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1694a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
1695a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    size_t i = 0;
1696a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1697a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1698a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        if (relative->getZ() >= 0) {
1699a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            break;
1700a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
1701a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1702a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1703a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    visitor(this);
1704a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
1705a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
1706a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
1707a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
1708a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw}
1709a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
17101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
17111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
1712e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
17131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
17141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
17159b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
17169b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
17179b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
17189b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
17199b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
17209b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
17210a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu        if (p->isFixedSize() && p->mActiveBuffer != nullptr) {
17221725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
17231725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
17241725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
17251725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getWidth();
17261725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getHeight();
17271725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
17281725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getWidth();
17291725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getHeight();
17301725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
173141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth);
173241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight);
17339b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
17349b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
17359b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
17369b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
17371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
17391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
174113fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const {
1742e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
17436452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
174413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf;
174513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return parentAlpha * getDrawingState().color.a;
17466452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
17476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
174813fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const {
174913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    const half4 color(getDrawingState().color);
175013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return half4(color.r, color.g, color.b, getAlpha());
17516452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
17526452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
17531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
17541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
17551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
17561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
17571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
1759e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
17601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
17621d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) {
17631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
17641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
17651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const State& state = useDrawing ? mDrawingState : mCurrentState;
17661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform requestedTransform = state.active.transform;
17681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform transform = getTransform();
17691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_id(sequence);
17711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_name(getName().c_str());
17721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_type(String8(getTypeId()));
17731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const auto& child : children) {
17751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->add_children(child->sequence);
17761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
17771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
17791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        sp<Layer> strongRelative = weakRelative.promote();
17801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        if (strongRelative != nullptr) {
17811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw            layerInfo->add_relatives(strongRelative->sequence);
17821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        }
17831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
17841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.activeTransparentRegion,
17861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw                                   layerInfo->mutable_transparent_region());
17871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region());
17881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region());
17891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_layer_stack(getLayerStack());
17911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_z(state.z);
17921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* position = layerInfo->mutable_position();
17941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_x(transform.tx());
17951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_y(transform.ty());
17961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
17971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* requestedPosition = layerInfo->mutable_requested_position();
17981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_x(requestedTransform.tx());
17991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_y(requestedTransform.ty());
18001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    SizeProto* size = layerInfo->mutable_size();
18021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_w(state.active.w);
18031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_h(state.active.h);
18041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop());
18061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop());
18071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_is_opaque(isOpaque(state));
18091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_invalidate(contentDirty);
18101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_dataspace(dataspaceDetails(getDataSpace()));
18111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat()));
18121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color());
18131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color());
18141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_flags(state.flags);
18151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());
18171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform());
18181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18198e0af3679ec73e07775142825d592448b255f61cJorim Jaggi    auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote();
18201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (parent != nullptr) {
18211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_parent(parent->sequence);
18221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto zOrderRelativeOf = state.zOrderRelativeOf.promote();
18251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (zOrderRelativeOf != nullptr) {
18261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence);
18271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto activeBuffer = getActiveBuffer();
18301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (activeBuffer != nullptr) {
18311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        LayerProtoHelper::writeToProto(activeBuffer, layerInfo->mutable_active_buffer());
18321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
18331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
18341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_queued_frames(getQueuedFrameCount());
18351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_refresh_pending(isBufferLatched());
18361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}
18371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
183813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
183913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
18403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
18433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
18443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
18473f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
18483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
1849