Layer.cpp revision df7867f3f488222f3708fb00415fbf0fcf74eb97
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);
20396f0819f81293076e652792794a961543e6750d7Mathias Agopian}
20496f0819f81293076e652792794a961543e6750d7Mathias Agopian
20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
20713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
22513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2266b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2276b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2286b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2296b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
230468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
231468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
244a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2476b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
248ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
249a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
250a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
251a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
252a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2536b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2546b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
25599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
256579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
257579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2586b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
261a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
269a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
270a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2754d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2806b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2816b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2826b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
283399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
284399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
285399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
286399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
287399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
288399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
289399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2906710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after
2916710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before
2926710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list)
29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() {
2945edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
2955edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
2965edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        if (strongRelative != nullptr) {
2975edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr            strongRelative->removeZOrderRelative(this);
2985edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        }
2995edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
3005edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr    }
3015edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr
302bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->abandon();
3033851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
3043851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#ifdef USE_HWC2
3053851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu    clearHwcLayers();
3063851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#endif
3073851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu
3081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
3091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
3101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
31148d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
312cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3171eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
32813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
33213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
33313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
34013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
34313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
34413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3524d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3534d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3544d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3554d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
356582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
357582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
358b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
359b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
36313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
36413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
36513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
366a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
367a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
368a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
369f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
370f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
371a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
373a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
374a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
375a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
376f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
377a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
3784fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
379f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
380f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
381f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
382f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
383f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
384f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
385f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
386f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
387f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
388f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
389f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
390f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
391f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
392f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
40441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    if (!s.finalCrop.isEmpty()) {
40541b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr        win.intersect(s.finalCrop, &win);
40641b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr    }
40741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr
408e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const sp<Layer>& p = mDrawingParent.promote();
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
4201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
4211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
4241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
4251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
4261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
43113127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4321eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4336c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4346c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4356c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4366c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
43813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
439b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
440b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
441b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
44213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
4431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
445e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
4461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
447de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
448de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
449de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
4501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
4551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
4561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
4571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4596c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
4606c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
46113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
46213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
464b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
46513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
4661eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
46713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
46813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
46913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
4706b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
4716b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
4726b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
4736b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
4740e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4750e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
476b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
477df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu        activeCrop.intersect(s.crop, &activeCrop);
4780e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
4790e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
482acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
483acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
484acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
485b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
486b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
487acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
488acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
489acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
4901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4935a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4965a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
4971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
5001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
5011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
5021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
503e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
5041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
5051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
5061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
5071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
5081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
5091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
5101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
51113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
51228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
51328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
51428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
51528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
51628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
51728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
519acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
52113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
522f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
523f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
524f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
529cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
531021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
532021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
534021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
535021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
54013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5420f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
5430f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
553acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
557acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
558acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
559acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
560acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
561acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
562acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
563acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
564acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
56513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
566acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
567acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
568acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
56913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
570acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
571acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
572acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
573acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
574acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
575acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
576acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
577acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
578acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
57913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
58013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
58113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
58213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
584ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
5859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
5879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
5899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
590a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
5919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
5949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
597a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
5983e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
6009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
6019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
6039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
6049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
6079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
6099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
6109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
6119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
6129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
614dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
61513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
6161eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
6179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
618ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
6196452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
620ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman        blendMode = mPremultipliedAlpha ?
6219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
6229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
623ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
624ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
625ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             " %s (%d)", mName.string(), to_string(blendMode).c_str(),
626ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             to_string(error).c_str(), static_cast<int32_t>(error));
6279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6286452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 0xFF) {
6299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
63413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
63513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
63613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
639b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
640b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
643acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
6449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
6469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
647acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
648acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
65028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
65128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
65228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
65328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
65428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
65528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
656acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
657acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
658acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6596c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
6606c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
6616c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
6626c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
6636c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
6646c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
6656c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
6666c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
6676c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
6681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
6691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
670b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
671b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
672acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
673acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
674acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
676acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
677acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
678acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
681ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
682e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
683e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
684e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
685e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
686e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
687e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
688e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
689e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6915a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
693e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
694e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
695e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
696e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
697e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
698e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
699e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
700e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
7019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7026452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float alpha = getAlpha();
7036452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
7049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
7056452f12c95e855a96ab8f690f28914cd37de762bRobert Carr            "%s (%d)", mName.string(), alpha, to_string(error).c_str(),
7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
708ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
710ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
7119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
7122f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
7132a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int type = s.type;
7142a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    int appId = s.appId;
715e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    sp<Layer> parent = mDrawingParent.promote();
7162a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    if (parent.get()) {
7172a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        auto& parentState = parent->getDrawingState();
7182a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        type = parentState.type;
7192a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk        appId = parentState.appId;
7202a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    }
7212a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk
7222a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk    error = hwcLayer->setInfo(type, appId);
7232f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
7242f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
7259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
7279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
7289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
7309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
7319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
7326452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    layer.setPlaneAlpha(getAlpha());
7339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7349f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
73529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
73629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
73729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
73829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
73929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
74029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
74129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
74229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
74329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
7441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
745c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
746cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
747c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
748021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
749021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
750c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
751021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
752021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
753c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
754c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
755c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
756c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
757c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
758cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
759cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
760cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
761cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
762cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
763cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
764cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
765cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
766c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
76729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
76829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
76913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
7709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                "%s (%d)", mName.string(), to_string(transform).c_str(),
7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
7839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
7849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
7859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
7869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
7879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
789a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
790a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
7919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
8029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
8039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
8059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
8069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
8079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
808aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcInfo = mHwcLayers[hwcId];
809aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcLayer = hwcInfo.layer;
8109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
8119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
8129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
8139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
8149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
8159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
8189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
8199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
8209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
8219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
8229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8240f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
8259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
8260f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
8270f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
8280f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
8299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
8309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
8319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
8329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
8340f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8370a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
838aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    if (hwcInfo.forceClientComposition ||
8390a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
8400f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
8419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
8420f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8430f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8440f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
8450a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
8460a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
8470a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
848c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
849c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
8500a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
8510a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
8520a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
8530a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8540a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
855c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
856c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
857c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
858c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
859c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
860c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
861c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
862c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
863c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
8640a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
8650a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
8660a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
8670f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
8680f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
8690f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
8700f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
8719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
8739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
8749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8750f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
876bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
877bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
878bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
879bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
880bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
881bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
882bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
883bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
88406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
8851f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    sp<GraphicBuffer> hwcBuffer;
8861f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer,
8871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara            &hwcSlot, &hwcBuffer);
88806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
8890f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
8901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence);
8910f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
8920f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
8930f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
8940f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
8950f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8979551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter
8989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
9009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
9029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
9039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
9049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
9059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
9069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
9079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
9089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
9099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
9109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
911ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
9129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
9139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
9149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
9159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
9169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
9179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
9189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
9239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
9249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
9279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
932dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
9339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
9349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
9359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
936b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
937b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
9389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
9409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
9411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
943b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
944b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
945acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
9469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
9479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
9489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
9509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
9519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
9529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
9539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
9549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
9559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
9699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
9729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
9789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
9799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
9809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
9819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
9839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
9849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
9859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
9869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
9879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
9899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
9901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
9929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
9939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
9949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
9969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
9979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
99903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
100013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
100113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
100213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
100313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
100413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
1005c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
100613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
100713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1008c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
1009c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
1010c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
101113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
101213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1013c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
1014c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
1015c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
1016c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
1017cae605cd5668f8107e340ad8a672c7f034147401Robert Carrstatic constexpr mat4 inverseOrientation(uint32_t transform) {
1018cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
1019cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
1020cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
1021cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    mat4 tr;
1022cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1023cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
1024cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * rot90;
1025cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1026cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) {
1027cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipH;
1028cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1029cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) {
1030cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipV;
1031cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1032cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    return inverse(tr);
1033cae605cd5668f8107e340ad8a672c7f034147401Robert Carr}
1034cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
10355d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter/*
10365d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter * onDraw will draw the current layer onto the presentable buffer
10375d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter */
1038c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
1039c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
10411c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
10421c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1043a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
1045179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
1046179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
1047179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
1048179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1049179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
1050179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
1051179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1052179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
1053179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
10541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
1055412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        mFlinger->mDrawingState.traverseInZOrder([&](Layer* layer) {
10561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
10571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
10581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
10591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
10604297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
10611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
1062179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
1063179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
1064179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
10651748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
1066179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1069a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
107097eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
107197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1072bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1073bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
107497eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1075dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1076dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1077dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1078dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1079dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1080dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1081875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1082875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1083dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1084cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1085eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1086cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1087cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1088cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1089bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1090bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1091cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1092cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        if (getTransformToDisplayInverse()) {
1093c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1094c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1095021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1096021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1097c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1098021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1099021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1100cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            mat4 tr = inverseOrientation(transform);
1101cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1102cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            /**
1103cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * TODO(b/36727915): This is basically a hack.
1104cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             *
1105cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * Ensure that regardless of the parent transformation,
1106cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * this buffer is always transformed from native display
1107cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * orientation to display orientation. For example, in the case
1108cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * of a camera where the buffer remains in native orientation,
1109cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * we want the pixels to always be upright.
1110cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             */
1111e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu            sp<Layer> p = mDrawingParent.promote();
1112e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu            if (p != nullptr) {
1113e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu                const auto parentTransform = p->getTransform();
1114cae605cd5668f8107e340ad8a672c7f034147401Robert Carr                tr = tr * inverseOrientation(parentTransform.getOrientation());
1115cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            }
1116c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1117c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1118c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1119c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1120c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1121c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1122cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
112349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
112449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
112549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
112649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
112749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1128a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1129875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1130a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
11318578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1132875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1136c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
11371748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1138c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
113913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
114019733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1141c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
114219733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
114319733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
114413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
114513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
114613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
11471748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
11481748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
114913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
115013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1151c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
11528578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
11531eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
115413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1155c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
115613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
115713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
115813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
115913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
116013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
116113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
116213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
116313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
116413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
116513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1166c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
116713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
116813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
116913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
117013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1171acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1172acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
11731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1174b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
11751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1176b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1177acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1178acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
11791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1180acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1181acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1182acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1183acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
118413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11853f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
11863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
11873f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
11883f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
118913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1190875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1191875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1192ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1193ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1194ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1195ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1196ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
119713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1198875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
11996452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), getAlpha());
12005d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2
12015d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    engine.setSourceDataSpace(mCurrentState.dataSpace);
12025d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif
12035cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1204875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
120513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
120613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
12079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
12089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
12099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
12109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
12129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
12169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
12179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
12189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
12199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
12209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
12219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
12229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
12239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
12249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
12259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
12269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
12279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
12289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1232ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1233ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1234ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1235ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1236ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
12379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1238ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
12399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
12409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
12429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
12459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
12479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
12509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
12539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
12559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
12569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
12589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12611681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
12621681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
12631681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
12641681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
12651681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
12661681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
12671681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
12681681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
12691681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
12701681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
12711681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1272c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1273c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1274c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1275c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1276c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1277c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1278c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1279c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1280c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1281c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1282c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1283c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1284c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1285c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1286cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1287cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1288cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1289cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1290cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1291cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
12927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1293cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
12947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
12951ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
12969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1297c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1298c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1299c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1300c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
13011ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
13021ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
13031ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
13041ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
13051ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
13061ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
13071ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
13081ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
13091ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
13101ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
13111ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
13121ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
13139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
13149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
13159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
13161ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
13171ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1318cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1319cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1320cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1321cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1322cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
13237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1324cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1325cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1326cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1327cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
13287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
133013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
133113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
133313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
133413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
133513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
133613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
133713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1338ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1339ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1340ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1341ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1342ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1343ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1344ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13455773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1346a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1347a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1348ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
13495773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
13505773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
13515773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1352ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1353541f22658ab1617c9d12c98684ab40248df8749bRomain Guy        case HAL_PIXEL_FORMAT_RGBA_1010102:
1354dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
13555773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
13565773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1357dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1358ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1359ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
136013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
136113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
136313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1364acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1366acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1367acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1368acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1370acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1371acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1372acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1373acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1374acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1375acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1376acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1377acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1378acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1379c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1380c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
138113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
13821eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
13831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
138413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
13851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
13863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1387acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1388acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1389acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1390acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1391acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
13921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1393acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
13941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
13951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
13961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
13971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1398acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1399acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1400b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1401b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1402b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1403b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1404b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1405acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1406acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1407ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
14081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
14091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
14101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
14111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
14123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
14135cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
141413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
141513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1416ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
14174125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1418a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1419e6fd41d064711395c7d060abacd86d487495530dneo.he    // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the
1420a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1421e6fd41d064711395c7d060abacd86d487495530dneo.he    if ((mSidebandStream == nullptr) && (mActiveBuffer == nullptr)) {
1422a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1423db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1424a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1425a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1426a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
14274125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1428a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1429a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1430231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1431231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1432231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1433231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1434231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1435231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
14367a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
14377a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1438a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
14397a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
14407a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
14417a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1442b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
144313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1444c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
144613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
144713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
144813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
144913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
145013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
145113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
145213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
145313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
145413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
145513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
145613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
145713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
145813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
145913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
146013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
146113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
146213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
146313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
146413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
146513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
146613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
146713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
146813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
146913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
147013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
147113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
147213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
147313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
147413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
14757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
14767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
14817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
14820d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
14830d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
14840d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
14850d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
14877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
14887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
14890d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
14903bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
14913bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
14923bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
14930d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
1494cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1495cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1496cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1497cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
14980d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
1499cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
15007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
15037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1504f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
1507f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
15087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
151005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
151105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
151205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
151305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
151405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
1517f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza    ATRACE_INT(mTransactionName.string(), mPendingStates.size());
15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
152005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
15227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
15230d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
15257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
15267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
15277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
152905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
15327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1534cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1535cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1536cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1537cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1538cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1539cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1540cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1541cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1542cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1543cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1544cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
15467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
154705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
15517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
15527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1553792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1554792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
15557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
155705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
15587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
15597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
15637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
15647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
15657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
15667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
15707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
15717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1574cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
15751ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1576cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1577cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
15781ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1579cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1580cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
15817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
158413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
15851c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
15861c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
15877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
158805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
158905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
15907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
15917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15931eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15951eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
15961eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1597a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1598a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1599cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
16009d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
16016905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1602419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1603b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1604419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1605b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1606c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1607c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
16081eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1609b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1610b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1611b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1612b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1613b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1614b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
16151eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
16161eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1617b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1618b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1619b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1620b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1621b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1622b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1623b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1624a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
16252a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
16262a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1627bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
16281eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1630cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
163182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
163282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
16330cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
16349e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
16360cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
16370cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
16380cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
16390cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
16400cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
16410cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
16420cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
16439e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
16449e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
16459e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
16469e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
16470cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
16480cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
16490cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
16500cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
16510cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
16527bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // Here we apply various requested geometry states, depending on our
16537bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // latching configuration. See Layer.h for a detailed discussion of
16547bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    // how geometry latching is controlled.
16557bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (!(flags & eDontUpdateGeometryState)) {
16567d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
16577bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
16587bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
16597bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // mode, which causes attributes which normally latch regardless of scaling mode,
16607bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to be delayed. We copy the requested state to the active state making sure
16617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // to respect these rules (again see Layer.h for a detailed discussion).
16627bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
16637bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // There is an awkward asymmetry in the handling of the crop states in the position
16647bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // states, as can be seen below. Largely this arises from position and transform
16657bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // being stored in the same data structure while having different latching rules.
16667bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
16677bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        //
16687bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Careful that "c" and editCurrentState may not begin as equivalent due to
16697bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // applyPendingStates in the presence of deferred transactions.
16707bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        if (mFreezeGeometryUpdates) {
167182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
167282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
167382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
167482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
167582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
167682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
167782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
167882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
167982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
168013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16821eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
168313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
168413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
168513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
168613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16871eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
168813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
168913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
169013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
169113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
169213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
16933dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
16943dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
169513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
169613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
169713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1698c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1699c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1700c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1701c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
17021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1703c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1704c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
170513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
170605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
170713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
171005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
171105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1712a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1713a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
171413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
171513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
171613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
171913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
172013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
172113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
172282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
17233dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
172413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
172513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
172669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
172769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
172869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
172969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
17303dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
17317bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
17327bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // Here we directly update the active state
17337bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // unlike other setters, because we store it within
17347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // the transform, but use different latching rules.
17357bf247e2db180da661b18084d50e0b389686fc0cRobert Carr        // b/38182305
173682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
173782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
17387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
173969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
17407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
174113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
174313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
174482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
17451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
17461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
17471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
17481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
17491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
17511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
17521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
17531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
17551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1757ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
175813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
175913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
176013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
176113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
17627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
1763db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1764db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    // Discard all relative layering.
1765db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (mCurrentState.zOrderRelativeOf != nullptr) {
1766db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1767db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
1768db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            strongRelative->removeZOrderRelative(this);
1769db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
1770db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        mCurrentState.zOrderRelativeOf = nullptr;
1771db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
177213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1776db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) {
1777db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.remove(relative);
1778db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1779db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1780db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1781db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1782db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1783db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) {
1784db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelatives.add(relative);
1785db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1786db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1787db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1788db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1789db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1790db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
1791db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1792db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (handle == nullptr) {
1793db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1794db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1795db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    sp<Layer> relative = handle->owner.promote();
1796db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    if (relative == nullptr) {
1797db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        return false;
1798db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
1799db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1800db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.sequence++;
1801db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.modified = true;
1802db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.z = z;
1803db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1804db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    mCurrentState.zOrderRelativeOf = relative;
1805db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    relative->addZOrderRelative(this);
1806db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1807db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    setTransactionFlags(eTransactionNeeded);
1808db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
1809db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return true;
1810db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
1811db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
181213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
181313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
181413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
181513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
181613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
18177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
181813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
181913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
182013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
18219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
18229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
18239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
18249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
18259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
182613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
182713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
182813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
182913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
18307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
183113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
183213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
183313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
183413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
183513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
18363dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
1837cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr            matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
18387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
183913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
184013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
184113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
184213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
18432ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
18447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
184513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
184613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
184713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
184813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
184913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
185013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
185113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
185213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
185313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
18547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
18557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
185613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
185713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
185813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
185999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
186099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
18617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (mCurrentState.requestedCrop == crop)
186213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
186313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
186499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
18657bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
186699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
186799e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
18687bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
18697bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
18707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
187113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
187213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
187313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
18748d5227b8416b099c884429312daf2d60496fa484Robert Carr
18758d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
18767bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (mCurrentState.requestedFinalCrop == crop)
1877acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1878acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
18798d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
18807bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    if (immediate && !mFreezeGeometryUpdates) {
18818d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
18828d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
18837bf247e2db180da661b18084d50e0b389686fc0cRobert Carr    mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
18847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr
1885acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1886acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1887acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1888acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
188913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1890c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1891c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1892c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1893c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
189482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1895c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1896c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1897c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
18982f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
18992f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
19002f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
19012f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
19022f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
19032f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
19042f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1905c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1906c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1907c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1908c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1909c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1910c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1911c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
191213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
191313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
191413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
191513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
191613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
19177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
191813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
191913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1920a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1921a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1922bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1923bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1924bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1925bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1926bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1927bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1928bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1929bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1930bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1931bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
1932532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
1933532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter    return mCurrentState.dataSpace;
1934532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter}
1935532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter
19361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
1937e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    auto p = mDrawingParent.promote();
19381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
19391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
19401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
19421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
19440d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer,
19457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
19460d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
19477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
19487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
19497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
19507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
19517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
19520d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1953792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
19547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
19550d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
19560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
19570d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle,
19580d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        uint64_t frameNumber) {
19590d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
19600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
19617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
19627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1963ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1964ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1965ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1966ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1967ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1968ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1969ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1970ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1971ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1972ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1973ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1974ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19796b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1980ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1981d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1982d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1983d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
19846b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
19850eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
19860eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
19870eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
19880eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
19896b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
19906b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
19910eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
19920eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
19930eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
19940eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
19950eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
19960eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
19970eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
19980eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
19990eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
20006b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
20016b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2002d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
2003d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
2004d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2005d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
2006d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
20074d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
2008ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
200999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
201099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
20110a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
20123d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
20130a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const CompositorTiming& compositorTiming) {
20143d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mAcquireTimeline.updateSignalTimes();
20153d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.updateSignalTimes();
20163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2017d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
2018d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
201928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
202028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
202128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
202228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
202328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
202428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
202528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
20260a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson                glDoneFence, presentFence, compositorTiming);
202728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
202882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
202928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
203028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
203128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
203282dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
20333d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
20343d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
203528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
20363d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
203728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
203828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
203928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
204028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
204128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
204282dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
20433d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
20443d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
20453d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
204628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
204728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
204828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
20493d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
20503d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
20513d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
2052d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
205328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
205428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
205528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
205628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
2057d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
2058d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
20599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2060f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
20615ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
20625ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return;
20635ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
20645ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
20653d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
2066d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
20673d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
20683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
20693d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
20708cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    if (mPreviousFrameNumber != 0) {
20718cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mFrameEventHistory.addRelease(mPreviousFrameNumber,
20728cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                dequeueReadyTime, std::move(releaseFenceTime));
20738cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    }
20749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
20759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
20769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
20771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
20781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
2079e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& parent = mDrawingParent.promote();
20801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
20811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
20821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
20831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
20841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
20851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2086da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
20879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
20886452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha() > 0.0f
20899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
20909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
20916452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha()
20929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
20939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2094da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
2095da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2096cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
2097cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
2098cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
2099cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
2100cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
2101cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2102cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
2103cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
2104cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
2105cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2106cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
2107cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2108cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
2109cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
2110cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
2111cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
2112cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
2113cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
2114cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
2115cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2116cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2117cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
2118cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
2119cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
2120cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
2121cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2122d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
2123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
21241c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
21251c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2126399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
2127399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
2128399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
212912e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
213012e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
213112e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
213212e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
21335bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
21345bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
21355bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
21361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
2137399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
2138399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
21394fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
2140223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
2141223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2142223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
214399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
2145223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
2146223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
2147223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
2148223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
2149223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2150223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2151223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
21521ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
21592c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2161223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2165cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2167223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2174223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
21757b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
21767b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
21777bf247e2db180da661b18084d50e0b389686fc0cRobert Carr                    mOverrideScalingMode, mFreezeGeometryUpdates);
2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2179223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2180223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2181223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2182223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2183223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2185223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2186223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2187223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2188223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2189063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
21906b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2193223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2194223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2195223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2196223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2197223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2202223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2205ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2206223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2207223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2208223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2209223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2210223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2211ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2212223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2213223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2214223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2215223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2216223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2217223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2218223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2219223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2220223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2221223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2222223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2223223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
22246b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2225223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
22266b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
22276b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2228223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2229223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2230ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
22311585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2232223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2233223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2234223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2235223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2236223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2237223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2238d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2239223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
224006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(
224106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            &mActiveBufferSlot);
2242223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2243223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2244223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2245223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2246702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2247d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2248d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2249d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2250d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2251d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2252d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2253d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2254d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
22553d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2256d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
22573d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
22588cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
22598cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRelease(mPreviousFrameNumber,
22608cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    latchTime, std::move(releaseFenceTime));
22618cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
2262d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2263d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2264d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2265223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2266223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2267223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2268223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2269223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2270223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2271223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2272223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2273bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2274bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2275223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2276223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2277223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2278223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2279223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2280223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2281223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2282223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2283223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2284223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2285223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2286223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2287702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2288223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2289223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2290223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2291223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2292223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2293702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2294702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2295223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2296702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2297223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2298223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2299223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2300223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2301cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2302223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2303223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2304223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2305223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2306223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2307223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2308223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2309223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2310223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2311223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2312223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2313223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2314223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2315223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2316223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2317223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2318223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2319223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2320cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2321cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2322223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2323cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2324223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2325223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2326223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2327223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
23281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
23291c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
23304fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
233313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
233413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
233513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
233613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
233713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
233813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
233913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
234003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
234103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
234203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
234313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
234413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
234513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
234613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
234713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
234813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
234913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
235013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
235113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
235213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
235313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
235413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
235513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
235613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
235713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
235813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
235913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
236013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
236113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
236213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
236313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
236413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
236513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
23663e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
23671b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
23681eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
236913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
23703e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
237174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
237213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
237313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
23743e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
237513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
23762ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
237713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2378ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
237913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
238036c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    PixelFormat pf = PIXEL_FORMAT_UNKNOWN;
238136c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    const sp<GraphicBuffer>& buffer(getActiveBuffer());
238236c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    if (buffer != NULL) {
238336c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter        pf = buffer->getPixelFormat();
238436c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter    }
238513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
238674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2387acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2388acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
238913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
239036c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter            "dataspace=%s, pixelformat=%s "
23919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
23929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
23939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
23949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
23959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
239613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
23971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
23981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
23991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2400b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2401b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2402b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2403b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
24044125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
240536c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter            dataspaceDetails(getDataSpace()).c_str(), decodePixelFormat(pf).c_str(),
240613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
24073dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
24083dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
240913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
24101b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2411a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2412a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
24131b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
24141b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
24151b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
24161b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2417a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
24181b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
241974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
24201b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2421ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
24226905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2423a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
24246905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
24251b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2426bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
24273d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2428bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2429d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2430d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
24319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2433e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2434e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2435e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2436e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2437e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2438e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2439e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2440e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2441e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2442e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2443e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2444e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2445e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2446e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2447e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2448e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2449e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2450e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2451e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2452e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2453e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2454e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2455e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2456e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2457e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2458e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2459e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2460e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2461e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2462e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2463e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2464e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2465e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2466e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2467e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2468e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2469e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
24705a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
2471e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2472e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2473e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2474e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2475e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2476e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
24779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2478e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2479d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2480d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
248182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
248282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2483d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2484d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
248525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
248625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
24876547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
24886547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
24896547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
24906547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2491d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2492d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2493d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2494d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2495d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2496d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2497d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2498d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2499d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2500d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2501d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2502d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
25035ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
25045ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
25055ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
25065ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
25075ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
25083890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
25093890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2510d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2511d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
25123d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2513d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2514d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
251540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
25163890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
25173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2518d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
251940845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2520e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2521e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2522e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2523e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2524e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2525e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2526e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2527e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2528e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2529e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2530e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2531e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2532e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2533e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2534367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2535367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2536367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2537367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
253898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const {
253998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    size_t count = 0;
254098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    for (const sp<Layer>& child : mCurrentChildren) {
254198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu        count += 1 + child->getChildrenCount();
254298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    }
254398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu    return count;
254498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu}
254598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu
25461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
25471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
25481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
25491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
25521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
25531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
25541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25561db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
25571db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
25581db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
25591db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
25601db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
25611db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
25621db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
25631db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
25641db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
25651db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
25661db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
25671db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
25681db73f66624e7d151710483dd58e03eed672f064Robert Carr
25691db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
2570e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu        newParent->addChild(child);
25711db73f66624e7d151710483dd58e03eed672f064Robert Carr
25721db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
25731db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
25741db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
25751db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
25761db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
25771db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
25781db73f66624e7d151710483dd58e03eed672f064Robert Carr
25791db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
25801db73f66624e7d151710483dd58e03eed672f064Robert Carr}
25811db73f66624e7d151710483dd58e03eed672f064Robert Carr
25829524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
2583412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) {
25849524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
25859524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
25869524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
25879524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
25889524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
25899524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (client != nullptr) {
25909524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
25919524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
25929524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
25939524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
25949524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
25959524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
25969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
25971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
2598e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mCurrentParent = layer;
25991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
26021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
26031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
26041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
26071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
26081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
26091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
26111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
26141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
26151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
2617412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector Layer::makeTraversalList(LayerVector::StateSet stateSet) {
2618412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
2619412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                        "makeTraversalList received invalid stateSet");
2620412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
2621412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
2622412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    const State& state = useDrawing ? mDrawingState : mCurrentState;
2623412903fce3a93f411c85c54375a1851bfb370400Dan Stoza
2624412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    if (state.zOrderRelatives.size() == 0) {
2625412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        return children;
2626db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2627db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    LayerVector traverse;
2628db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2629412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
2630db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        sp<Layer> strongRelative = weakRelative.promote();
2631db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (strongRelative != nullptr) {
2632db66e627ad8904491e384c64f82fc77a939b9705Robert Carr            traverse.add(strongRelative);
2633db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
2634db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2635db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2636412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    for (const sp<Layer>& child : children) {
2637db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        traverse.add(child);
2638db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    }
2639db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
2640db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    return traverse;
2641db66e627ad8904491e384c64f82fc77a939b9705Robert Carr}
2642db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
26431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
2644db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order.
26451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
2646412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
2647412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
2648db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
26491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
2650db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
2651db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2652db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() >= 0) {
26531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
2654db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        }
2655412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
26561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2657412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
2658db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (; i < list.size(); i++) {
2659db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2660412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInZOrder(stateSet, visitor);
26611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
2665db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order.
26661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
2667412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
2668412903fce3a93f411c85c54375a1851bfb370400Dan Stoza                                    const LayerVector::Visitor& visitor) {
2669412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    LayerVector list = makeTraversalList(stateSet);
2670db66e627ad8904491e384c64f82fc77a939b9705Robert Carr
26711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
2672db66e627ad8904491e384c64f82fc77a939b9705Robert Carr    for (i = list.size()-1; i>=0; i--) {
2673db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2674db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        if (relative->getZ() < 0) {
26751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
26761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
2677412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
26781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
2679412903fce3a93f411c85c54375a1851bfb370400Dan Stoza    visitor(this);
26801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
2681db66e627ad8904491e384c64f82fc77a939b9705Robert Carr        const auto& relative = list[i];
2682412903fce3a93f411c85c54375a1851bfb370400Dan Stoza        relative->traverseInReverseZOrder(stateSet, visitor);
26831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
26841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
26851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
26861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
26871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
2688e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
26891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
26901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
26919b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr
26929b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
26939b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // it isFixedSize) then there may be additional scaling not accounted
26949b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // for in the transform. We need to mirror this scaling in child surfaces
26959b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // or we will break the contract where WM can treat child surfaces as
26969b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        // pixels in the parent surface.
26970a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu        if (p->isFixedSize() && p->mActiveBuffer != nullptr) {
26981725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferWidth;
26991725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            int bufferHeight;
27001725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
27011725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getWidth();
27021725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getHeight();
27031725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            } else {
27041725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferHeight = p->mActiveBuffer->getWidth();
27051725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                bufferWidth = p->mActiveBuffer->getHeight();
27061725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr            }
27079b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            float sx = p->getDrawingState().active.w /
27081725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                    static_cast<float>(bufferWidth);
27099b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            float sy = p->getDrawingState().active.h /
27101725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr                    static_cast<float>(bufferHeight);
27119b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            Transform extraParentScaling;
27129b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            extraParentScaling.set(sx, 0, 0, sy);
27139b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr            t = t * extraParentScaling;
27149b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr        }
27151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
27161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
27171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
27181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
27196452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#ifdef USE_HWC2
27206452f12c95e855a96ab8f690f28914cd37de762bRobert Carrfloat Layer::getAlpha() const {
2721e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
27226452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
27236452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0;
27246452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return parentAlpha * getDrawingState().alpha;
27256452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
27266452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#else
27276452f12c95e855a96ab8f690f28914cd37de762bRobert Carruint8_t Layer::getAlpha() const {
2728e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    const auto& p = mDrawingParent.promote();
27296452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
27306452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? (p->getAlpha() / 255.0f) : 1.0;
27316452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float drawingAlpha = getDrawingState().alpha / 255.0f;
27326452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    drawingAlpha = drawingAlpha * parentAlpha;
27336452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return static_cast<uint8_t>(std::round(drawingAlpha * 255));
27346452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
27356452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#endif
27366452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
27371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
27381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
27391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
27401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
27411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
27421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
2743e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu    mDrawingParent = mCurrentParent;
27441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
27451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
274613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
274713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
27483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
27513f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
27523f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
27553f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
27563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2757