Layer.cpp revision 532b26380fd6d32dc5d7605bd766a2c4f00d0a80
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
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.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>
4390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
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"
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE    0
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    :   contentDirty(false),
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
72a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mTextureName(-1U),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mName("unnamed"),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFormat(PIXEL_FORMAT_NONE),
7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
80399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
81a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
83933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
84c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
85a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
86d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mBufferLatched(false),
87cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
888cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mPreviousFrameNumber(0),
894d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        mRefreshPending(false),
9082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
935cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mHasSurface(false),
9903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
103a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10504839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos        mUpdateTexImageFailed(false),
10682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mFreezePositionUpdates(false)
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Creating Layer %s", name.string());
1119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
113a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
11549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eHidden)
1194125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerHidden;
1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (flags & ISurfaceComposerClient::eOpaque)
1214125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerOpaque;
122231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    if (flags & ISurfaceComposerClient::eSecure)
123231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza        layerFlags |= layer_state_t::eLayerSecure;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eNonPremultiplied)
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mPremultipliedAlpha = false;
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1323dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
133b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
134b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1354d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mCurrentState.alpha = 1.0f;
1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mCurrentState.alpha = 0xFF;
1409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.flags = layerFlags;
1434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
145bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1462f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1472f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1516547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    nsecs_t displayPeriod =
1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1606547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1610a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1620a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1630a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1640a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
165e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
166e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
1673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() {
168bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
169b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer;
170b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer;
1710556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian    BufferQueue::createBufferQueue(&producer, &consumer, true);
1721db73f66624e7d151710483dd58e03eed672f064Robert Carr    mProducer = new MonitoredProducer(producer, mFlinger, this);
173468051e20be19130572231266db306396a56402bIrvel    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this);
174bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
175399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mSurfaceFlingerConsumer->setContentsChangedListener(this);
1764d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mSurfaceFlingerConsumer->setName(mName);
177b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
17863a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    if (mFlinger->isLayerTripleBufferingDisabled()) {
17963a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard        mProducer->setMaxDequeuedBufferCount(2);
18063a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    }
1816905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1828430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
1838430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    updateTransformHint(hw);
184b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
18596f0819f81293076e652792794a961543e6750d7Mathias Agopian
1864d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1878ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos  sp<Client> c(mClientRef.promote());
1888ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    if (c != 0) {
1898ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos        c->detachLayer(this);
1908ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    }
1918ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos
192cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mRemoteSyncPoints) {
193cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        point->setTransactionApplied();
194cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    }
195c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    for (auto& point : mLocalSyncPoints) {
196c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza        point->setFrameAvailable();
197c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
198921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    mFlinger->deleteTextureAsync(mTextureName);
1996547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
20096f0819f81293076e652792794a961543e6750d7Mathias Agopian}
20196f0819f81293076e652792794a961543e6750d7Mathias Agopian
20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
22213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2236b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2246b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2256b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2266b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
227468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
228468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2446b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
245ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
249a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2506b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2516b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
25299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
253579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
254579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2556b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
258a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
266a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
267a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2724d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2796b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
280399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
281399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
282399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
283399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
284399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
285399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
286399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2876710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after
2886710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before
2896710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list)
29013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() {
2915edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
2925edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
2935edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
2945edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
2955edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
2965edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
2975edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
2985edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
299bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->abandon();
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
30348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
304cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3091eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
33313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
348582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
349582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
350b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
351b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
35713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
358a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
359a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
360a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
361f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
362f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
363a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
365a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
366a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
367a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
368f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
369a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
3704fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
371f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
375f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
376f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
377f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
378f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
379f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
380f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
381f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
382f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
383f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
384f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const sp<Layer>& p = getParent();
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
41913127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4201eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4236c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4246c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4256c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
42613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
427b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
428b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
429b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
43013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
4311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
4331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
435de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
436de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
437de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
4381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
4431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
4441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
4451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4476c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
4486c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
44913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
45013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
452b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
45313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
4541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
45513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
45613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
45713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
4586b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
4596b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
4606b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
4616b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
4620e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4630e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
464b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
465b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        activeCrop = s.crop;
4660e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
4670e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
471acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
472acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
473b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
474b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
475acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
476acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
477acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4815a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4845a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
4941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
49913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
50028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
50128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
50228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
50328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
50428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
50528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
506acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
508acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
50913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
510f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
511f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
512f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
513acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
514acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
517cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
519021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
520021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
522021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
523021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
52813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5300f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
5310f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
55313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
55713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
558acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
559acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
560acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
561acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
562acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
563acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
564acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
565acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
566acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
56713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
56813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
56913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
57013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
572ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
5739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
5769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
5779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
578a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
5799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
5819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
5829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
5849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
585a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
5863e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
5879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
5959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
602dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
60313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
6041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
6059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
606ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
6076452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
608ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman        blendMode = mPremultipliedAlpha ?
6099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
6109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
611ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
612ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
613ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             " %s (%d)", mName.string(), to_string(blendMode).c_str(),
614ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             to_string(error).c_str(), static_cast<int32_t>(error));
6159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6166452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 0xFF) {
6179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
62213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
62313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
62413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6256c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
627b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
628b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
631acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
6329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
6349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
635acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
636acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
63828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
63928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
64028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
64128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
64228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
64328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
644acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
645acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
646acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
6486c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
6496c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
6506c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
6516c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
6526c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
6536c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
6546c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
6556c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
6561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
6571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
658b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
659b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
660acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
661acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
662acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
664acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
665acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
666acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
669ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
670e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
671e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
672e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
673e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
674e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
675e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
676e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
677e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6795a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
681e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
682e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
683e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
684e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
685e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
686e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
687e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
688e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6906452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float alpha = getAlpha();
6916452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
6936452f12c95e855a96ab8f690f28914cd37de762bRobert Carr            "%s (%d)", mName.string(), alpha, to_string(error).c_str(),
6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
696ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
698ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
7002f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
7012f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    error = hwcLayer->setInfo(s.type, s.appId);
7022f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
7032f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
7049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
7069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
7079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
7099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
7109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
7116452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    layer.setPlaneAlpha(getAlpha());
7129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7139f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
71429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
71529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
71629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
71729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
71829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
71929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
72029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
72129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
72229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
7231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
724c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
725cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
726c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
727021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
728021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
729c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
730021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
731021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
732c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
733c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
734c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
735c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
736c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
737cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
738cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
739cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
740cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
741cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
742cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
743cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
744cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
745c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
74629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
74729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
74813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
7499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
7569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                "%s (%d)", mName.string(), to_string(transform).c_str(),
7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
7629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
7639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
7649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
7659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
7669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
768a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
769a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
7709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
787aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcInfo = mHwcLayers[hwcId];
788aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcLayer = hwcInfo.layer;
7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
7949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
7979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
8009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
8019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8030f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
8050f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
8060f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
8070f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
8089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
8099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
8109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
8119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
8130f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8160a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
817aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    if (hwcInfo.forceClientComposition ||
8180a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
8190f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
8209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
8210f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8220f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8230f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
8240a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
8250a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
8260a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
827c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
828c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
8290a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
8300a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
8310a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
8320a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8330a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
834c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
835c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
836c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
837c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
838c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
839c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
840c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
841c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
842c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
8430a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
8440a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
8450a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
8460f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
8470f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
8480f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
8490f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
8509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
8529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
8539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8540f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
855bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
856bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
857bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
858bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
859bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
860bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
861bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
862bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
86306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
8641f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    sp<GraphicBuffer> hwcBuffer;
8651f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer,
8661f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara            &hwcSlot, &hwcBuffer);
86706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
8680f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
8691f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence);
8700f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
8710f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
8720f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
8730f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
8740f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8769551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter
8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
8819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
890ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
8919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
8929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
8939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
8959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
8969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
8979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
9029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
9039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
9049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
9059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
9069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
9109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
911dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
9129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
9139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
9149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
915b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
916b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
9179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
9199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
9201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
922b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
923b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
924acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
9279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
9329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
9339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
9349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
9399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
9489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
9499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
9509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
9519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
9539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
9691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
9729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
97803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
97913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
98013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
98113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
98213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
98313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
984c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
98613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
987c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
988c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
989c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
99013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
99113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
992c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
993c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
994c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
995c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
996cae605cd5668f8107e340ad8a672c7f034147401Robert Carrstatic constexpr mat4 inverseOrientation(uint32_t transform) {
997cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
998cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
999cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
1000cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    mat4 tr;
1001cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1002cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
1003cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * rot90;
1004cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1005cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) {
1006cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipH;
1007cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1008cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) {
1009cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipV;
1010cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1011cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    return inverse(tr);
1012cae605cd5668f8107e340ad8a672c7f034147401Robert Carr}
1013cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
10145d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter/*
10155d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter * onDraw will draw the current layer onto the presentable buffer
10165d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter */
1017c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
1018c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
10201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
10211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1022a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
1024179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
1025179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
1026179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
1027179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1028179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
1029179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
1030179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1031179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
1032179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
10331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
1034412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        mFlinger->mDrawingState.traverseInZOrder([&](Layer* layer) {
10351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
10361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
10371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
10381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
10394297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
10401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
1041179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
1042179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
1043179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
10441748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
1045179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1048a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
104997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
105097eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1051bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1052bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
105397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1054dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1055dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1056dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1057dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1058dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1059dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1060875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1061875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1062dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1063cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1064eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1065cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1066cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1067cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1068bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1069bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1070cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1071cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        if (getTransformToDisplayInverse()) {
1072c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1073c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1074021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1075021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1076c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1077021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1078021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1079cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            mat4 tr = inverseOrientation(transform);
1080cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1081cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            /**
1082cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * TODO(b/36727915): This is basically a hack.
1083cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             *
1084cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * Ensure that regardless of the parent transformation,
1085cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * this buffer is always transformed from native display
1086cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * orientation to display orientation. For example, in the case
1087cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * of a camera where the buffer remains in native orientation,
1088cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * we want the pixels to always be upright.
1089cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             */
1090cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            if (getParent() != nullptr) {
1091cae605cd5668f8107e340ad8a672c7f034147401Robert Carr                const auto parentTransform = getParent()->getTransform();
1092cae605cd5668f8107e340ad8a672c7f034147401Robert Carr                tr = tr * inverseOrientation(parentTransform.getOrientation());
1093cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            }
1094c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1095c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1096c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1097c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1098c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1099c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1100cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
110149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
110249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
110349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
110449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
110549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1106a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1107875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1108a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
11098578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1110875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1114c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
11151748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1116c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
111819733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1119c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
112019733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
112119733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
112313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
112413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
11251748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
11261748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
112713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1129c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
11308578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
11311eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
113213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1133c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
113413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
113513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
113613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
113713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
113813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
113913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
114013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
114113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
114213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
114313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1144c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
114513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
114613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
114713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
114813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1149acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1150acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
11511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1152b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
11531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1154b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1155acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1156acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
11571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1158acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1159acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1160acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1161acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
116213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
11643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
11653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
11663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
116713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1168875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1169875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1170ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1171ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1172ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1173ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1174ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
117513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1176875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
11776452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), getAlpha());
11785d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2
11795d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    engine.setSourceDataSpace(mCurrentState.dataSpace);
11805d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif
11815cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1182875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
118313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
118413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
11869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
11879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
11889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
11909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
11919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
11939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
11949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
11969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
11979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
11989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
11999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
12009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
12019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
12039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
12049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
12059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
12069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1210ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1211ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1212ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1213ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1214ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1216ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
12179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
12189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
12209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
12239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
12259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
12289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
12319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
12339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
12349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
12369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12391681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
12401681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
12411681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
12421681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
12431681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
12441681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
12451681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
12461681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
12471681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
12481681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
12491681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1250c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1251c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1252c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1253c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1254c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1255c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1256c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1257c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1258c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1259c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1260c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1261c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1262c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1263c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1264cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1265cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1266cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1267cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1268cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1269cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
12707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1271cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
12727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
12731ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
12749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1275c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1276c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1277c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1278c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
12791ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
12801ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
12811ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12821ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12831ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
12841ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
12851ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
12861ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
12871ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
12881ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12891ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12901ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
12919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
12929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
12939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12941ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
12951ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1296cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1297cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1298cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1299cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1300cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
13017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1302cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1303cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1304cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1305cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
13067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
130813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
130913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
131013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
131113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
131213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
131313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
131413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
131513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1316ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1317ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1318ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1319ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1320ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1321ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1322ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13235773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1324a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1325a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1326ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
13275773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
13285773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
13295773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1330ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1331541f22658ab1617c9d12c98684ab40248df8749bRomain Guy        case HAL_PIXEL_FORMAT_RGBA_1010102:
1332dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
13335773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
13345773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1335dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1336ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1337ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
134013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
134113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1342acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1343acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1344acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1345acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1346acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1347acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1348acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1349acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1350acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1351acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1352acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1353acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1354acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1355acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1356acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1357c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1358c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
135913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
13601eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
13611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
13631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
13643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1366acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1367acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1368acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
13701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1371acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
13721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
13731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
13741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
13751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1376acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1377acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1378b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1379b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1380b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1381b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1382b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1383acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1384acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1385ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
13861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
13871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
13881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
13891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
13903f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
13915cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1394ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13954125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1396a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1397e6fd41d064711395c7d060abacd86d487495530dneo.he    // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the
1398a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1399e6fd41d064711395c7d060abacd86d487495530dneo.he    if ((mSidebandStream == nullptr) && (mActiveBuffer == nullptr)) {
1400a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1401db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1402a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1403a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1404a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
14054125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1406a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1407a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1408231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1409231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1410231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1411231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1412231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1413231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
14147a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
14157a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1416a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
14177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
14187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
14197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1420b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1422c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
142713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
143013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
143113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
143213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
143313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
143413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
143513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
143613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
143713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
143813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
143913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
144013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
144113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
144213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
144313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
144413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
144613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
144713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
144813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
144913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
145013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
145113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
145213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
14537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
14547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
14557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
14567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
14597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
14600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
14610d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
14620d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
14630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
14647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
14657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
14667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
14670d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
14683bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
14693bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
14703bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
14710d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
1472cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1473cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1474cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1475cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
14760d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
1477cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
14817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1482f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
14837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
14857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
148705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
148805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
148905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
149005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
149105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
14927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
14947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
149605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
14977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
14987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
14990d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
15007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
15027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
15037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
15047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
150505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
15087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1510cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1511cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1512cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1513cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1514cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1515cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1516cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1517cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1518cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1519cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1520cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
15227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
152305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
15277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1529792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1530792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
153305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
15347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
15357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
15407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
15417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
15427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
15467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
15477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1550cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
15511ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1552cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1553cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
15541ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1555cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1556cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
15577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
156013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
15611c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
15621c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
15637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
156405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
156505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
15667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
15677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15691eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15711eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
15721eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1573a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1574a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1575cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
15769d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
15776905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1578419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1580419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1581b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1582c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1583c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
15841eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1585b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1586b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1587b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1588b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1589b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1590b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
15911eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
15921eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1593b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1594b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1595b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1596b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1597b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1598b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1599b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1600a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
16012a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
16022a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1603bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
16041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1606cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
160782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
160882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
16090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
16109e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
161113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
16120cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
16130cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
16140cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
16150cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
16160cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
16170cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
16180cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
16199e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
16209e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
16219e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
16229e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
16230cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
16240cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
16250cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
16260cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
16270cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
162813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always set active to requested, unless we're asked not to
162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this is used by Layer, which special cases resizes.
163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (flags & eDontUpdateGeometryState)  {
163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    } else {
16327d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
163382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        if (mFreezePositionUpdates) {
163482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
163582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
163682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
163782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
163882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
163982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
164082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
164182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
164282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
164313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
164413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16451eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
164613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
164713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
164813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
164913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16501eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
165113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
165513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
16563dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
16573dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
165813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
165913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
166013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1661c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1662c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1663c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1664c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1666c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1667c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
166813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
166905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
167013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
167305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
167405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1675a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1676a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
167713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
167813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
167913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
168013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
168313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
168413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
168582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
16863dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
168713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
168813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
168969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
169069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
169169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
169269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
16933dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
169482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    if (immediate && !mFreezePositionUpdates) {
169582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
169682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
169782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
169869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
16997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
170113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
170213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
170382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
17041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
17051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
17061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
17071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
17081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
17101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
17111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
17121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
17141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1716ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
171913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
172013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
17217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1722db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1723db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1724db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1725db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1726db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1727db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1728db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1729db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1730db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
173113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
173213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
173313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1735db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1736db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1737db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1738db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1739db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1740db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1741db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1742db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1743db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1744db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1745db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1746db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1747db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1748db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1749db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1750db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1751db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1752db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1753db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1754db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1755db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1756db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1757db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1758db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1759db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1760db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1761db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1762db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1763db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1764db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1765db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1766db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1767db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1768db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1769db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1770db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
177113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
177213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
177513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
17767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
177813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
177913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
17819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
17829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
17839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
17849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
178513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
178613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
178713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
178813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
17897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
179013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
179113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
179213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
179313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
179413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
17953dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
1796cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr            matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
17977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
179813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
179913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
180013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
180113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
18022ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
18037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
180413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
180513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
180613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
180713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
180813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
180913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
181013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
181113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
181213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
18137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
18147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
181513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
181613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
181899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
181999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
1820b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.crop == crop)
182113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
182213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
182399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
182499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    if (immediate) {
182599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
182699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
18277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
182813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
182913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
183013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
18318d5227b8416b099c884429312daf2d60496fa484Robert Carr
18328d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
1833b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.finalCrop == crop)
1834acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1835acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
18368d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
18378d5227b8416b099c884429312daf2d60496fa484Robert Carr    if (immediate) {
18388d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
18398d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
1840acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1841acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1842acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1843acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
184413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1845c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1846c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1847c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1848c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
184982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1850c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1851c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1852c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
18532f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
18542f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
18552f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
18562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
18572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
18582f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
18592f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1860c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1861c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1862c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1863c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1864c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1865c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1866c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
186713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
186813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
186913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
187013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
187113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
18727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
187313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
187413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1875a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1876a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1877bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1878bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1879bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1880bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1881bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1882bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1883bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1884bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1885bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1886bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1887532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1888532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1889532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1890532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
18911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
18921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    auto p = getParent();
18931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
18941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
18951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
18971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18990d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer,
19007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
19010d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
19027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
19037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
19047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
19057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
19067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
19070d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1908792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
19097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
19100d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    ALOGE("Deferred transaction");
19110d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
19120d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
19130d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle,
19140d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        uint64_t frameNumber) {
19150d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
19160d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
19177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
19187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1919ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1920ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1921ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1922ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1923ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1924ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1925ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1926ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1927ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1928ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1929ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1930ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19356b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1936ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1937d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1938d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1939d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
19406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
19410eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
19420eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
19430eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
19440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
19456b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
19466b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
19470eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
19480eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
19490eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
19500eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
19510eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
19520eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
19530eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
19540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
19550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
19566b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
19576b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
1958d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
1959d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
1960d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
1961d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
1962d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
19634d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
1964ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
196599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
196699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
19670a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
19683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
19690a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const CompositorTiming& compositorTiming) {
19703d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mAcquireTimeline.updateSignalTimes();
19713d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.updateSignalTimes();
19723d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1973d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
1974d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
197528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
197628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
197728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
197828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
197928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
198028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
198128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
19820a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson                glDoneFence, presentFence, compositorTiming);
198328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
198482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
198528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
198628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
198728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
198882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
19903d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
199128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
19923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
199328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
199428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
199528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
199628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
199728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
199882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
20003d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
20013d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
200228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
200328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
200428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
20053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
20063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
20073d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
2008d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
200928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
201028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
201128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
201228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
2013d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
2014d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
20159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2016f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
20175ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
20185ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return;
20195ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
20205ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
20213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
2022d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
20233d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
20243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
20253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
20268cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    if (mPreviousFrameNumber != 0) {
20278cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mFrameEventHistory.addRelease(mPreviousFrameNumber,
20288cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                dequeueReadyTime, std::move(releaseFenceTime));
20298cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    }
20309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
20319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
20329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
20331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
20341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
20351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& parent = getParent();
20361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
20371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
20381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
20391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
20401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
20411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2042da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
20439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
20446452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha() > 0.0f
20459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
20469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
20476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha()
20489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
20499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2050da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
2051da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2052cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
2053cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
2054cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
2055cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
2056cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
2057cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2058cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
2059cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
2060cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
2061cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2062cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
2063cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2064cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
2065cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
2066cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
2067cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
2068cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
2069cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
2070cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
2071cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2072cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2073cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
2074cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
2075cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
2076cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
2077cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2078d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
2079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
20801c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
20811c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2082399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
2083399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
2084399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
208512e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
208612e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
208712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
208812e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
20895bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
20905bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
20915bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
20921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
2093399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
2094399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
20954fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
2096223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
2097223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2098223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
209999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
2100223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
2101223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
2102223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
2103223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
2104223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
2105223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2106223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2107223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
21081ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2109223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2110223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2111223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
21152c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2116223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2118223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2119223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2120223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2121cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2125223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2127223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2128223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2130223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
21317b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
21327b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
21337b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    mOverrideScalingMode, mFreezePositionUpdates);
2134223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2135223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2136223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2137223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2138223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2139223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2140223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2141223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2142223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2143223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2145063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
21466b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2147223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2148223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2149223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2150223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2151223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2152223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2161ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2165223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2167ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2174223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2175223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2176223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2177223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2179223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
21806b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2181223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
21826b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
21836b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2185223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2186ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
21871585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2188223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2189223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2190223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2193223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2194d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2195223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
219606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(
219706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            &mActiveBufferSlot);
2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2202702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2203d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2204d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2205d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2206d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2207d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2208d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2209d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2210d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
22113d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2212d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
22133d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
22148cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
22158cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRelease(mPreviousFrameNumber,
22168cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    latchTime, std::move(releaseFenceTime));
22178cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
2218d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2219d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2220d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2221223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2222223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2223223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2224223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2225223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2226223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2227223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2228223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2229bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2230bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2231223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2232223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2233223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2234223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2235223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2236223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2237223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2238223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2239223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2240223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2241223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2242223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2243702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2244223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2245223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2246223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2247223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2248223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2249702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2250702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2251223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2252702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2253223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2254223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2255223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2256223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2257cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2258223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2259223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2260223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2261223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2262223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2263223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2264223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2265223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2266223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2267223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2268223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2269223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2270223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2271223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2272223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2273223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2274223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2275223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2276cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2277cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2278223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2279cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2280223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2281223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2282223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2283223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
22841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
22851c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22864fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
228913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
229013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
229113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
229213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
229313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
229413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
229513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
229603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
229703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
229803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
229913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
230013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
230113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
230213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
230313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
230413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
230513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
230613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
230713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
230813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
230913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
231013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
231113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
231213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
231313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
231413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
231513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
231613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
231713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
231813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
231913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
232013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
232113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
23223e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
23231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
23241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
232513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
23263e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
232774d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
232813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
232913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
23303e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
233113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
23322ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
233313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2334ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
233513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
233636c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    PixelFormat pf = PIXEL_FORMAT_UNKNOWN;
233736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    const sp<GraphicBuffer>& buffer(getActiveBuffer());
233836c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    if (buffer != NULL) {
233936c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter        pf = buffer->getPixelFormat();
234036c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    }
234113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
234274d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2343acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2344acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
234513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
234636c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter            "dataspace=%s, pixelformat=%s "
23479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
23489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
23499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
23509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
23519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
235213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
23531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
23541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
23551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2356b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2357b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2358b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2359b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
23604125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
236136c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter            dataspaceDetails(getDataSpace()).c_str(), decodePixelFormat(pf).c_str(),
236213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
23633dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
23643dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
236513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
23661b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2367a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2368a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
23691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
23701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
23711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
23721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2373a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
23741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
237574d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
23761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2377ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
23786905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2379a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
23806905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
23811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2382bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
23833d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2384bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2385d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2386d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
23879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2388e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2389e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2390e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2391e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2392e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2393e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2394e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2395e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2396e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2397e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2398e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2399e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2400e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2401e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2402e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2403e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2404e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2405e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2406e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2407e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2408e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2409e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2410e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2411e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2412e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2413e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2414e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2415e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2416e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2417e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2418e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2419e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2420e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2421e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2422e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2423e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2424e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2425e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
24265a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
2427e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2428e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2429e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2430e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2431e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
24339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2434e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2435d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2436d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
243782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
243882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2439d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2440d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
244125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
244225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
24436547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
24446547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
24456547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
24466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2447d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2448d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2449d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2450d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2451d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2452d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2453d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2454d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2455d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2456d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2457d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2458d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
24595ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
24605ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
24615ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
24625ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
24635ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
24643890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
24653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2466d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2467d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
24683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2469d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2470d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
247140845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
24723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
24733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2474d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
247540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2476e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2477e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2478e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2479e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2480e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2481e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2482e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2483e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2484e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2485e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2486e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2487e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2488e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2489e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2490367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2491367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2492367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2493367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
24941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
24951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
24961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
24971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
25001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
25011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
25021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25041db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
25051db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
25061db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
25071db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
25081db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
25091db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
25101db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
25111db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
25121db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
25131db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
25141db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
25151db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
25161db73f66624e7d151710483dd58e03eed672f064Robert Carr
25171db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
25181db73f66624e7d151710483dd58e03eed672f064Robert Carr        newParent->addChild(child);
25191db73f66624e7d151710483dd58e03eed672f064Robert Carr
25201db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
25211db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
25221db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
25231db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
25241db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
25251db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
25261db73f66624e7d151710483dd58e03eed672f064Robert Carr
25271db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
25281db73f66624e7d151710483dd58e03eed672f064Robert Carr}
25291db73f66624e7d151710483dd58e03eed672f064Robert Carr
25309524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
2531412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) {
25329524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
25339524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
25349524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
25359524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
25369524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
25379524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (client != nullptr) {
25389524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
25399524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
25409524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
25419524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
25429524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
25439524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
25449524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
25451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
25461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mParent = layer;
25471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
25501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
25511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
25521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
25551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
25561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
25571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
25591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
25621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
25631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2565412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector Layer::makeTraversalList(LayerVector::StateSet stateSet) {
2566412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
2567412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
2568412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
2569412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
2570412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
2571412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
2572412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    if (state.zOrderRelatives.size() == 0) {
2573412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        return children;
2574db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2575db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
2576db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2577412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
2578db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
2579db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
2580db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
2581db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
2582db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2583db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2584412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
2585db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
2586db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2587db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2588db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
2589db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
2590db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
25911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
2592db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
25931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
2594412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
2595412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
2596db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
25971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
2598db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
2599db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2600db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
26011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
2602db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
2603412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
26041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2605412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
2606db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
2607db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2608412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
26091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
2613db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
26141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
2615412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
2616412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
2617412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
2618db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
26191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
2620db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (i = list.size()-1; i>=0; i--) {
2621db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2622db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
26231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
26241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
2625412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
26261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2627412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
26281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
2629db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2630412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
26311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
26351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
26361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
26371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
26381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
26399b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
26409b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
26419b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
26429b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
26439b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
26449b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
26459b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        if (p->isFixedSize()) {
26461725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
26471725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
26481725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
26491725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getWidth();
26501725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getHeight();
26511725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
26521725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getWidth();
26531725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getHeight();
26541725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
26559b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            float sx = p->getDrawingState().active.w /
26561725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                    static_cast<float>(bufferWidth);
26579b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            float sy = p->getDrawingState().active.h /
26581725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                    static_cast<float>(bufferHeight);
26599b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
26609b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
26619b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
26629b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
26631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
26651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26676452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#ifdef USE_HWC2
26686452f12c95e855a96ab8f690f28914cd37de762bRobert Carrfloat Layer::getAlpha() const {
26696452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    const auto& p = getParent();
26706452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
26716452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0;
26726452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return parentAlpha * getDrawingState().alpha;
26736452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
26746452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#else
26756452f12c95e855a96ab8f690f28914cd37de762bRobert Carruint8_t Layer::getAlpha() const {
26766452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    const auto& p = getParent();
26776452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
26786452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? (p->getAlpha() / 255.0f) : 1.0;
26796452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float drawingAlpha = getDrawingState().alpha / 255.0f;
26806452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    drawingAlpha = drawingAlpha * parentAlpha;
26816452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return static_cast<uint8_t>(std::round(drawingAlpha * 255));
26826452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
26836452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#endif
26846452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
26851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
26861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
26871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
26881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
26891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
26911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
269313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
269413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
26953f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26973f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
26983f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
26993f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27013f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
27023f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
27033f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2704