Layer.cpp revision c665702cea06c5c42360b7f66fed1693127e6680
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
4390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE    0
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    :   contentDirty(false),
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
72a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mTextureName(-1U),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mName("unnamed"),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFormat(PIXEL_FORMAT_NONE),
7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
80399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
81a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
83933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
84c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
85a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
86d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mBufferLatched(false),
87cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
888cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mPreviousFrameNumber(0),
894d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        mRefreshPending(false),
9082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
935cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mHasSurface(false),
9903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
103a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10504839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos        mUpdateTexImageFailed(false),
10682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
1077bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        mFreezeGeometryUpdates(false)
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Creating Layer %s", name.string());
1119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
113a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
11549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eHidden)
1194125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerHidden;
1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (flags & ISurfaceComposerClient::eOpaque)
1214125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerOpaque;
122231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    if (flags & ISurfaceComposerClient::eSecure)
123231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza        layerFlags |= layer_state_t::eLayerSecure;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eNonPremultiplied)
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mPremultipliedAlpha = false;
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
129f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    mTransactionName = String8("TX - ") + mName;
1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1333dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
134b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
135b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1367bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedFinalCrop = mCurrentState.finalCrop;
1377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mCurrentState.requestedCrop = mCurrentState.crop;
1384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mCurrentState.alpha = 1.0f;
1419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mCurrentState.alpha = 0xFF;
1439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.flags = layerFlags;
1464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
148bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1492f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1502f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1524d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1534d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1546547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    nsecs_t displayPeriod =
1619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1636547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1640a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1650a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1660a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1670a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
168e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
169e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
1703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() {
171bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
172b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer;
173b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer;
1740556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian    BufferQueue::createBufferQueue(&producer, &consumer, true);
1751db73f66624e7d151710483dd58e03eed672f064Robert Carr    mProducer = new MonitoredProducer(producer, mFlinger, this);
176468051e20be19130572231266db306396a56402bIrvel    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this);
177bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
178399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mSurfaceFlingerConsumer->setContentsChangedListener(this);
1794d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mSurfaceFlingerConsumer->setName(mName);
180b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
18163a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    if (mFlinger->isLayerTripleBufferingDisabled()) {
18263a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard        mProducer->setMaxDequeuedBufferCount(2);
18363a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    }
1846905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1858430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
1868430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    updateTransformHint(hw);
187b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
18896f0819f81293076e652792794a961543e6750d7Mathias Agopian
1894d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1908ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos  sp<Client> c(mClientRef.promote());
1918ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    if (c != 0) {
1928ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos        c->detachLayer(this);
1938ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    }
1948ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos
195cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mRemoteSyncPoints) {
196cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        point->setTransactionApplied();
197cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    }
198c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    for (auto& point : mLocalSyncPoints) {
199c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza        point->setFrameAvailable();
200c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
201921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    mFlinger->deleteTextureAsync(mTextureName);
2026547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
203d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
204d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas#ifdef USE_HWC2
205c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    if (!mHwcLayers.empty()) {
206c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        ALOGE("Found stale hardware composer layers when destroying "
207c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu                "surface flinger layer %s", mName.string());
208c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        destroyAllHwcLayers();
209c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
210d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas#endif
21196f0819f81293076e652792794a961543e6750d7Mathias Agopian}
21296f0819f81293076e652792794a961543e6750d7Mathias Agopian
21313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
21513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
21613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
23313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2346b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2356b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2366b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2376b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
238468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
239468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
244a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
249a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
250a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
251a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
252a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
253a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
254a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2556b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
256ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
257a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
258a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
259a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
260a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2616b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2626b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
26399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
264579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
265579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2666b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
269a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
277a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
278a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2834d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2886b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2896b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2906b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
291399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
292399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
293399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
294399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
295399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
296399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
297399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
298c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() {
299c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mCurrentState to mLayersPendingRemoval
300c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
3015edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
3025edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
3035edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
3045edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
305c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu            mFlinger->setTransactionFlags(eTraversalNeeded);
3065edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
3075edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
3085edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
3095edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
310c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    for (const auto& child : mCurrentChildren) {
311c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu        child->onRemovedFromCurrentState();
312c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    }
313c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu}
3143851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
315c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() {
316c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    // the layer is removed from SF mLayersPendingRemoval
317c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu
318c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu    mSurfaceFlingerConsumer->abandon();
3193851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#ifdef USE_HWC2
320d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    destroyAllHwcLayers();
3213851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#endif
3223851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
32648d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
327cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
32813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3321eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
33313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
34013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
34313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
34413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
34813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
34913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
35013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
35103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
35213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
35313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
35713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
35813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
35913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
36013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
36113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3624d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3634d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3644d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3654d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3704d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
371582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
372582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
373b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
374b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
37813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
37913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
38013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
381d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas#ifdef USE_HWC2
382d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
383d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0,
384d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                "Already have a layer for hwcId %d", hwcId);
385d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    HWC2::Layer* layer = hwc->createLayer(hwcId);
386d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (!layer) {
387d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return false;
388d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
389d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    HWCInfo& hwcInfo = mHwcLayers[hwcId];
390d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    hwcInfo.hwc = hwc;
391d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    hwcInfo.layer = layer;
392d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    layer->setLayerDestroyedListener(
393d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            [this, hwcId] (HWC2::Layer* /*layer*/){mHwcLayers.erase(hwcId);});
394d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    return true;
395d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}
396d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
397d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Layer::destroyHwcLayer(int32_t hwcId) {
398d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (mHwcLayers.count(hwcId) == 0) {
399d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return;
400d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
401d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto& hwcInfo = mHwcLayers[hwcId];
402d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr,
403d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            "Attempt to destroy null layer");
404d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
405d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
406d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    // The layer destroyed listener should have cleared the entry from
407d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    // mHwcLayers. Verify that.
408d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0,
409d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            "Stale layer entry in mHwcLayers");
410d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}
411d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
412d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Layer::destroyAllHwcLayers() {
413d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    size_t numLayers = mHwcLayers.size();
414d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    for (size_t i = 0; i < numLayers; ++i) {
415d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed");
416d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        destroyHwcLayer(mHwcLayers.begin()->first);
417d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
418d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(),
419d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            "All hardware composer layers should have been destroyed");
420d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}
421d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas#endif
422d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
423a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
424a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
425a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
426f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
427f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
428a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
429f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
430a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
431a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
432a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
433f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
434a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
4354fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
436f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
437f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
438f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
439f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
440f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
441f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
442f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
443f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
444f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
445f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
446f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
447f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
448f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
449f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
4501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
4521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
4531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
4551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
4561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
4601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
46141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
46241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
46341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
46441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
465e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
4661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
4671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
4711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
4721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
4731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
4741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
4751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
48813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4891eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4906c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4916c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4926c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4936c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4946c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
49513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
496b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
497b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
498b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
49913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
5001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
502e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
5031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
504de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
505de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
506de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
5071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
5081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
5101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
5111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
5121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
5131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
5141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
5151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5166c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
5176c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
51813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
51913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
521b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
52213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
5231eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
52413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
52513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
52613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
5276b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
5286b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
5296b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
5306b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
5310e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
5320e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
533b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
534df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
5350e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
5360e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
5371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
5381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
542b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
543b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
5471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
5481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
5491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5505a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
5511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
5521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
5535a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
5541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
5561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
5571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
5591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
560e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
5611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
5621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
5631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
5641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
5651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
5661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
5671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
56813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
56928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
57028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
57128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
57228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
57328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
57428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
575acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
576acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
577acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
57813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
579f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
580f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
581f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
582acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
583acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
584acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
585acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
586cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
587acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
588021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
589021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
590acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
591021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
593acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
594acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
595acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
596acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
59713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
598acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5990f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
6000f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
601acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
602acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
603acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
604acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
605acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
606acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
607acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
608acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
609acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
610acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
611acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
612acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
613acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
614acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
615acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
616acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
617acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
618acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
619acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
620acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
621acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
62213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
623acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
624acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
625acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
62613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
627acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
628acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
629acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
630acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
631acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
632acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
633acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
634acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
635acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
63613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
63713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
63813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
63913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
6409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
641ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
6429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
6449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
6459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
6469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
647a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
6489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
6519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
6539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
654a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
6553e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
6569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
6579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
6649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
6669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
6679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
6689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
6699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
671dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
67213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
6731eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
6749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
675ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
6766452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
677ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman        blendMode = mPremultipliedAlpha ?
6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
680ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
681ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
682ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             " %s (%d)", mName.string(), to_string(blendMode).c_str(),
683ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             to_string(error).c_str(), static_cast<int32_t>(error));
6849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6856452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 0xFF) {
6869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
69113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
69213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
69313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6946c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
696b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
697b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
700acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
7019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
7039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
704acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
705acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
7061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
70728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
70828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
70928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
71028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
71128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
71228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
713acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
714acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
715acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
7166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
7176c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
7186c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
7196c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
7206c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
7216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
7226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
7236c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
7246c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
7251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
7261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
727b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
728b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
729acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
730acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
731acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
7329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
733acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
734acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
735acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
738ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
739e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
740e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
741e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
742e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
743e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
744e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
745e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
746e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7485a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
750e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
751e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
752e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
753e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
754e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
755e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
756e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
757e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7596452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float alpha = getAlpha();
7606452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
7619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
7626452f12c95e855a96ab8f690f28914cd37de762bRobert Carr            "%s (%d)", mName.string(), alpha, to_string(error).c_str(),
7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
765ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
767ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
7692f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
7702a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
7712a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
772e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
7732a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
7742a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
7752a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
7762a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
7772a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
7782a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
7792a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
7802f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
7812f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
7829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
7849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
7859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
7879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
7889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
7896452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    layer.setPlaneAlpha(getAlpha());
7909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7919f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
79229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
79329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
79429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
79529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
79629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
79729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
79829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
79929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
80029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
8011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
802c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
803cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
804c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
805021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
806021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
807c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
808021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
809021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
810c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
811c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
812c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
813c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
814c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
815cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
816cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
817cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
818cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
819cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
820cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
821cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
822cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
823c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
82429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
82529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
82613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
8279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
8289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
8299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
8309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
8319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
8339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
8349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
8359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                "%s (%d)", mName.string(), to_string(transform).c_str(),
8369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
8379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
8409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
8419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
8429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
8449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
846a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
847a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
8489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
8499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
8509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
8519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
8529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
8539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
8569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
8599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
8609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
8619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
8629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
8639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
8649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
865aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcInfo = mHwcLayers[hwcId];
866aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcLayer = hwcInfo.layer;
8679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
8689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
8699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
8709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
8719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
8729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
8759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
8769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
8779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
8789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
8799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8810f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
8829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
8830f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
8840f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
8850f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
8869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
8879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
8889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
8899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
8910f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8940a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
895aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    if (hwcInfo.forceClientComposition ||
8960a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
8970f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
8989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
8990f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
9000f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
9010f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
9020a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
9030a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
9040a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
905c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
906c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
9070a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
9080a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
9090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
9100a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
9110a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
912c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
913c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
914c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
915c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
916c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
917c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
918c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
919c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
920c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
9210a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
9220a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
9230a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
9240f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
9250f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
9260f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
9270f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
9289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9320f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
933bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
934bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
935bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
936bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
937bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
938bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
939bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
940bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
94106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
9421f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    sp<GraphicBuffer> hwcBuffer;
9431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer,
9441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara            &hwcSlot, &hwcBuffer);
94506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
9460f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
9471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence);
9480f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
9490f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
9500f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
9510f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
9520f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
9539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9549551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter
9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
968ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
9699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
9729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
9809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
9819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
9829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
9839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
9849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
9889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
989dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
9909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
9919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
9929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
993b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
994b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
9959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
9979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
9981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
1000b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1001b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
1002acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
10039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
10049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
10059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
10069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
10079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
10089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
10099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
10109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
10119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
10129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
10139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
10149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
10159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
10169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
10179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
10189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
10199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
10209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
10219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
10229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
10239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
10249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
10259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
10269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
10279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
10289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
10299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
10309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
10319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
10329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
10339d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
10349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
10359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
10369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
10379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
10389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
10399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
10409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
10419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
10429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
10439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
10449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
10459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
10469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
10471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
10489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
10499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
10509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
10519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
10529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
10539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
10549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
10559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
105603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
105713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
105813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
105913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
1062c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1065c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
1066c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
1067c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
106813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
106913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1070c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
1071c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
1072c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
1073c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
1074cae605cd5668f8107e340ad8a672c7f034147401Robert Carrstatic constexpr mat4 inverseOrientation(uint32_t transform) {
1075cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
1076cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
1077cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
1078cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    mat4 tr;
1079cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1080cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
1081cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * rot90;
1082cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1083cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) {
1084cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipH;
1085cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1086cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) {
1087cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipV;
1088cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1089cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    return inverse(tr);
1090cae605cd5668f8107e340ad8a672c7f034147401Robert Carr}
1091cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
10925d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter/*
10935d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter * onDraw will draw the current layer onto the presentable buffer
10945d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter */
1095c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
1096c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
10981c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
10991c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1100a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
1102179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
1103179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
1104179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
1105179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1106179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
1107179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
1108179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1109179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
1110179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
11111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
1112412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        mFlinger->mDrawingState.traverseInZOrder([&](Layer* layer) {
11131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
11141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
11151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
11161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
11174297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
11181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
1119179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
1120179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
1121179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
11221748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
1123179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1126a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
112797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
112897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1129bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1130bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
113197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1132dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1133dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1134dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1135dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1136dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1137dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1138875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1139875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1140dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1141cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1142eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1143cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1144cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1145cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1146bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1147bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1148cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1149cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        if (getTransformToDisplayInverse()) {
1150c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1151c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1152021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1153021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1154c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1155021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1156021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1157cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            mat4 tr = inverseOrientation(transform);
1158cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1159cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            /**
1160cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * TODO(b/36727915): This is basically a hack.
1161cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             *
1162cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * Ensure that regardless of the parent transformation,
1163cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * this buffer is always transformed from native display
1164cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * orientation to display orientation. For example, in the case
1165cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * of a camera where the buffer remains in native orientation,
1166cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * we want the pixels to always be upright.
1167cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             */
1168e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu            sp<Layer> p = mDrawingParent.promote();
1169e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu            if (p != nullptr) {
1170e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu                const auto parentTransform = p->getTransform();
1171cae605cd5668f8107e340ad8a672c7f034147401Robert Carr                tr = tr * inverseOrientation(parentTransform.getOrientation());
1172cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            }
1173c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1174c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1175c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1176c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1177c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1178c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1179cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
118049457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
118149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
118249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
118349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
118449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1185a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1186875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1187a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
11888578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1189875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
119213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1193c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
11941748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1195c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
119613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
119719733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1198c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
119919733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
120019733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
120113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
120213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
120313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
12041748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
12051748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
120613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
120713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1208c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
12098578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
12101eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
121113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1212c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
121313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
121413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
121513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
121613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
121713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
121813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
121913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
122013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
122113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
122213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1223c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
122413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
122513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
122613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1228acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1229acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
12301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1231b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
12321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1233b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1234acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1235acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
12361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1237acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1238acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1239acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1240acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
124113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
12423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
12433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
12443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
12453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
124613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1247875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1248875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1249ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1250ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1251ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1252ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1253ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1255875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
12566452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), getAlpha());
12575d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2
12585d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    engine.setSourceDataSpace(mCurrentState.dataSpace);
12595d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif
12605cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1261875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
12649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
12659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
12669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
12679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
12699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
12729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
12739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
12749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
12759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
12769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
12779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
12789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
12799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
12809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
12819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
12829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
12839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
12849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
12859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1289ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1290ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1291ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1292ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1293ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
12949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1295ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
12969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
12979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
12999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
13009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
13019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
13029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
13039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
13049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
13059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
13069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
13079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
13089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
13099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
13109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
13119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
13129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
13139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
13149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
13159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
13169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
13179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
13181681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
13191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
13201681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
13211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
13221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
13231681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
13241681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
13251681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
13261681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
13271681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
13281681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1329c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1330c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1331c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1332c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1333c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1334c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1335c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1336c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1337c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1338c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1339c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1340c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1341c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1342c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1343cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1344cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1345cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1346cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1347cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1348cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
13497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1350cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
13517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
13521ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
13539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1354c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1355c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1356c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1357c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
13581ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
13591ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
13601ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
13611ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
13621ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
13631ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
13641ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
13651ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
13661ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
13671ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
13681ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
1369fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson    return mQueueItems[0].mFenceTime->getSignalTime() !=
1370fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson            Fence::SIGNAL_TIME_PENDING;
13719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
13729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
13739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
13741ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
13751ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1376cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1377cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1378cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1379cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1380cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
13817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1382cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1383cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1384cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1385cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
13867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
138913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1396ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1397ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1398ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1399ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1400ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1401ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1402ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
14035773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1404a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1405a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1406ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
14075773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
14085773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
14095773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1410ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1411541f22658ab1617c9d12c98684ab40248df8749bRomain Guy        case HAL_PIXEL_FORMAT_RGBA_1010102:
1412dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
14135773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
14145773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1415dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1416ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1417ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
141813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1422acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1437c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1438c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
143913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
14401eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
14411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
144213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
14431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
14443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1445acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
14501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1451acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
14521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
14531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
14541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
14551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1458b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1459b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1460b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1461b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1462b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1464acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1465ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
14661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
14671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
14681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
14691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
14703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
14715cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
147213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
147313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1474ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
14754125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1476a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1477e6fd41d064711395c7d060abacd86d487495530dneo.he    // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the
1478a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1479e6fd41d064711395c7d060abacd86d487495530dneo.he    if ((mSidebandStream == nullptr) && (mActiveBuffer == nullptr)) {
1480a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1481db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1482a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1483a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1484a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
14854125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1486a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1487a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1488231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1489231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1490231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1491231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1492231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1493231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
14947a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
14957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1496a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
14977a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
14987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
14997a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1500b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
150113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1502c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
150313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
150413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
150513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
150613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
150713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
150813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
150913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
151013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
151113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
151213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
151313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
151413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
151513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
151613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
151713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
151813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
151913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
152013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
152113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
152213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
152313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
152413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
152513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
152613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
152713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
152813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
152913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
153013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
153113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
153213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
15337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
15347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
15357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
15367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
15400d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
15410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
15420d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
15430d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
15447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
15467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
15470d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
15483bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
15493bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
15503bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
15510d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
1552cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1553cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1554cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1555cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
15560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
1557cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
15587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
15617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1562f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
1565f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
15667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
156805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
156905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
157005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
157105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
157205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
15737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
1575f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
15767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
157805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
15797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
15807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
15810d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
15827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
15837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
15847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
15857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
15867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
158705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
15907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1592cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1593cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1594cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1595cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1596cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1597cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1598cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1599cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1600cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1601cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1602cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
16037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
16047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
160505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
16067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
16077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
16087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
16097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
16107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1611792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1612792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
16137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
16147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
161505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
16167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
16177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
16187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
16197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
16207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
16217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
16227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
16237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
16247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
16257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
16267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
16277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
16287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
16297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
16307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
16317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1632cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
16331ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1634cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1635cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
16361ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1637cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1638cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
16397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
16407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
16417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
164213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
16431c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
16441c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
16457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
164605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
164705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
16487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
16497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
16507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
16511eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
16531eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
16541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1655a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1656a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1657cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
16589d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
16596905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1660419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1661b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1662419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1663b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1664c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1665c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
16661eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1667b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1668b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1669b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1670b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1671b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1672b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
16731eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
16741eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1675b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1676b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1677b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1678b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1679b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1680b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1681b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1682a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
16832a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
16842a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1685bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
16861eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1688cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
168982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
169082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
16910cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
16929e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
169313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
16940cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
16950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
16960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
16970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
16980cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
16990cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
17000cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
17019e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
17029e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
17039e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
17049e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
17050cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
17060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
17070cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
17080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
17090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
17107bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
17117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
17127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
17137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
17147d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
17157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
17167bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
17177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
17187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
17197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
17207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
17217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
17227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
17237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
17247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
17257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
17267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
17277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
17287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
172982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
173082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
173182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
173282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
173382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
173482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
173582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
173682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
173782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
173813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
173913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
17401eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
174113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
174313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
174413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
17451eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
174613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
174813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
174913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
175013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
17513dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
17523dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
175313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
175413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
175513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1756c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1757c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1758c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1759c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
17601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1761c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1762c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
176313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
176405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
176513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
176805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
176905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1770a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1771a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
177213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
177513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
177613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
177813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
177913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
178082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
17813dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
178213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
178313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
178469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
178569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
178669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
178769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
17883dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
17897bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
17907bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
17917bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
17927bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
17937bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
179482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
179582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
17967bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
179769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
17987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
179913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
180013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
180113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
180282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
18031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
18041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
18051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
18061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
18071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
18091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
18101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
18111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
18131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1815ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
181613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
181813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
181913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
18207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1821db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1822db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1823db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1824db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1825db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1826db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1827db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1828db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1829db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
183013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
183113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
183213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
18331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1834db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1835db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1836db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1837db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1838db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1839db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1840db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1841db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1842db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1843db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1844db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1845db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1846db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1847db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1848db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1849db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1850db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1851db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1852db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1853db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1854db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1855db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1856db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1857db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1858db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1859db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1860db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1861db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1862db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1863db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1864db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1865db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1866db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1867db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1868db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1869db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
187013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
187113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
187213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
187313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
187413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
18757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
187613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
187713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
187813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
18799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
18809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
18819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
18829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
18839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
188413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
188513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
188613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
188713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
18887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
188913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
189013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
189113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
189213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
189313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
18943dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
1895cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr            matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
18967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
189713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
189813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
189913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
190013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
19012ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
19027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
190313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
190413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
190513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
190613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
190713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
190813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
190913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
191013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
191113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
19127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
19137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
191413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
191513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
191613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
191799e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
191899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
19197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (mCurrentState.requestedCrop == crop)
192013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
192113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
192299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
19237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
192499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
192599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
19267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
19277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
19287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
192913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
193013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
193113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
19328d5227b8416b099c884429312daf2d60496fa484Robert Carr
19338d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
19347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (mCurrentState.requestedFinalCrop == crop)
1935acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1936acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
19378d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
19387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
19398d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
19408d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
19417bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
19427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1943acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1944acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1945acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1946acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
194713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1948c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1949c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1950c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1951c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
195282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1953c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1954c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1955c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
19562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
19572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
19582f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
19592f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
19602f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
19612f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
19622f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1963c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1964c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1965c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1966c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1967c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1968c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1969c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
197013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
197113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
197213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
197313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
197413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
19757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
197613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
197713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1978a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1979a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1980bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1981bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1982bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1983bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1984bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1985bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1986bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1987bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1988bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1989bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1990532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1991532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1992532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1993532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
19941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1995e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
19961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
19971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
19981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
20001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
20011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
20020d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer,
20037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
20040d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
20057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
20067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
20077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
20087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
20097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
20100d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
2011792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
20127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
20130d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
20140d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
20150d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle,
20160d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        uint64_t frameNumber) {
20170d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
20180d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
20197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
20207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2021ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
2022ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
2023ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
2024ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
2025ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
2026ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
2027ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
2028ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
2029ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
2030ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
2031ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
2032ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20376b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
2038ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
2039d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
2040d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
2041d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
20426b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
20430eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
20440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
20450eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
20460eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
20476b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
20486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
20490eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
20500eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
20510eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
20520eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
20530eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
20540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
20550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
20560eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
20570eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
20586b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
20596b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2060d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
2061d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
2062d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2063d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
2064d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
20654d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
2066ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
206799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
206899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
20690a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
20703d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
20710a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const CompositorTiming& compositorTiming) {
2072d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
2073d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
207428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
207528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
207628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
207728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
207828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
207928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
208028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
20810a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson                glDoneFence, presentFence, compositorTiming);
208228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
208382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
208428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
208528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
208628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
208782dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
20883d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
20893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
209028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
20913d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
209228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
209328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
209428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
209528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
209628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
209782dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
20983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
20993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
21003d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
210128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
210228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
210328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
21043d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
21053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
21063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
2107d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
210828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
210928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
211028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
211128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
2112d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
2113d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
21149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2115f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
21165ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
21175ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return;
21185ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
21195ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
21203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
2121d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
2122fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson    mReleaseTimeline.updateSignalTimes();
21233d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
21243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
21253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
21268cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    if (mPreviousFrameNumber != 0) {
21278cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mFrameEventHistory.addRelease(mPreviousFrameNumber,
21288cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                dequeueReadyTime, std::move(releaseFenceTime));
21298cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    }
21309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
21319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
21329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
21331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
21341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
2135e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
21361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
21371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
21381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
21391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
21401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
21411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2142da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
21439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
21446452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha() > 0.0f
21459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
21469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
21476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha()
21489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
21499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2150da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
2151da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2152cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
2153cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
2154cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
2155cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
2156cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
2157cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2158cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
2159cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
2160cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
2161cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2162cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
2163cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2164cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
2165cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
2166cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
2167cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
2168cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
2169cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
2170cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
2171cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2172cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2173cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
2174cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
2175cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
2176cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
2177cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2178d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
2179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
21801c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
21811c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2182399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
2183399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
2184399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
218512e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
218612e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
218712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
218812e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
21895bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
21905bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
21915bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
21921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
2193399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
2194399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
21954fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
2196223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
2197223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
219999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
2202223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
2205223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2206223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2207223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
22081ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2209223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2210223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2211223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2212223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2213223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2214223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
22152c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2216223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2217223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2218223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2219223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2220223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2221cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2222223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2223223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2224223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2225223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2226223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2227223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2228223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2229223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2230223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
22317b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
22327b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
22337bf247e2db180da661b18084d50e0b389686fc0cRobert Carr                    mOverrideScalingMode, mFreezeGeometryUpdates);
2234223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2235223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2236223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2237223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2238223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2239223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2240223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2241223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2242223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2243223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2244223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2245063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
22466b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2247223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2248223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2249223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2250223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2251223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2252223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2253223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2254223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2255223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2256223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2257223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2258223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2259223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2260223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2261ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2262223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2263223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2264223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2265223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2266223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2267ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2268223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2269223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2270223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2271223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2272223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2273223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2274223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2275223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2276223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2277223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2278223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2279223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
22806b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2281223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
22826b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
22836b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2284223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2285223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2286ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
22871585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2288223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2289223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2290223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2291223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2292223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2293223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2294d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2295223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
229606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(
229706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            &mActiveBufferSlot);
2298223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2299223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2300223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2301223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2302702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2303d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2304d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2305d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2306d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2307d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2308d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2309d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2310d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
23113d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2312d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
2313fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mReleaseTimeline.updateSignalTimes();
23143d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
23158cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
23168cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRelease(mPreviousFrameNumber,
23178cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    latchTime, std::move(releaseFenceTime));
23188cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
2319d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2320d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2321d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2322223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2323223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2324223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2325223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2326223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2327223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2328223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2329223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2330bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2331bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2332223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2333223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2334223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2335223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2336223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2337223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2338223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2339223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2340223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2341223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2342223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2343223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2344702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2345223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2346223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2347223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2348223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2349223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2350702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2351702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2352223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2353702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2354223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2355223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2356223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2357223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2358cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2359223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2360223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2361223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2362223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2363223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2364223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2365223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2366223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2367223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2368223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2369223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2370223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2371223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2372223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2373223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2374223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2375223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2376223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2377cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2378cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2379223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2380cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2381223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2382223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2383223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2384223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
23851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
23861c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
23874fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
239013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
239113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
239213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
239313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
239413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
239513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
239613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
239703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
239803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
239903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
240013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
240113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
240213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
240313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
240413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
240513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
240613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
240713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
240813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
240913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
241013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
241113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
241213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
241313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
241413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
241513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
241613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
241713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
241813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
241913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
242013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
242113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
242213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
24233e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
24241b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
24251eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
242613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
24273e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
242874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
242913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
243013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
24313e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
243213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
24332ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
243413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2435ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
243613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
243736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    PixelFormat pf = PIXEL_FORMAT_UNKNOWN;
243836c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    const sp<GraphicBuffer>& buffer(getActiveBuffer());
243936c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    if (buffer != NULL) {
244036c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter        pf = buffer->getPixelFormat();
244136c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    }
244213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
244374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2445acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
244613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
244736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter            "dataspace=%s, pixelformat=%s "
24489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
24499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
24509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
24519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
24529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
245313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
24541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
24551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
24561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2457b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2458b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2459b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2460b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
24614125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
246236c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter            dataspaceDetails(getDataSpace()).c_str(), decodePixelFormat(pf).c_str(),
246313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
24643dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
24653dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
246613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
24671b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2468a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2469a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
24701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
24711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
24721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
24731b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2474a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
24751b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
247674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
24771b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2478ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
24796905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2480a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
24816905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
24821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2483bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
24843d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2485bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2486d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2487d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
24889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2489e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2490e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2491e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2492e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2493e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2494e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2495e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2496e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2497e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2498e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2499e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2500e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2501e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2502e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2503e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2504e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2505e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2506e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2507e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2508e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2509e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2510e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2511e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2512e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2513e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2514e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2515e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2516e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2517e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2518e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2519e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2520e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2521e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2522e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2523e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2524e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2525e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2526e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
25275a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
2528e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2529e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2530e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2531e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2532e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2533e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
25349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2535e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2536d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2537d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
253882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
253982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2540d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2541d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
254225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
254325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
25446547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
25456547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
25466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
25476547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2548d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2549d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2550d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2551d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2552d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2553d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2554d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2555d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2556d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2557d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2558d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2559d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
25605ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
25615ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
25625ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
25635ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
25645ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
25653890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
25663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2567d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2568d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
2569fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // If there are any unsignaled fences in the aquire timeline at this
2570fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // point, the previously queued frame hasn't been latched yet. Go ahead
2571fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // and try to get the signal time here so the syscall is taken out of
2572fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // the main thread's critical path.
2573fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        mAcquireTimeline.updateSignalTimes();
2574fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson        // Push the new fence after updating since it's likely still pending.
25753d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2576d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2577d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
257840845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
25793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
25803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2581d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
258240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2583e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2584e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2585e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2586e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2587e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2588e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2589e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2590e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2591e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2592e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2593e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2594e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2595e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2596e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2597367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2598367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2599367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2600367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
260198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
260298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
260398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
260498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
260598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
260698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
260798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
260898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
26091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
26101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
26111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
26121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
26151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
26161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
26171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26191db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
26201db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
26211db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
26221db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
26231db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
26241db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
26251db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
26261db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
26271db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
26281db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
26291db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
26301db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
26311db73f66624e7d151710483dd58e03eed672f064Robert Carr
26321db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
2633e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
26341db73f66624e7d151710483dd58e03eed672f064Robert Carr
26351db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
26361db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
26371db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
26381db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
26391db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
26401db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
26411db73f66624e7d151710483dd58e03eed672f064Robert Carr
26421db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
26431db73f66624e7d151710483dd58e03eed672f064Robert Carr}
26441db73f66624e7d151710483dd58e03eed672f064Robert Carr
26459524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
2646412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) {
26479524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
26489524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
26499524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
26509524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
26519524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
26529524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (client != nullptr) {
26539524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
26549524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
26559524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
26569524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
26579524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
26589524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
26599524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
26601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
2661e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
26621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
26651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
26661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
26671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
26701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
26711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
26721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
26741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
26771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
26781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2680412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector Layer::makeTraversalList(LayerVector::StateSet stateSet) {
2681412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
2682412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
2683412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
2684412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
2685412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
2686412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
2687412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    if (state.zOrderRelatives.size() == 0) {
2688412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        return children;
2689db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2690db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
2691db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2692412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
2693db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
2694db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
2695db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
2696db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
2697db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2698db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2699412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
2700db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
2701db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2702db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2703db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
2704db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
2705db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
27061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
2707db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
27081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
2709412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
2710412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
2711db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
27121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
2713db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
2714db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2715db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
27161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
2717db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
2718412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
27191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2720412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
2721db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
2722db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2723412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
27241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
27251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
27261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
27271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
2728db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
27291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
2730412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
2731412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
2732412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
2733db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
27341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
2735db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (i = list.size()-1; i>=0; i--) {
2736db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2737db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
27381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
27391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
2740412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
27411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2742412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
27431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
2744db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2745412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
27461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
27471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
27481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
27491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
27501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
2751e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
27521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
27531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
27549b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
27559b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
27569b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
27579b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
27589b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
27599b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
27600a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu        if (p->isFixedSize() && p->mActiveBuffer != nullptr) {
27611725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
27621725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
27631725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
27641725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getWidth();
27651725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getHeight();
27661725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
27671725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getWidth();
27681725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getHeight();
27691725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
27709b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            float sx = p->getDrawingState().active.w /
27711725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                    static_cast<float>(bufferWidth);
27729b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            float sy = p->getDrawingState().active.h /
27731725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                    static_cast<float>(bufferHeight);
27749b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
27759b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
27769b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
27779b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
27781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
27791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
27801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
27811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
27826452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#ifdef USE_HWC2
27836452f12c95e855a96ab8f690f28914cd37de762bRobert Carrfloat Layer::getAlpha() const {
2784e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
27856452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
27866452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0;
27876452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return parentAlpha * getDrawingState().alpha;
27886452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
27896452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#else
27906452f12c95e855a96ab8f690f28914cd37de762bRobert Carruint8_t Layer::getAlpha() const {
2791e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
27926452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
27936452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? (p->getAlpha() / 255.0f) : 1.0;
27946452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float drawingAlpha = getDrawingState().alpha / 255.0f;
27956452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    drawingAlpha = drawingAlpha * parentAlpha;
27966452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return static_cast<uint8_t>(std::round(drawingAlpha * 255));
27976452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
27986452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#endif
27996452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
28001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
28011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
28021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
28031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
28041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
28051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
2806e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
28071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
28081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
280913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
281013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
28113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
28143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
28153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
28183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
28193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2820