Layer.cpp revision 2f5f8a51f5994cf14837030d4b3b252a9d1b950b
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
373330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
443e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
477b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
48b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
53875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
54875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
55c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
56c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE    0
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
654d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
6713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    :   contentDirty(false),
6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
70a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mTextureName(-1U),
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mName("unnamed"),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFormat(PIXEL_FORMAT_NONE),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
77a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
78399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
80933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
81c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
83d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mBufferLatched(false),
84cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
85d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mPreviousFrameNumber(-1U),
864d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        mRefreshPending(false),
8782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
8813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
8913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
905cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mHasSurface(false),
9603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
98a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10165476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10204839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos        mUpdateTexImageFailed(false),
10382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mFreezePositionUpdates(false)
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Creating Layer %s", name.string());
1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
110a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
11249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eHidden)
1164125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerHidden;
1174125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (flags & ISurfaceComposerClient::eOpaque)
1184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerOpaque;
119231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    if (flags & ISurfaceComposerClient::eSecure)
120231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza        layerFlags |= layer_state_t::eLayerSecure;
1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eNonPremultiplied)
1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mPremultipliedAlpha = false;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1293dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
130b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
131b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
1339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mCurrentState.alpha = 1.0f;
1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mCurrentState.alpha = 0xFF;
1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.flags = layerFlags;
1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
142bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1432f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1442f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    nsecs_t displayPeriod =
1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1576547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
158e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
159e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
1603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() {
161bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
162b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer;
163b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer;
164468051e20be19130572231266db306396a56402bIrvel    BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true);
165b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    mProducer = new MonitoredProducer(producer, mFlinger);
166468051e20be19130572231266db306396a56402bIrvel    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this);
167bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
168399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mSurfaceFlingerConsumer->setContentsChangedListener(this);
1694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mSurfaceFlingerConsumer->setName(mName);
170b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
17163a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    if (mFlinger->isLayerTripleBufferingDisabled()) {
17263a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard        mProducer->setMaxDequeuedBufferCount(2);
17363a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    }
1746905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1758430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
1768430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    updateTransformHint(hw);
177b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
17896f0819f81293076e652792794a961543e6750d7Mathias Agopian
1794d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1808ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos  sp<Client> c(mClientRef.promote());
1818ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    if (c != 0) {
1828ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos        c->detachLayer(this);
1838ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    }
1848ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos
185cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mRemoteSyncPoints) {
186cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        point->setTransactionApplied();
187cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    }
188c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    for (auto& point : mLocalSyncPoints) {
189c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza        point->setFrameAvailable();
190c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
191921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    mFlinger->deleteTextureAsync(mTextureName);
1926547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
19396f0819f81293076e652792794a961543e6750d7Mathias Agopian}
19496f0819f81293076e652792794a961543e6750d7Mathias Agopian
19513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
19613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
19713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
19813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
21513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2166b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2176b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2186b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2196b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
220468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
221468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
222a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
223a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
224a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
225a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
226a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
227a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2376b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
238ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2446b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
24599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
246579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
247579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2486b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
251a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
259a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
260a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2654d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2706b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2716b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2726b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
273399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
274399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
275399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
276399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
277399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
278399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
279399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2806710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after
2816710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before
2826710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list)
28313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() {
284bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->abandon();
2851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
28848d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
289cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
29013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
29113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
29213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2941eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
29513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
29613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
29913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
30113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
30213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
30313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
30413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
333582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
334582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
335b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
336b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
34013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
343a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
344a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
345a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
346f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
347f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
348a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
349f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
350a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
351a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
352a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
353f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
354a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
3554fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
356f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
357f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
358f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
359f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
360f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
361f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
362f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
363f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
364f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
365f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
366f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
367f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
368f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
369f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
3701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
3711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
3721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
3731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const sp<Layer>& p = getParent();
3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
40413127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4051eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4066c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4076c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4086c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4096c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4106c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
41113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
412b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
413b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
414b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
41513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds = p->computeScreenBounds();
4211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
4261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
4271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
4281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4306c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
4316c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
43213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
43313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
435b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
43613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
4371eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
43813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
43913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
44013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
4416b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
4426b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
4436b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
4446b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
4450e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4460e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
447b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
448b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        activeCrop = s.crop;
4490e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
4500e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
456b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
457b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
4611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrgfx::FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    gfx::FloatRect crop = getContentCrop().toFloatRect();
4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
48213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
48328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
48428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
48528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
48628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
48728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
48828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
489acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
490acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
491acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
49213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
493f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
494f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
495f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
496acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
497acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
498acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
499acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
500acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
501acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
502021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
503021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
505021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
506021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
508acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
509acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
510acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
51113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
512acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5130f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
5140f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
519acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
522acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
523acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
53613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
54013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
55013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
55113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
55213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
55313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
555ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
5569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
5589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
5599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
5609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
561a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
5629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
5649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
5659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
5679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
568a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
5693e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
5709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
5729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
5749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
5759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
5809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
5819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
5829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
5849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
585dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
58613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
5871eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (!isOpaque(s) || s.alpha != 1.0f) {
5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto blendMode = mPremultipliedAlpha ?
5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setBlendMode(blendMode);
5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
5949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                " %s (%d)", mName.string(), to_string(blendMode).c_str(),
5959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
5969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!isOpaque(s) || s.alpha != 0xFF) {
5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
60413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
60513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
60613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6076c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
609b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
610b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
613acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
6149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
6169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
617acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
618acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
62028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
62128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
62228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
62328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
62428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
62528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
626acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
627acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
628acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6296c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
6306c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
6316c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
6326c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
6336c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
6346c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
6356c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
6366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
6376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
6381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
6391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
640b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
641b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
642acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
643acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
644acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
646acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
647acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
648acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setDisplayFrame(transformedFrame);
652e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
653e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
654e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
655e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
656e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
657e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
658e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
659e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
66171bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza    gfx::FloatRect sourceCrop = computeCrop(displayDevice);
6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
663e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
664e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
665e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
666e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
667e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
668e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
669e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
670e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setPlaneAlpha(s.alpha);
6739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
6749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(),
6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
677ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
679ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6812f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
6822f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    error = hwcLayer->setInfo(s.type, s.appId);
6832f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
6842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
6859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
6879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
6889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
6909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
6919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
6929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setPlaneAlpha(s.alpha);
6939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
6949f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
69529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
69629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
69729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
69829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
69929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
70029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
70129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
70229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
70329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
7041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
705c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
706c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
707c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
708021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
709021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
710c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
711021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
712021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
713c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
714c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
715c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
716c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
717c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
718c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // and apply to the current transform
7190f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        transform = Transform(invTransform) * transform;
720c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
72129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
72229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
72313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
7249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
7319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                "%s (%d)", mName.string(), to_string(transform).c_str(),
7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
7379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
7389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
7399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
7409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
7419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
743a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
744a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
7459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
7609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
7619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = mHwcLayers[hwcId].layer;
7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7790f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
7810f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
7820f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
7830f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
7879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
7890f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7920a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
7930a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mHwcLayers[hwcId].forceClientComposition ||
7940a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
7950f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
7970f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
7980f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
7990f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
8000a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
8010a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
8020a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
803c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
804c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
8050a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
8060a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
8070a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
8080a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
810c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
811c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
812c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
813c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
814c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
815c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
816c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
817c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
818c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
8190a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
8200a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
8210a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
8220f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
8230f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
8240f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
8250f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
8269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
8289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
8299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8300f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
831bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
832bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
833bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
834bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
835bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
836bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
837bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
838bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
8390f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
8400f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    error = hwcLayer->setBuffer(mActiveBuffer->handle, acquireFence);
8410f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
8420f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
8430f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
8440f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
8450f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
8499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
8509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
8519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
8529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
8539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
8549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
8559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
8569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
8579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
8589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
8599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
860ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
8619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
8629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
8639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
8659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
8669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
8679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
8709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
8729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
8739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
8749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
8759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
8769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
8779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
8809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
881dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
8829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
8839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
8849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
885b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
886b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
8879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
8899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
8901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
8919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
892b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
893b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
894acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
8959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
8969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
8979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
8999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
9009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
9019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
9029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
9039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
9049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
9079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
9099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
9119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
9129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
9149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
9159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
9169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
9179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
9189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
9199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
9209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
9219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
9239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9259d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
9269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
9279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
9289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
9299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
9309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
9329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
9339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
9349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
9391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
94803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
94913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
95013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
95113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
95213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
95313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
954c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
95513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
95613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
957c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
958c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
959c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
96013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
96113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
962c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
963c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
964c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
965c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
966c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
967c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
9691c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
9701c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
971a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
973179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
974179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
975179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
976179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
977179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
978179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
979179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
980179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
981179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
9821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
9831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) {
9841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
9851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
9861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
9871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
9884297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
9891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
990179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
991179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
992179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
9931748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
994179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
997a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
99897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
99997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1000bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1001bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
100297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1003dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1004dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1005dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1006dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1007dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1008dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1009875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1010875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1011dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1012cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1013eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1014cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1015cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1016cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1017bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1018bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1019cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1020c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
1021c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1022c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1023021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1024021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1025c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1026c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1027c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // create a 4x4 transform matrix from the display transform flags
1028c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
1029c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
1030c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
1031c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1032c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            mat4 tr;
1033021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1034021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1035c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
1036c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * rot90;
1037c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
1038c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * flipH;
1039c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
1040c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * flipV;
1041c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1042c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // calculate the inverse
1043c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            tr = inverse(tr);
1044c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1045c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1046c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1047c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1048c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1049c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1050cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
105149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
105249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
105349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
105449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
105549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1056a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1057875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1058a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
10598578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1060875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1064c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
10651748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1066c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
106713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
106819733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1069c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
107019733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
107119733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
107313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
10751748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
10761748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
107813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1079c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
10808578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
10811eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
108213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1083c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
108413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
108513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
108613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
108713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
108813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
108913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
109013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
109113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
109213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
109313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1094c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
109513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
109613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
109713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
109813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1099acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1100acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
11011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1102b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
11031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1104b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1105acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1106acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
11071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1108acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1109acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1110acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1111acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
111213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
11143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
11153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
11163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1118875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1119875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1120ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1121ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1122ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1123ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1124ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
112513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1126875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
11274125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
11285cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1129875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
113013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
113113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
11339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
11349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
11359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
11379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
11389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
11409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
11419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
11429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
11439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
11449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
11459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
11469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
11479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
11489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
11499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
11509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
11519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
11529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
11539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1157ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1158ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1159ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1160ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1161ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
11629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1163ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
11649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
11659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
11679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
11709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
11729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
11739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
11759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
11789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
11809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
11819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
11839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
11859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11861681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
11871681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
11881681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
11891681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
11901681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
11911681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
11921681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
11931681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
11941681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
11951681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
11961681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1197c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1198c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1199c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1200c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1201c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1202c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1203c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1204c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1205c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1206c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1207c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1208c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1209c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1210c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1211cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1212cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1213cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1214cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1215cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1216cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
12177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1218cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
12197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
12201ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
12219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1222c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1223c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1224c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1225c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
12261ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
12271ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
12281ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12291ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12301ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
12311ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
12321ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
12331ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
12341ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
12351ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12361ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12371ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
12389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
12399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
12409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12411ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
12421ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1243cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1244cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1245cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1246cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1247cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
12487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1249cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1250cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1251cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1252cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
12537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
12547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
125613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1263ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1264ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1265ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1266ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1267ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1268ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1269ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
12705773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1271a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1272a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1273ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
12745773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
12755773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
12765773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1277ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1278dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
12795773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
12805773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1281dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1282ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1283ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
128413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
128513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
128613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1288acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1289acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1290acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1291acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1292acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1293acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1294acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1295acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1296acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1297acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1298acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1299acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1300acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1301acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1302acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1303c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1304c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
130513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
13061eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
13071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
130813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
13091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
13103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1311acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1312acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1313acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1314acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1315acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
13161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1317acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
13191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
13201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
13211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1322acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1323acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1324b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1325b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1326b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1327b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1328b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1329acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1330acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1331ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
13321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
13331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
13341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
13351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
13363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
13375cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1340ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13414125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1342a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1343a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if we don't have a buffer yet, we're translucent regardless of the
1344a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1345db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    if (mActiveBuffer == 0) {
1346a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1347db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1348a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1349a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1350a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
13514125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1352a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1353a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1354231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1355231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1356231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1357231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1358231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1359231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
13607a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
13617a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1362a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
13637a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
13647a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
13657a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1366b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
136713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1368c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
137013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
137113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
137213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
137313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
137513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
137613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
137713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
137813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
137913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
138013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
138113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
138213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
138313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
138413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
138513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
138613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
138713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
138913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
139713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
13997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
14007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
14017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
14027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
14057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
14067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (mCurrentState.handle != nullptr) {
140722851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        sp<IBinder> strongBinder = mCurrentState.handle.promote();
140822851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        sp<Handle> handle = nullptr;
140922851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        sp<Layer> handleLayer = nullptr;
141022851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        if (strongBinder != nullptr) {
141122851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza            handle = static_cast<Handle*>(strongBinder.get());
141222851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza            handleLayer = handle->owner.promote();
141322851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        }
141422851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        if (strongBinder == nullptr || handleLayer == nullptr) {
14157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("[%s] Unable to promote Layer handle", mName.string());
14167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
14177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
14187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
14197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            mCurrentState.handle = nullptr;
14203bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
14213bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
14223bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
1423cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (handleLayer->addSyncPoint(syncPoint)) {
1424cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1425cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1426cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1427cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
1428cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mCurrentState.handle = nullptr;
1429cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
14307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
14317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
14337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1434f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
14357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
14377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
143905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
144005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
144105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
144205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
144305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
14447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
14467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
144805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
14497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
14507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
14517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mPendingStates[0].handle != nullptr) {
14527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
14537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
14547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
14557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
14567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
145705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
14587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
14597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
14607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
14617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1462cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1463cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1464cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1465cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1466cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1467cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1468cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1469cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1470cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1471cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1472cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
14737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
14747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
147505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
14767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1481792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1482792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
14837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
14847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
148505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
14877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
14887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
14917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
14927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
14937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
14947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
14957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
14987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
14997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1502cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
15031ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1504cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1505cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
15061ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1507cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1508cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
151213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
15131c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
15141c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
151605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
151705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15211eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15231eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
15241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1525a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1526a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1527cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
15289d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
15296905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1530419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1531b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1532419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1533b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1534c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1535c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
15361eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1537b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1538b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1539b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1540b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1541b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1542b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
15431eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
15441eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1545b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1546b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1547b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1548b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1549b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1550b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1551b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1552a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
15532a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
15542a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1555bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
15561eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1558cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
155982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
156082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
15610cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
15629e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
156313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
15640cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
15650cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
15660cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
15670cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
15680cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
15690cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
15700cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
15719e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
15729e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
15739e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
15749e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
15750cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
15760cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
15770cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
15780cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
15790cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
158013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always set active to requested, unless we're asked not to
158113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this is used by Layer, which special cases resizes.
158213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (flags & eDontUpdateGeometryState)  {
158313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    } else {
15847d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
158582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        if (mFreezePositionUpdates) {
158682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
158782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
158882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
158982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
159082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
159182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
159282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
159382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
159482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
159513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
159613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
15971eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
159813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
159913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
160013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
160113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16021eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
160313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
160413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
160513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
160613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
160713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
16083dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
16093dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
161013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
161113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
161213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1613c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1614c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1615c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1616c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
16171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1618c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1619c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
162013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
162105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
162213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
162505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
162605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1627a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1628a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
163213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
163313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
163413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
163613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
163782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
16383dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
163913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
164169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
164269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
164369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
164469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
16453dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
164682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    if (immediate && !mFreezePositionUpdates) {
164782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
164882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
164982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
165069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
16517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
165582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
16561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
16571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
16581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
16591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
16601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
16621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
16631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
16661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1668ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
166913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
167013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
167113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
167213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
16737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
167413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
167513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
167613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
167813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
167913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
168013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
16837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
168413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
168513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
168613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
16879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
16889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
16899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
16909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
16919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
169213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
169313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
169413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
169513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
16967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
169713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
169813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
169913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
170113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
17023dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
170313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
17047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
170513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
170613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
170713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
170813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
17092ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
17107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
171113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
171313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
171413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
171513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
171613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
171913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
17207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
17217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
172213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
172313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
172413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
172599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
172699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
1727b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.crop == crop)
172813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
172913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
173099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
173199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    if (immediate) {
173299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
173399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
17347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
173513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
173613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
173713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1738acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosbool Layer::setFinalCrop(const Rect& crop) {
1739b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.finalCrop == crop)
1740acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1741acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
1742b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop = crop;
1743acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1744acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1745acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1746acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1748c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1749c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1750c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1751c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
175282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1753c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1754c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1755c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
17562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
17572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
17582f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
17592f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
17602f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
17612f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
17622f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1763c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1764c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1765c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1766c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1767c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1768c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1769c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
177013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
177113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
177213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
17757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
177613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1778a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1779a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1780bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1781bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1782bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1783bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1784bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1785bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1786bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1787bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1788bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1789bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
17901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
17911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    auto p = getParent();
17921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
17931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
17941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
17961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
17987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::deferTransactionUntil(const sp<IBinder>& handle,
17997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
18007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.handle = handle;
18017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
18027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
18037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
18047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
18057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
1806792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.handle = nullptr;
1807792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
18087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
18097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
18107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1811ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1812ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1813ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1814ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1815ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1816ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1817ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1818ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1819ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1820ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1821ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1822ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18276b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1828ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1829d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1830d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1831d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
18326b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
18330eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
18340eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
18350eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
18360eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
18376b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
18386b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
18390eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18400eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
18410eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
18420eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
18430eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
18440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
18450eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18460eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
18470eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
18486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
18496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
1850d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
1851d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
1852d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
1853d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
1854d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
18554d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
1856ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
185799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
185899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
18593d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Andersonbool Layer::onPostComposition(
18603d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& glDoneFence,
18613d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
18623d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& retireFence) {
18633d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mAcquireTimeline.updateSignalTimes();
18643d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.updateSignalTimes();
18653d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1866d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
1867d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
186828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
186928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
187028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
187128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
187228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
187328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
187428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
18753d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                glDoneFence, presentFence);
187628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addRetire(mPreviousFrameNumber,
187728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard                retireFence);
187828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
187982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
188028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
188128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
188228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
188382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
18843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
18853d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
188628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
18873d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
188828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
188928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
189028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
189128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
189228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
189382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
18943d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
18953d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
18963d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
18973d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    } else if (retireFence->isValid()) {
18983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
18993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(retireFence));
190028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
190128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
190228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
19033d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
19043d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
19053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
1906d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
190728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
190828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
190928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
191028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
1911d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
1912d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
19139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1914f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
19159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->releasePendingBuffer();
19163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
1917d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
19183d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
19193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
19203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
19213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mFrameEventHistory.addRelease(
1922f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson            mPreviousFrameNumber, dequeueReadyTime, std::move(releaseFenceTime));
19239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
19249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
19259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
19261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
19271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
19281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& parent = getParent();
19291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
19301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
19311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
19331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1935da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
193613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const Layer::State& s(mDrawingState);
19379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
19381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return !(isHiddenByPolicy()) && s.alpha > 0.0f
19399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
19411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return !(isHiddenByPolicy()) && s.alpha
19429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1944da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
1945da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
1946cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
1947cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
1948cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
1949cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
1950cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
1951cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1952cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
1953cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
1954cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
1955cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
1956cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
1957cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1958cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
1959cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
1960cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
1961cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
1962cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
1963cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
1964cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
1965cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
1966cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1967cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
1968cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
1969cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
1970cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
1971cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1972d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
19741c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
19751c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1976399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
1977399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
1978399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
197912e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
198012e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
198112e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
198212e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
19835bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
19845bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
19855bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
19861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
1987399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
1988399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
19894fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
1990223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
1991223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
1992223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
199399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
1994223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
1995223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
1996223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
1997223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
1998223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
1999223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2000223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2001223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20021ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2003223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2004223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2005223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2006223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2007223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2008223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20092c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2010223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2011223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2012223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2013223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2014223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2015cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2016223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2017223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2018223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2019223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2020223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2021223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2022223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2023223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2024223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
20257b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
20267b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
20277b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    mOverrideScalingMode, mFreezePositionUpdates);
2028223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2029223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2030223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2031223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2032223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2033223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2034223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2035223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2036223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2037223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2038223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2039063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
20406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2041223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2042223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2043223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2044223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2045223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2046223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2047223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2048223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2049223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2050223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2051223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2052223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2053223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2054223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2055ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2056223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2057223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2058223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2059223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2060223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2061ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2062223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2063223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2064223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2065223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2066223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2067223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2068223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2069223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2070223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2071223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2072223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2073223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
20746b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2075223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
20766b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
20776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2078223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2079223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2080ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
20811585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2082223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2083223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2084223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2085223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2086223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2087223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2088d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2089223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
2090223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer();
2091223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2092223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2093223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2094223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2095702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2096d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2097d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2098d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2099d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2100d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2101d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2102d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2103d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
21043d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2105d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
21063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
21073d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameEventHistory.addRelease(
2108f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson                mPreviousFrameNumber, latchTime, std::move(releaseFenceTime));
2109d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2110d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2111d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2115223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2116223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2118223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2119223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2120bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2121bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2125223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2127223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2128223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2130223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2131223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2132223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2133223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2134702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2135223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2136223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2137223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2138223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2139223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2140702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2141702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2142223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2143702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2145223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2146223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2147223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2148cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2149223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2150223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2151223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2152223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2161223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2165223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2167cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2168cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2170cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2174223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
21751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
21761c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
21774fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
218013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
218113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
218213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
218313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
218413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
218513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
218613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
218703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
218803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
218903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
219013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
219113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
219213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
219313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
219413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
219513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
219613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
219713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
219813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
219913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
220013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
220113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
220213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
220313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
220413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
220513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
220613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
220713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
220813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
220913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
221013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
221113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
221213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22133e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
22141b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
22151eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
221613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22173e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
221874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
221913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
222013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
22213e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
222213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22232ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
222413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2225ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
222613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
222713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
222874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2229acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2230acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
223113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
22329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
22339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
22359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
223713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
22381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
22391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
22401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2241b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2242b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2243b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2244b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
22454125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
224613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
22473dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
22483dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
224913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
22501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2251a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2252a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
22531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
22541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
22551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
22561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2257a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
22581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
225974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
22601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2261ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
22626905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2263a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
22646905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
22651b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2266bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
22673d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2268bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2269d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2270d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
22719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2272e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2273e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2274e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2275e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2276e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2277e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2278e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2279e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2280e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2281e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2282e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2283e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2284e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2285e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2286e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2287e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2288e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2289e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2290e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2291e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2292e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2293e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2294e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2295e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2296e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2297e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2298e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2299e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2300e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2301e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2302e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2303e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2304e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2305e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2306e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2307e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2308e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2309e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
231071bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza    const gfx::FloatRect& crop = hwcInfo.sourceCrop;
2311e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2312e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2313e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2314e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2315e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2316e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
23179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2318e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2319d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2320d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
232182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
232282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2323d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2324d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
232525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
232625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
23276547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
23286547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
23296547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
23306547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2331d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2332d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2333d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2334d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2335d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2336d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2337d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2338d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2339d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2340d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2341d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2342d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
23433890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
23443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2345d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2346d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
23473d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2348d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2349d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
235040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
23513890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
23523890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2353d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
235440845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2355e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2356e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2357e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2358e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2359e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2360e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2361e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2362e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2363e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2364e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2365e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2366e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2367e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2368e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2369367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2370367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2371367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2372367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
23731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
23741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
23751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
23761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
23771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
23781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
23791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
23801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
23811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
23821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
23831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
23841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mParent = layer;
23851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
23861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
23871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
23881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
23891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
23901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
23911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
23921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
23931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
23941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
23951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
23961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
23971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
23981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
23991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
24001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
24011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
24041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Negatively signed children are before 'this' in Z-order.
24051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
24061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) {
24071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
24081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
24091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() >= 0)
24111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
24121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
24131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
24151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
24161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
24181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
24221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Positively signed children are before 'this' in reverse Z-order.
24231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
24241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) {
24251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
24261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (i = mDrawingChildren.size()-1; i>=0; i--) {
24271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() < 0) {
24291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
24301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
24311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
24321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
24341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
24351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
24371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
24411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
24421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
24431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
24441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
24451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
24471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
24501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
24511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
24521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
24531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
24551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
245713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
245813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
24593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
24623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
24633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
24663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
24673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2468