Layer.cpp revision 8b3871addb9bbd5776f4ed59e67af2baa9c583fd
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h>
4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
5241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h"
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h"
60c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
6141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
6741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
6841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             uint32_t h, uint32_t flags)
690c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman      : contentDirty(false),
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
720c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mSurfaceFlingerConsumer(NULL),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mName(name),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
78a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
79399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
80a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
82c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
83a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
84cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
8582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
8613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
8713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
885cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
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
1329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
13741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    nsecs_t displayPeriod = flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1396547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1410a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1420a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1430a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
144e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
145e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
14641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {}
14796f0819f81293076e652792794a961543e6750d7Mathias Agopian
1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1496547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
15096f0819f81293076e652792794a961543e6750d7Mathias Agopian}
15196f0819f81293076e652792794a961543e6750d7Mathias Agopian
15213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
15313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
15413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
15513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
1599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
1609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
1610c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    if (mSurfaceFlingerConsumer) {
1620c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
1630c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    }
1649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
1659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
16741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                             HWComposer::HWCLayerInterface* layer) {
1689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
1699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
1709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
1719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
1729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
1739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
17413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
175c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() {
176c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mCurrentState to mLayersPendingRemoval
177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
1788b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw    mPendingRemoval = true;
1798b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw
1805edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1815edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1825edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
1835edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
184c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu            mFlinger->setTransactionFlags(eTraversalNeeded);
1855edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
1865edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1875edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
1885edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
189c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    for (const auto& child : mCurrentChildren) {
190c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        child->onRemovedFromCurrentState();
191c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
192c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu}
1933851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
194c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() {
195c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mLayersPendingRemoval
196c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
1970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    if (mSurfaceFlingerConsumer) {
1980c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mSurfaceFlingerConsumer->abandon();
1990c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    }
2003851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#ifdef USE_HWC2
201b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    destroyAllHwcLayers();
2023851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#endif
2033851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
2041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
2051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
2061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
20748d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
208cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
20913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
21113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2131eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
21413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
21513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
21613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
21713fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const {
21813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return mPremultipliedAlpha;
21913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
22013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
2214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
2224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
2234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
224582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
225582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
22613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
22713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
22813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
22913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
230b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#ifdef USE_HWC2
231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
23241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Already have a layer for hwcId %d", hwcId);
233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWC2::Layer* layer = hwc->createLayer(hwcId);
234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (!layer) {
235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return false;
236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    HWCInfo& hwcInfo = mHwcLayers[hwcId];
238b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc = hwc;
239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.layer = layer;
240b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    layer->setLayerDestroyedListener(
24141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            [this, hwcId](HWC2::Layer* /*layer*/) { mHwcLayers.erase(hwcId); });
242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    return true;
243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
244b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyHwcLayer(int32_t hwcId) {
246b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    if (mHwcLayers.count(hwcId) == 0) {
247b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        return;
248b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
249b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    auto& hwcInfo = mHwcLayers[hwcId];
25041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer");
251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
252b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
253b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // The layer destroyed listener should have cleared the entry from
254b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    // mHwcLayers. Verify that.
25541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers");
256b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
257b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
258b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() {
259b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    size_t numLayers = mHwcLayers.size();
260b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    for (size_t i = 0; i < numLayers; ++i) {
261b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed");
262b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas        destroyHwcLayer(mHwcLayers.begin()->first);
263b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    }
264b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas    LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(),
26541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                        "All hardware composer layers should have been destroyed");
266b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas}
267b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#endif
268b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas
269a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
270a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
271a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
272f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
273f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
274a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
275f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
276a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
277a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
278a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
279f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
280a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
2814fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
282f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
283f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
284f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
285f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
286f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
287f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
288f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
289f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
290f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
291f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
292f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
293f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
294f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
295f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
30741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
30841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
30941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
31041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
311e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
3181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
3191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
33413127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
3351eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
3366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
3376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
3386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
3396c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
3406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
342b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
343b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
344b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
3461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
348e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
3491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
350de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
351de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
352de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
3531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
3581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
3591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
3601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3626c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
3636c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
36413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
36513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
367b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
36813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
3691eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
37013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
37113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
37213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
3736b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
3746b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
3756b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
3766b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
3770e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3780e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
379b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
380df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
3810e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
3820e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
385acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
386acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
387acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
388b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
38941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(s.finalCrop, &activeCrop)) {
390acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
391acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
392acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
393b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
394b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    const auto& p = mDrawingParent.promote();
395b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    if (p != nullptr) {
396b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        auto parentCrop = p->computeInitialCrop(hw);
397b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw        activeCrop.intersect(parentCrop, &activeCrop);
398b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw    }
399b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4035a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4065a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
41613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
41728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
41828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
41928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
42028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
42128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
42228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
42613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
427f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
428f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
429f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
434cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
436021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
437021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
438acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
43941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform();
440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
441acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
44241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
44313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
44541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation();
446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
451acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
45941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
461acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
46441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h);
46513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
46741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float xScale = crop.getWidth() / float(winWidth);
468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
46913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
47041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetL = winCrop.left * xScale;
47141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetT = winCrop.top * yScale;
47241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    float insetR = (winWidth - winCrop.right) * xScale;
473acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
474acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
47541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.left += insetL;
47641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.top += insetT;
47741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    crop.right -= insetR;
478acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
47913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
48013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
48113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
48213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
484ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
4859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
48641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setGeometry(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer)
4879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
488a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
4899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
4909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
4919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
4929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
4939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
4949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
495a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
4963e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
4979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
4989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
4999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
5019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
5029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
5059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
5079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
5089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
5099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
5109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
5119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
512dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
51313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
5141eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
5159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
516ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
5176452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
51841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        blendMode =
51941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
5209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
521ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
52241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
52341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set blend mode %s:"
52441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             " %s (%d)",
52541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
52641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
5279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
52813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    if (!isOpaque(s) || getAlpha() != 1.0f) {
52941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        layer.setBlending(mPremultipliedAlpha ? HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE);
5309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
5319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
53213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
53313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
53413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
5356c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
5361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
537b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
538b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
5391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
5409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
54141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
5429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
54341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
5449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
54828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
54928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
55028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
55128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
55228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
55328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
55441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
5576c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
5586c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
55941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h));
56041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom));
56141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        activeTransparentRegion.orSelf(
56241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom));
5636c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
5641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
566b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
56741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        if (!frame.intersect(s.finalCrop, &frame)) {
568acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
569acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
570acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
572acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
573acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
574acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
5769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
577ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
578e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
57941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
58041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.left, transformedFrame.top, transformedFrame.right,
58141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
582e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
583e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
584e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5865a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
5879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
588e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
589e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
59041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              "%s (%d)",
59141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
59241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
593e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
594e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
595e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
5969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
59713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    float alpha = static_cast<float>(getAlpha());
5986452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
59941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
60041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set plane alpha %.3f: "
60141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "%s (%d)",
60241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
6039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
604ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
60541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
60641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             to_string(error).c_str(), static_cast<int32_t>(error));
6072f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
6082a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
6092a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
610e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
6112a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
6122a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
6132a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
6142a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
6152a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
6162a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
6172a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
61841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
61941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
6209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
6229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
6239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
6259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
6269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
62741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    layer.setPlaneAlpha(static_cast<uint8_t>(std::round(255.0f * getAlpha())));
6289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
6299f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
63029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
63129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
63229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
63329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
63429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
63529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
63629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
63729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
63829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
6391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
640c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
641cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
642c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
643021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
644021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
645c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
64641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
647c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
648c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
64941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
650c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
651cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
652cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
653cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
654cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
655cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
656cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
657cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
658cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
659c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
66029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
66129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
66213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
6639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
6659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
67041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE_IF(error != HWC2::Error::None,
67141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "[%s] Failed to set transform %s: "
67241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "%s (%d)",
67341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
67441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 static_cast<int32_t>(error));
6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
6789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
6799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
6809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
6819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
6829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
684a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
685a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
6869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
6919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
6989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
7009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
7019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
7029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
703aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcInfo = mHwcLayers[hwcId];
704aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcLayer = hwcInfo.layer;
7059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
70841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
7109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
7139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
71541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7190f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
7209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
7210f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
7220f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
7230f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
7249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
72541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", mName.string(),
72641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                  mSidebandStream->handle(), to_string(error).c_str(), static_cast<int32_t>(error));
7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
7280f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7310a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
732aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    if (hwcInfo.forceClientComposition ||
73341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
7340f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
7360f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
7370f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
7380f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
7390a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
7400a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
7410a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
742c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
74313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw        half4 color = getColor();
74441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        error = hwcLayer->setColor({static_cast<uint8_t>(std::round(255.0f * color.r)),
74541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                    static_cast<uint8_t>(std::round(255.0f * color.g)),
74641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                    static_cast<uint8_t>(std::round(255.0f * color.b)), 255});
7470a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
74841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), to_string(error).c_str(),
74941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                  static_cast<int32_t>(error));
7500a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
751c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
752c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
753c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
754c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
755c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
756c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
75741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                  to_string(error).c_str(), static_cast<int32_t>(error));
758c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
759c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
7600a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
7610a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
7620a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
7630f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
7640f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
7650f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
7660f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7710f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
772bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
773bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
774bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
77541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), mCurrentState.dataSpace,
77641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
777bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
778bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
77906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
7801f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    sp<GraphicBuffer> hwcBuffer;
78141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, &hwcSlot, &hwcBuffer);
78206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
7830f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
7841f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence);
7850f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
78641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), mActiveBuffer->handle,
78741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman              to_string(error).c_str(), static_cast<int32_t>(error));
7880f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7909551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter
7919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
79341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            HWComposer::HWCLayerInterface& layer) {
7949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
7959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
7969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
7979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
7989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
7999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
8009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
8019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
8029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
8039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
804ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
8059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
8069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
8079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
8099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
8109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
8119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
8149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
8159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
8169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
8179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
81841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mHwcLayers.count(hwcId) == 0 || getCompositionType(hwcId) != HWC2::Composition::Cursor) {
8199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
8209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
8239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
824dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
8259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
8269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
8279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
828b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
829b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
8309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
8329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
8331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
8349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
835b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
836b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
837acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
8389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
8399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
8409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
84141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, position.top);
84241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGE_IF(error != HWC2::Error::None,
84341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Failed to set cursor position "
84441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "to (%d, %d): %s (%d)",
84541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), position.left, position.top, to_string(error).c_str(),
84641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             static_cast<int32_t>(error));
8479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
85041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            HWComposer::HWCLayerInterface& layer) {
8519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
8529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
8539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
8549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
8559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
85641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (layer.getCompositionType() == HWC_OVERLAY ||
85741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
8589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
8599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
8609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
8619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
8629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
8639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
8649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
8659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
8679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
86941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanRect Layer::getPosition(const sp<const DisplayDevice>& hw) {
8709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
8729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
8739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
8749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
8759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
8769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
8811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
89003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
89113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
89213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
89313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
89413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
895a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const {
896a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, clip, false);
89713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
89813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
899a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const {
900a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform);
90113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
90213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
903a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const {
904a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    onDraw(renderArea, Region(renderArea.getBounds()), false);
905c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
906c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
90741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue,
90841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                            float alpha) const {
90919733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
910a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    computeGeometry(renderArea, mMesh, false);
91119733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
91219733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
91313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
91413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
915a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const {
91641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    clearWithOpenGL(renderArea, 0, 0, 0, 0);
91713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
91813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
9199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
92041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
9229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
9239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
92741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(),
92841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman          static_cast<int>(callIntoHwc));
9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
9329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
9339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
93441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            ALOGE_IF(error != HWC2::Error::None,
93541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "[%s] Failed to set "
93641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     "composition type %s: %s (%d)",
93741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     mName.string(), to_string(type).c_str(), to_string(error).c_str(),
93841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                     static_cast<int32_t>(error));
9399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
9409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
944ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
945ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
946ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
947ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
948ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
9499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
950ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
9519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
9529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
9549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
9579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
9589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
9599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
9629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
9659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
9669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
9679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
9689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
9709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
973cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
974cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
975cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
976cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
977cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
9787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
979cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
980cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
981cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
982cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
9837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
9847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
98613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
98713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
98813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
98913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
99013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
99113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
99213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
99313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
99413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
99513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
99613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
997acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
998acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
999acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1000acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1001acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1002acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1003acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1004acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1005acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1006acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1007acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1008acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1009acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1010acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1011acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1012a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh,
1013a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                            bool useIdentityTransform) const {
10141eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1015a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const Transform renderAreaTransform(renderArea.getTransform());
1016a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const uint32_t height = renderArea.getHeight();
10171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
10183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1019acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1020acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1021acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1022acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1023acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
10241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1025acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
10261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
10271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
10281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
10291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1030acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1031acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1032b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1033b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1034b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1035b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1036b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1037acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1038acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1039ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
1040a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[0] = renderAreaTransform.transform(lt);
1041a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[1] = renderAreaTransform.transform(lb);
1042a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[2] = renderAreaTransform.transform(rb);
1043a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    position[3] = renderAreaTransform.transform(rt);
104441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (size_t i = 0; i < 4; i++) {
1045a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        position[i].y = height - position[i].y;
104613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
104713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1048ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
104941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const {
1050231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1051231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1052231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1053231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
105413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
105513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
105613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
105713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
105813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
105913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
106213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
106441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
106513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
106713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
106813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
106913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
107013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
10737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
10747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
10757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
10767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
10777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
10787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
10797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
10800d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
10810d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
10820d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
10830d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
10847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
10857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
10867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
10870d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
10883bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
108941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber);
10900d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
1091cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1092cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1093cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1094cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
10950d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
1096cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
10977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
10987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
10997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
11007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1101f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
11027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
11037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
1104f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
11057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
11067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
110705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
110805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
110905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
111041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    stateToCommit->flags =
111141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask);
11127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
11137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
1114f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
11157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
11167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
111705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
11187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
11197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
11200d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
11217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
11227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
11237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
11247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
11257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
112605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
11277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
11287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
11297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
11307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
113141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) {
113241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                ALOGE("[%s] Unexpected sync point frame number found", mName.string());
1133cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1134cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1135cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1136cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1137cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1138cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1139cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
11407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
11417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
114205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
11437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
11447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
11457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
11467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
11477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1148792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1149792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
11507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
11517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
115205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
11537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
11547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
11557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
11567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
11577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
11587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
11597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
11607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
11617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
11627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
11637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
11647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
11657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
11667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
11677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
116813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
11691c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
11701c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
11717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
117205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
117305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
11747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
11757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
11767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
11771eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
117941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h);
1180a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
11810c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    if (mSurfaceFlingerConsumer && sizeChanged) {
1182cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
11839d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
118441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
118541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
118641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n"
118741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
118841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 "            requested={ wh={%4u,%4u} }}\n",
118941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 this, getName().string(), mCurrentTransform, getEffectiveScalingMode(), c.active.w,
119041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 c.active.h, c.crop.left, c.crop.top, c.crop.right, c.crop.bottom,
119141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 c.crop.getWidth(), c.crop.getHeight(), c.requested.w, c.requested.h, s.active.w,
119241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 s.active.h, s.crop.left, s.crop.top, s.crop.right, s.crop.bottom,
119341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                 s.crop.getWidth(), s.crop.getHeight(), s.requested.w, s.requested.h);
1194a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
11952a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
11962a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
119741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mSurfaceFlingerConsumer->setDefaultBufferSize(c.requested.w, c.requested.h);
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1199cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
1200e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // Don't let Layer::doTransaction update the drawing state
1201e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // if we have a pending resize, unless we are in fixed-size mode.
1202e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // the drawing state will be updated only once we receive a buffer
1203e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // with the correct size.
1204e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
1205e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In particular, we want to make sure the clip (which is part
1206e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // of the geometry state) is latched together with the size but is
1207e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // latched immediately when no resizing is involved.
1208e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
1209e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // If a sideband stream is attached, however, we want to skip this
1210e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // optimization so that transactions aren't missed when a buffer
1211e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // never arrives
1212e392b55de711657d2a955b9785588d009b5e922dRobert Carr    //
1213e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // In the case that we don't have a buffer we ignore other factors
1214e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // and avoid entering the resizePending state. At a high level the
1215e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // resizePending state is to avoid applying the state of the new buffer
1216e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // to the old buffer. However in the state where we don't have an old buffer
1217e392b55de711657d2a955b9785588d009b5e922dRobert Carr    // there is no such concern but we may still be being used as a parent layer.
121841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) &&
121941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            (mActiveBuffer != nullptr);
12200cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
12219e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
12220cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
12230cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
12240cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
12250cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
12267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
12277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
12287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
12297bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
12307d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
12317bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
12327bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
12337bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
12347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
12357bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
12367bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
12377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
12387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
12397bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
12407bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
12417bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
12427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
12437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
12447bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
124582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
124682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
124782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
124882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
124982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
125082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
125182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
125282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
125382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
12561eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
12611eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
126513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
126613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
12673dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
126841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE));
126913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
127013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1271c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1272c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1273c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1274c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
12751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1276c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1277c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
127813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
127905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
128013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
128405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1285a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1286a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
128813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
129013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
129113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
129213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
129313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
129413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
129582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
12963dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
129713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
129813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
129969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
130069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
130169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
130269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
13033dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
13047bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
13057bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
13067bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
13077bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
13087bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
130982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
131082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
13117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
131269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
13137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
131413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
131513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
131613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
131782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
13191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
13201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
13211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
13221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
13241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
13251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
13261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
13271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
13281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
13291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1330ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
133141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.z == z) return false;
133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
133313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
13347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1335db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1336db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1337db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1338db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1339db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1340db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1341db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1342db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1343db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
134413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
134513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
134613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
13471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1348db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1349db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1350db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1351db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1352db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1353db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1354db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1355db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1356db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1357db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1358db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1359db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1360db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1361db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1362db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1363db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1364db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1365db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1366db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1367db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1368db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1369db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1370db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1371db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1372db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1373db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1374db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1375db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
13769ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
13779ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    if (oldZOrderRelativeOf != nullptr) {
13789ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw        oldZOrderRelativeOf->removeZOrderRelative(this);
13799ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw    }
1380db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1381db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1382db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1383db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1384db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1385db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1386db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1387db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
138941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false;
139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
13927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
13969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
139741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.color.a == alpha) return false;
139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
139913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.a = alpha;
14007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
140213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
140413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
140513fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) {
140641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g &&
140741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        color.b == mCurrentState.color.b)
140813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw        return false;
140913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
141013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.sequence++;
141113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.r = color.r;
141213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.g = color.g;
141313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.color.b = color.b;
141413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    mCurrentState.modified = true;
141513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    setTransactionFlags(eTransactionNeeded);
141613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return true;
141713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw}
141813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw
141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
142141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
14227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
14272ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
14287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
142913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
143013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
143113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
143213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
143313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
143441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.flags == newFlags) return false;
143513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
143613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
14377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
14387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
143913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
144013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
144113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
144299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
144399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
144441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedCrop == crop) return false;
144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
144699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
14477bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
144899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
144999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
14507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
14517bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
14527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
145313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
145413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
145513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
14568d5227b8416b099c884429312daf2d60496fa484Robert Carr
14578d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
145841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.requestedFinalCrop == crop) return false;
1459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
14608d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
14617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
14628d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
14638d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
14647bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
14657bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1467acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1469acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
147013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1471c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
147241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (scalingMode == mOverrideScalingMode) return false;
1473c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
147482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1475c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1476c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1477c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
14782f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
147941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.appId = appId;
148041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.type = type;
148141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    mCurrentState.modified = true;
148241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    setTransactionFlags(eTransactionNeeded);
14832f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
14842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
148513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
148641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.layerStack == layerStack) return false;
148713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
148813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
149013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
149113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1492a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1493a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1494bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
149541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (mCurrentState.dataSpace == dataSpace) return false;
1496bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1497bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1498bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1499bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1500bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1501bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1502bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1503532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1504532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1505532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1506532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
15071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1508e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
15091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
15101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
15111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
15121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
15131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
15141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
151541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
15160d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
15177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
15220d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1523792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
15250d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
15260d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
152741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) {
15280d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
15290d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
15307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1532ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1533ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1534ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1535ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1536ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1537ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1538ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1539ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1540ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1541ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1542ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1543ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15486b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1549ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1550d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1551d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1552d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
15536b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
15540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
15550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
15560eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
15570eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
155841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    nsecs_t expectedPresent = mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
15590eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
15600eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
15610eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
156241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    ALOGW_IF(!isPlausible,
156341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "[%s] Timestamp %" PRId64 " seems implausible "
156441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             "relative to expectedPresent %" PRId64,
156541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman             mName.string(), timestamp, expectedPresent);
15660eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
15670eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
15680eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
15696b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
15706b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
15710a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
157241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                              const std::shared_ptr<FenceTime>& presentFence,
157341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                              const CompositorTiming& compositorTiming) {
1574d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
1575d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
157641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (!mFrameLatencyNeeded) return false;
157728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
157828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
157928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
158028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
158141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mFrameEventHistory.addPostComposition(mCurrentFrameNumber, glDoneFence, presentFence,
158241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                              compositorTiming);
158328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
158482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
158528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
158628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
158728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
158882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
158941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    std::shared_ptr<FenceTime> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFenceTime();
159028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
15913d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
159228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
159328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
159428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
159528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
159628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
159782dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
15983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
159941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        mFrameTracker.setActualPresentFence(std::shared_ptr<FenceTime>(presentFence));
160028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
160128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
160228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
16033d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
160441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                mFlinger->getHwComposer().getRefreshTimestamp(HWC_DISPLAY_PRIMARY));
1605d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
160628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
160728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
160828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
160928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
1610d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
1611d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
16121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
16131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
1614e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
16151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
16161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
16171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
16191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
162141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const {
162213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
162313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
162413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
162513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
162613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
162703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
162803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
162903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
163213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
163313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
163413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
163613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
163713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
163813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
163913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
164113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
164213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
164313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
164413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
164513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
16460c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    if (mSurfaceFlingerConsumer) {
16470c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        mSurfaceFlingerConsumer->setTransformHint(orientation);
16480c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    }
164913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
165013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
165113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1655a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const {
1656a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    LayerDebugInfo info;
1657a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    const Layer::State& ds = getDrawingState();
1658a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mName = getName();
16591acbec7884a47f316005ba4f2b5e47c74317ee43chaviw    sp<Layer> parent = getParent();
1660a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
1661a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mType = String8(getTypeId());
1662a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mTransparentRegion = ds.activeTransparentRegion;
1663a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mVisibleRegion = visibleRegion;
1664a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mSurfaceDamageRegion = surfaceDamageRegion;
1665a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mLayerStack = getLayerStack();
1666a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mX = ds.active.transform.tx();
1667a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mY = ds.active.transform.ty();
1668a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mZ = ds.z;
1669a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mWidth = ds.active.w;
1670a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mHeight = ds.active.h;
1671a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mCrop = ds.crop;
1672a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFinalCrop = ds.finalCrop;
167313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    info.mColor = ds.color;
1674a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mFlags = ds.flags;
1675a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mPixelFormat = getPixelFormat();
1676a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mDataSpace = getDataSpace();
1677a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][0] = ds.active.transform[0][0];
1678a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[0][1] = ds.active.transform[0][1];
1679a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][0] = ds.active.transform[1][0];
1680a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mMatrix[1][1] = ds.active.transform[1][1];
1681a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
1682a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        sp<const GraphicBuffer> activeBuffer = getActiveBuffer();
1683a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (activeBuffer != 0) {
1684a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = activeBuffer->getWidth();
1685a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = activeBuffer->getHeight();
1686a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = activeBuffer->getStride();
1687a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = activeBuffer->format;
1688a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        } else {
1689a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferWidth = 0;
1690a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferHeight = 0;
1691a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferStride = 0;
1692a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            info.mActiveBufferFormat = 0;
1693a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
1694bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
1695a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mNumQueuedFrames = getQueuedFrameCount();
1696a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mRefreshPending = isBufferLatched();
1697a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mIsOpaque = isOpaque(ds);
1698a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    info.mContentDirty = contentDirty;
1699a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    return info;
1700d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
17019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1702e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
1703e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1704e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1705e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
1706e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
1707e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
1708e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
1709e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
1710e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
1711e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
1712e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
1713e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1714e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
1715e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1716e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
1717e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1718e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1719e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
1720e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
1721e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
1722e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
1723e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
1724e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
1725e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
1726e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
1727e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
1728e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
1729e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1730e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
1731e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1732e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
1733e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
17348c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck    result.appendFormat("  %10d | ", layerState.z);
173541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
1736e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
173741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
17385a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
173941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
1740e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1741e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
1742e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
1743e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
17449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1745e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
1746d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
1747d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
174882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
174982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
1750d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
1751d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
175225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
175325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
17546547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
17556547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
17566547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
17576547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1758d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
1759d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
1760d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
1761d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
1762d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
176341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this);
1764d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1765d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
1766d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
1767d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
1768d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
17695ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
17705ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
17715ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
17725ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
17735ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
17743890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
177541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                                     FrameEventHistoryDelta* outDelta) {
1776d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
1777d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
1778fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // If there are any unsignaled fences in the aquire timeline at this
1779fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // point, the previously queued frame hasn't been latched yet. Go ahead
1780fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // and try to get the signal time here so the syscall is taken out of
1781fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // the main thread's critical path.
1782fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mAcquireTimeline.updateSignalTimes();
1783fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // Push the new fence after updating since it's likely still pending.
17843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
1785d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
1786d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
178740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
17883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
17893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
1790d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
179140845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
1792e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
179341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanstd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(bool forceFlush) {
1794e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
17950c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
179641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    if (!mSurfaceFlingerConsumer) return {};
17970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
179841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, &history);
1799e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
180041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), result);
1801e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
1802e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
1803e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
1804e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
1805e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
1806367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
18070c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    if (mSurfaceFlingerConsumer) {
18080c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman        return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
18090c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    }
18100c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    return false;
1811367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
1812367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
181398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
181498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
181598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
181698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
181798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
181898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
181998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
182098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
18211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
18221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
18231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
18241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
18271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
18281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
18291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18311db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
18321db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
18331db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
18341db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
18351db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
18361db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
18371db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
18381db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
18391db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
18401db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
18411db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
18421db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
18431db73f66624e7d151710483dd58e03eed672f064Robert Carr
18441db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
1845e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
18461db73f66624e7d151710483dd58e03eed672f064Robert Carr
18471db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
18481db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
18491db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
18501db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
18511db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
18521db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
18531db73f66624e7d151710483dd58e03eed672f064Robert Carr
18541db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
18551db73f66624e7d151710483dd58e03eed672f064Robert Carr}
18561db73f66624e7d151710483dd58e03eed672f064Robert Carr
1857f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) {
1858f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (newParentHandle == nullptr) {
18590617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
18600617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
18610617894190ea0c3ee50889bee1d4df0f369b0761chaviw
18620617894190ea0c3ee50889bee1d4df0f369b0761chaviw    auto handle = static_cast<Handle*>(newParentHandle.get());
18630617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Layer> newParent = handle->owner.promote();
18640617894190ea0c3ee50889bee1d4df0f369b0761chaviw    if (newParent == nullptr) {
18650617894190ea0c3ee50889bee1d4df0f369b0761chaviw        ALOGE("Unable to promote Layer handle");
18660617894190ea0c3ee50889bee1d4df0f369b0761chaviw        return false;
18670617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
18680617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1869f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Layer> parent = getParent();
1870f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (parent != nullptr) {
1871f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        parent->removeChild(this);
18720617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
1873f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    newParent->addChild(this);
18740617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1875f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    sp<Client> client(mClientRef.promote());
18760617894190ea0c3ee50889bee1d4df0f369b0761chaviw    sp<Client> newParentClient(newParent->mClientRef.promote());
18770617894190ea0c3ee50889bee1d4df0f369b0761chaviw
1878f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw    if (client != newParentClient) {
1879f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw        client->setParentLayer(newParent);
18800617894190ea0c3ee50889bee1d4df0f369b0761chaviw    }
18810617894190ea0c3ee50889bee1d4df0f369b0761chaviw
18820617894190ea0c3ee50889bee1d4df0f369b0761chaviw    return true;
18830617894190ea0c3ee50889bee1d4df0f369b0761chaviw}
18840617894190ea0c3ee50889bee1d4df0f369b0761chaviw
18859524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
1886412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) {
18879524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
18889524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
18899524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
18909524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
1891161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        sp<Client> parentClient = mClientRef.promote();
18929524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
1893161410b01a37bcc5522d8e91fe0a743989c86e70chaviw        if (client != nullptr && parentClient != client) {
18949524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
18959524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
18969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
18979524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
18989524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
18999524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
19009524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
19011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
1902e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
19031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
19051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
19061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
19071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
19081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
19101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
19111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
19121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
19131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
19151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
19171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
19181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
19191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
192141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(
192241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman        LayerVector::StateSet stateSet) {
1923412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1924412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
1925412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1926412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1927412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
1928412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
1929412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    if (state.zOrderRelatives.size() == 0) {
1930412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        return children;
1931db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1932db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
1933db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1934412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1935db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
1936db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1937db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
1938db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1939db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1940db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1941412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
1942db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
1943db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1944db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1945db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
1946db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1947db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
19481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1949db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
19501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1951412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
1952412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
1953db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
19541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
1955db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1956db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1957db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
19581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
1959db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1960412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
19611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1962412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
1963db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
1964db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1965412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
19661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
19691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
1970db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
19711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
1972412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
1973412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
1974412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
1975db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
19761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
197741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (i = list.size() - 1; i >= 0; i--) {
1978db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1979db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
19801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
19811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
1982412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
19831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
1984412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
198541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    for (; i >= 0; i--) {
1986db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
1987412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
19881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1991a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/**
1992a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers.
1993a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */
1994a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet,
1995a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                                     const LayerVector::Visitor& visitor) {
1996a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1997a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1998a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
1999a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    size_t i = 0;
2000a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
2001a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
2002a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        if (relative->getZ() >= 0) {
2003a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            break;
2004a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
2005a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
2006a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
2007a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    visitor(this);
2008a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    for (; i < children.size(); i++) {
2009a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        const auto& relative = children[i];
2010a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        relative->traverseChildrenInZOrder(stateSet, visitor);
2011a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
2012a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw}
2013a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
20141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
20151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
2016e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
20171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
20181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
20199b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
20209b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
20219b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
20229b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
20239b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
20249b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
20250a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu        if (p->isFixedSize() && p->mActiveBuffer != nullptr) {
20261725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
20271725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
20281725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
20291725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getWidth();
20301725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getHeight();
20311725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
20321725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getWidth();
20331725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getHeight();
20341725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
203541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth);
203641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman            float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight);
20379b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
20389b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
20399b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
20409b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
20411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
20421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
20431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
20441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
204513fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const {
2046e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
20476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
204813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf;
204913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return parentAlpha * getDrawingState().color.a;
20506452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
20516452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
205213fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const {
205313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    const half4 color(getDrawingState().color);
205413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw    return half4(color.r, color.g, color.b, getAlpha());
20556452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
20566452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
20571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
20581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
20591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
20601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
20611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
20621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
2063e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
20641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
20651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
20661d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) {
20671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
20681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
20691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    const State& state = useDrawing ? mDrawingState : mCurrentState;
20701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform requestedTransform = state.active.transform;
20721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    Transform transform = getTransform();
20731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_id(sequence);
20751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_name(getName().c_str());
20761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_type(String8(getTypeId()));
20771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const auto& child : children) {
20791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->add_children(child->sequence);
20801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
20811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
20831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        sp<Layer> strongRelative = weakRelative.promote();
20841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        if (strongRelative != nullptr) {
20851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw            layerInfo->add_relatives(strongRelative->sequence);
20861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        }
20871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
20881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.activeTransparentRegion,
20901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw                                   layerInfo->mutable_transparent_region());
20911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region());
20921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region());
20931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_layer_stack(getLayerStack());
20951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_z(state.z);
20961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
20971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* position = layerInfo->mutable_position();
20981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_x(transform.tx());
20991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    position->set_y(transform.ty());
21001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    PositionProto* requestedPosition = layerInfo->mutable_requested_position();
21021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_x(requestedTransform.tx());
21031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    requestedPosition->set_y(requestedTransform.ty());
21041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    SizeProto* size = layerInfo->mutable_size();
21061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_w(state.active.w);
21071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    size->set_h(state.active.h);
21081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop());
21101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop());
21111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_is_opaque(isOpaque(state));
21131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_invalidate(contentDirty);
21141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_dataspace(dataspaceDetails(getDataSpace()));
21151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat()));
21161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color());
21171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color());
21181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_flags(state.flags);
21191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());
21211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform());
21221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto parent = getParent();
21241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (parent != nullptr) {
21251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_parent(parent->sequence);
21261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
21271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto zOrderRelativeOf = state.zOrderRelativeOf.promote();
21291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (zOrderRelativeOf != nullptr) {
21301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence);
21311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
21321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    auto activeBuffer = getActiveBuffer();
21341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    if (activeBuffer != nullptr) {
21351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw        LayerProtoHelper::writeToProto(activeBuffer, layerInfo->mutable_active_buffer());
21361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    }
21371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
21381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_queued_frames(getQueuedFrameCount());
21391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw    layerInfo->set_refresh_pending(isBufferLatched());
21401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}
21411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw
214213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
214313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
21443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
21473f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
21483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
21513f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
21523f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2153