Layer.cpp revision 1f42e3a02c4f9a1ba1916a2f0e47082bedb73e41
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
41a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
4290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
453e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
487b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
54875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
56c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE    0
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    :   contentDirty(false),
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
71a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mTextureName(-1U),
7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mName("unnamed"),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFormat(PIXEL_FORMAT_NONE),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
78a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
79399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
80a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
82933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
83c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
85d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mBufferLatched(false),
86cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
878cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mPreviousFrameNumber(0),
884d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        mRefreshPending(false),
8982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
925cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mHasSurface(false),
9803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10365476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10404839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos        mUpdateTexImageFailed(false),
10582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mFreezePositionUpdates(false)
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Creating Layer %s", name.string());
1109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
112a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
11449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eHidden)
1184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerHidden;
1194125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (flags & ISurfaceComposerClient::eOpaque)
1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerOpaque;
121231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    if (flags & ISurfaceComposerClient::eSecure)
122231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza        layerFlags |= layer_state_t::eLayerSecure;
1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eNonPremultiplied)
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mPremultipliedAlpha = false;
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1313dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
132b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
133b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mCurrentState.alpha = 1.0f;
1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mCurrentState.alpha = 0xFF;
1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.flags = layerFlags;
1424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
144bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1452f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1462f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1506547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    nsecs_t displayPeriod =
1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1596547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1600a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1610a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1620a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1630a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
164e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
165e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
1663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() {
167bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
168b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer;
169b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer;
170f8b4ca51111cd2e566d1774ac464da859db78976Romain Guy    BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true);
1711db73f66624e7d151710483dd58e03eed672f064Robert Carr    mProducer = new MonitoredProducer(producer, mFlinger, this);
172468051e20be19130572231266db306396a56402bIrvel    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this);
173bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
174399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mSurfaceFlingerConsumer->setContentsChangedListener(this);
1754d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mSurfaceFlingerConsumer->setName(mName);
176b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
17763a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    if (mFlinger->isLayerTripleBufferingDisabled()) {
17863a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard        mProducer->setMaxDequeuedBufferCount(2);
17963a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    }
1806905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1818430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
1828430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    updateTransformHint(hw);
183b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
18496f0819f81293076e652792794a961543e6750d7Mathias Agopian
1854d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1868ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos  sp<Client> c(mClientRef.promote());
1878ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    if (c != 0) {
1888ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos        c->detachLayer(this);
1898ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    }
1908ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos
191cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mRemoteSyncPoints) {
192cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        point->setTransactionApplied();
193cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    }
194c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    for (auto& point : mLocalSyncPoints) {
195c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza        point->setFrameAvailable();
196c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
197921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    mFlinger->deleteTextureAsync(mTextureName);
1986547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
19996f0819f81293076e652792794a961543e6750d7Mathias Agopian}
20096f0819f81293076e652792794a961543e6750d7Mathias Agopian
20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
22113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2226b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2236b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2246b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2256b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
226468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
227468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
244ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2506b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
25199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
252579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
253579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2546b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
257a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
265a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
266a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2714d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2766b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
279399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
280399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
281399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
282399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
283399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
284399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
285399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2866710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after
2876710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before
2886710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list)
28913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() {
290bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->abandon();
2911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
2921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
2931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
29448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
295cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
29613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
29913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3001eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
30113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
30213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
30313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
30413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
32813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3334d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3354d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3364d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3374d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
339582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
340582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
341b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
342b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
34813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
349a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
350a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
351a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
352f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
353f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
354a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
355f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
356a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
357a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
358a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
359f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
360a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
3614fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
362f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
363f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
365f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
366f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
367f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
368f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
369f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
370f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
371f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
372f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
373f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
374f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
375f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
3761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
3771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
3781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
3791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const sp<Layer>& p = getParent();
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
41013127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4111eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4126c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4136c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4146c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4156c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
41713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
418b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
419b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
420b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
42113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
4221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
4241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
426de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
427de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
428de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
4291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
4351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
4361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4386c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
4396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
44013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
44113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
443b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
44413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
4451eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
44613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
44713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
44813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
4496b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
4506b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
4516b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
4526b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
4530e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4540e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
455b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
456b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        activeCrop = s.crop;
4570e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
4580e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
461acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
464b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
465b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
467acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4725a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4755a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
4761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
49013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
49128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
49228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
49328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
49428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
49528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
49628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
497acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
498acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
499acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
50013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
501f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
502f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
503f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
505acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
506acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
508cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
509acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
510021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
511021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
512acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
513021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
514021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
51913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5210f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
5220f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
523acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
54413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
54813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
553acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
557acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
55813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
55913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
56013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
56113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
563ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
5649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
5669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
5679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
5689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
569a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
5709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
5729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
5739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
576a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
5773e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
5829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
5839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
5869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
5899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
5909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
5919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
5929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
593dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
59413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
5951eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
597ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
5986452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 1.0f) {
599ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman        blendMode = mPremultipliedAlpha ?
6009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
6019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
602ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
603ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
604ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             " %s (%d)", mName.string(), to_string(blendMode).c_str(),
605ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             to_string(error).c_str(), static_cast<int32_t>(error));
6069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6076452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    if (!isOpaque(s) || getAlpha() != 0xFF) {
6089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
61313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
61413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
61513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
618b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
619b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
622acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
6239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
6259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
626acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
627acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
62928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
63028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
63128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
63228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
63328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
63428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
635acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
636acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
637acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
6396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
6406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
6416c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
6426c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
6436c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
6446c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
6456c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
6466c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
6471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
6481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
649b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
650b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
651acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
652acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
653acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
655acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
656acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
657acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
660ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
661e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
662e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
663e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
664e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
665e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
666e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
667e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
668e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6705a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
6719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
672e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
673e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
674e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
675e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
676e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
677e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
678e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
679e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6816452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float alpha = getAlpha();
6826452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    error = hwcLayer->setPlaneAlpha(alpha);
6839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
6846452f12c95e855a96ab8f690f28914cd37de762bRobert Carr            "%s (%d)", mName.string(), alpha, to_string(error).c_str(),
6859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
687ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
689ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6912f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
6922f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    error = hwcLayer->setInfo(s.type, s.appId);
6932f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
6942f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
6959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
6979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
6989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
7009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
7019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
7026452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    layer.setPlaneAlpha(getAlpha());
7039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7049f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
70529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
70629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
70729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
70829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
70929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
71029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
71129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
71229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
71329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
7141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
715c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
716cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (getTransformToDisplayInverse()) {
717c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
718021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
719021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
720c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
721021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
722021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
723c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
724c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
725c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
726c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
727c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
728cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
729cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        /*
730cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * Here we cancel out the orientation component of the WM transform.
731cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * The scaling and translate components are already included in our bounds
732cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * computation so it's enough to just omit it in the composition.
733cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         * See comment in onDraw with ref to b/36727915 for why.
734cae605cd5668f8107e340ad8a672c7f034147401Robert Carr         */
735cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        transform = Transform(invTransform) * tr * bufferOrientation;
736c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
73729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
73829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
73913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
7409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                "%s (%d)", mName.string(), to_string(transform).c_str(),
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
7539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
7549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
7559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
7569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
7579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
759a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
760a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
7619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
778aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcInfo = mHwcLayers[hwcId];
779aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    auto& hwcLayer = hwcInfo.layer;
7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7940f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
7960f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
7970f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
7980f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
8009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
8019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
8029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
8040f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8070a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
808aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu    if (hwcInfo.forceClientComposition ||
8090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
8100f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
8119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
8120f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8130f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8140f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
8150a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
8160a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
8170a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
818c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
819c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
8200a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
8210a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
8220a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
8230a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8240a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
825c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
826c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
827c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
828c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
829c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
830c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
831c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
832c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
833c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
8340a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
8350a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
8360a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
8370f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
8380f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
8390f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
8400f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
8419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
8439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
8449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8450f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
846bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
847bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
848bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
849bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
850bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
851bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
852bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
853bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
85406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
8551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    sp<GraphicBuffer> hwcBuffer;
8561f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer,
8571f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara            &hwcSlot, &hwcBuffer);
85806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
8590f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
8601f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence);
8610f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
8620f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
8630f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
8640f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
8650f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8679551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter
8689551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const {
8699551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter    return mCurrentState.dataSpace;
8709551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter}
8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
8739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
8749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
8759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
8769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
8819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
884ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
8909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
8919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
8949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
8959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
8969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
8979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
8989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
8999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
9009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
9049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
905dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
9069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
9079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
9089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
909b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
910b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
9119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
9139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
9141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
916b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
917b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
918acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
9199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
9209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
9239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
9249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
9279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
9289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
9319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
9339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
9399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9499d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
9509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
9519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
9529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
9539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
9549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
9631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
9699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
97203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
97313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
97413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
97513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
97613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
97713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
978c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
97913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
98013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
981c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
982c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
983c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
98413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
986c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
987c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
988c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
989c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
990cae605cd5668f8107e340ad8a672c7f034147401Robert Carrstatic constexpr mat4 inverseOrientation(uint32_t transform) {
991cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
992cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
993cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
994cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    mat4 tr;
995cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
996cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
997cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * rot90;
998cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
999cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) {
1000cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipH;
1001cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1002cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) {
1003cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        tr = tr * flipV;
1004cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    }
1005cae605cd5668f8107e340ad8a672c7f034147401Robert Carr    return inverse(tr);
1006cae605cd5668f8107e340ad8a672c7f034147401Robert Carr}
1007cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
10085d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter/*
10095d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter * onDraw will draw the current layer onto the presentable buffer
10105d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter */
1011c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
1012c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
10141c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
10151c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1016a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
1018179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
1019179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
1020179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
1021179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1022179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
1023179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
1024179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1025179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
1026179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
10271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
10281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) {
10291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
10301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
10311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
10321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
10334297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
10341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
1035179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
1036179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
1037179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
10381748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
1039179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1042a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
104397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
104497eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1045bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1046bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
104797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1048dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1049dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1050dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1051dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1052dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1053dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1054875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1055875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1056dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1057cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1058eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1059cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1060cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1061cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1062bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1063bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1064cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1065cae605cd5668f8107e340ad8a672c7f034147401Robert Carr        if (getTransformToDisplayInverse()) {
1066c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1067c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1068021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1069021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1070c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1071021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1072021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1073cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            mat4 tr = inverseOrientation(transform);
1074cae605cd5668f8107e340ad8a672c7f034147401Robert Carr
1075cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            /**
1076cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * TODO(b/36727915): This is basically a hack.
1077cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             *
1078cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * Ensure that regardless of the parent transformation,
1079cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * this buffer is always transformed from native display
1080cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * orientation to display orientation. For example, in the case
1081cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * of a camera where the buffer remains in native orientation,
1082cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             * we want the pixels to always be upright.
1083cae605cd5668f8107e340ad8a672c7f034147401Robert Carr             */
1084cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            if (getParent() != nullptr) {
1085cae605cd5668f8107e340ad8a672c7f034147401Robert Carr                const auto parentTransform = getParent()->getTransform();
1086cae605cd5668f8107e340ad8a672c7f034147401Robert Carr                tr = tr * inverseOrientation(parentTransform.getOrientation());
1087cae605cd5668f8107e340ad8a672c7f034147401Robert Carr            }
1088c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1089c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1090c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1091c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1092c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1093c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1094cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
109549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
109649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
109749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
109849457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
109949457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1100a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1101875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1102a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
11038578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1104875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1108c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
11091748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1110c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
111113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
111219733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1113c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
111419733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
111519733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
111613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
111813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
11191748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
11201748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
112113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1123c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
11248578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
11251eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
112613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1127c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
112913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
113013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
113113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
113213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
113313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
113413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
113513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
113613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
113713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1138c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
113913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
114013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
114113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
114213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1143acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1144acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
11451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1146b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
11471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1148b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1149acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1150acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
11511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1152acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1153acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1154acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1155acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
115613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11573f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
11583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
11593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
11603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
116113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1162875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1163875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1164ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1165ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1166ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1167ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1168ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
116913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1170875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
11716452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), getAlpha());
11725d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2
11735d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    engine.setSourceDataSpace(mCurrentState.dataSpace);
11745d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif
11755cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1176875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
117713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
117813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
11809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
11819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
11829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
11849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
11859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
11879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
11889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
11899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
11909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
11919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
11929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
11939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
11949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
11969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
11979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
11989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
11999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
12009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1204ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1205ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1206ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1207ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1208ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
12099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1210ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
12119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
12129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
12149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
12179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
12199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
12229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
12259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
12279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
12289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
12309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12331681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
12341681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
12351681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
12361681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
12371681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
12381681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
12391681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
12401681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
12411681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
12421681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
12431681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1244c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1245c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1246c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1247c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1248c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1249c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1250c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1251c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1252c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1253c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1254c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1255c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1256c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1257c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1258cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1259cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1260cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1261cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1262cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1263cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
12647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1265cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
12667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
12671ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
12689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1269c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1270c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1271c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1272c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
12731ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
12741ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
12751ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12761ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12771ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
12781ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
12791ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
12801ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
12811ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
12821ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12831ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12841ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
12859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
12869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
12879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12881ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
12891ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1290cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1291cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1292cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1293cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1294cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
12957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1296cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1297cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1298cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1299cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
13007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
13017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
130213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
130313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
130413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
130513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
130613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
130713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
130813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
130913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1310ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1311ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1312ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1313ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1314ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1315ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1316ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13175773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1318a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1319a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1320ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
13215773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
13225773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
13235773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1324ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1325541f22658ab1617c9d12c98684ab40248df8749bRomain Guy        case HAL_PIXEL_FORMAT_RGBA_1010102:
1326dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
13275773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
13285773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1329dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1330ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1331ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
133313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
133413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
133513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1336acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1337acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1338acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1339acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1340acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1341acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1342acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1343acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1344acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1345acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1346acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1347acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1348acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1349acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1350acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1351c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1352c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
135313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
13541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
13551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
135613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
13571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
13583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1359acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1360acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1361acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1362acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1363acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
13641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
13661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
13671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
13681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
13691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1370acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1371acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1372b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1373b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1374b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1375b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1376b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1377acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1378acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1379ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
13801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
13811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
13821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
13831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
13843f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
13855cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
138613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
138713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1388ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13894125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1390a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1391a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if we don't have a buffer yet, we're translucent regardless of the
1392a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1393db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    if (mActiveBuffer == 0) {
1394a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1395db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1396a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1397a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1398a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
13994125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1400a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1401a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1402231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1403231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1404231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1405231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1406231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1407231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
14087a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
14097a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1410a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
14117a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
14127a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
14137a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1414b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
141513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1416c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
141713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
141813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
142813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
142913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
143013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
143113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
143213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
143313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
143413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
143513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
143613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
143713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
143813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
143913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
144013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
144113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
144213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
144313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
144413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
144613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
14477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
14487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
14497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
14507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
14537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
14540d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
14550d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
14560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
14570d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
14587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
14597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
14607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
14610d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
14623bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
14633bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
14643bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
14650d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
1466cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1467cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1468cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1469cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
14700d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
1471cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
14727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
14737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
14757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1476f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
148105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
148205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
148305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
148405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
148505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
14887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
149005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
14917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
14927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
14930d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
14947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
14957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
14967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
14977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
14987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
149905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
15027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1504cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1505cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1506cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1507cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1508cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1509cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1510cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1511cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1512cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1513cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1514cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
15167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
151705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
15227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1523792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1524792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
15257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
152705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
15297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
15337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
15347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
15357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
15367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
15407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
15417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1544cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
15451ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1546cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1547cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
15481ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1549cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1550cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
15517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
155413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
15551c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
15561c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
15577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
155805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
155905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
15607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
15617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15631eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15651eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
15661eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1567a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1568a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1569cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
15709d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
15716905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1572419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1573b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1574419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1575b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1576c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1577c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
15781eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1580b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1581b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1582b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1583b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1584b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
15851eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
15861eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1587b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1588b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1589b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1590b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1591b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1592b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1593b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1594a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
15952a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
15962a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1597bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
15981eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1600cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
160182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
160282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
16030cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
16049e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
160513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
16060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
16070cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
16080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
16090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
16100cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
16110cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
16120cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
16139e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
16149e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
16159e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
16169e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
16170cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
16180cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
16190cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
16200cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
16210cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
162213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always set active to requested, unless we're asked not to
162313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this is used by Layer, which special cases resizes.
162413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (flags & eDontUpdateGeometryState)  {
162513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    } else {
16267d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
162782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        if (mFreezePositionUpdates) {
162882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
162982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
163082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
163182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
163282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
163382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
163482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
163582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
163682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
163713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
163813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16391eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
164113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
164213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
164313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16441eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
164513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
164613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
164713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
164813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
164913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
16503dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
16513dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1655c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1656c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1657c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1658c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
16591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1660c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1661c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
166213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
166305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
166413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
166805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1669a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1670a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
167113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
167213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
167313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
167413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
167513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
167613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
167713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
167813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
167982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
16803dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
168369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
168469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
168569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
168669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
16873dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
168882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    if (immediate && !mFreezePositionUpdates) {
168982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
169082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
169182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
169269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
16937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
169413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
169513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
169613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
169782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
16981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
16991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
17001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
17011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
17021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
17041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
17051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
17061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
17071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
17081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
17091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1710ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
171113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
171313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
171413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
17157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
171613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
172013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
172113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
172213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
172313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
172413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
17257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
172613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
172713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
172813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
17309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
17319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
17329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
17339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
173413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
173513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
173613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
173713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
17387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
173913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
174013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
174113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
174313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
17443dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
1745cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr            matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
17467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
174813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
174913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
175013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
17512ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
17527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
175313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
175413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
175513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
175613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
175713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
175813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
175913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
176013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
176113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
17627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
17637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
176413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
176513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
176613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
176799e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
176899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
1769b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.crop == crop)
177013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
177113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
177299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
177399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    if (immediate) {
177499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
177599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
17767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
177813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
177913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17808d5227b8416b099c884429312daf2d60496fa484Robert Carr
17818d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) {
1782b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.finalCrop == crop)
1783acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1784acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
17858d5227b8416b099c884429312daf2d60496fa484Robert Carr    mCurrentState.requestedFinalCrop = crop;
17868d5227b8416b099c884429312daf2d60496fa484Robert Carr    if (immediate) {
17878d5227b8416b099c884429312daf2d60496fa484Robert Carr        mCurrentState.finalCrop = crop;
17888d5227b8416b099c884429312daf2d60496fa484Robert Carr    }
1789acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1790acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1791acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1792acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
179313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1794c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1795c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1796c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1797c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
179882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1799c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1800c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1801c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
18022f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
18032f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
18042f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
18052f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
18062f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
18072f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
18082f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1809c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1810c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1811c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1812c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1813c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1814c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1815c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
181613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
181813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
181913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
182013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
18217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
182213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
182313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1824a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1825a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1826bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1827bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1828bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1829bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1830bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1831bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1832bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1833bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1834bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1835bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
18361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
18371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    auto p = getParent();
18381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
18391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
18401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
18421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18440d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer,
18457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
18460d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
18477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
18487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
18497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
18507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
18517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
18520d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1853792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
18547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
18550d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    ALOGE("Deferred transaction");
18560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
18570d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
18580d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle,
18590d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        uint64_t frameNumber) {
18600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
18610d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
18627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
18637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1864ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1865ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1866ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1867ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1868ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1869ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1870ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1871ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1872ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1873ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1874ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1875ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18806b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1881ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1882d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1883d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1884d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
18856b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
18860eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
18870eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
18880eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
18890eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
18906b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
18916b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
18920eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18930eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
18940eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
18950eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
18960eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
18970eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
18980eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18990eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
19000eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
19016b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
19026b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
1903d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
1904d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
1905d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
1906d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
1907d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
19084d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
1909ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
191099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
191199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
19120a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
19133d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
19140a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const CompositorTiming& compositorTiming) {
19153d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mAcquireTimeline.updateSignalTimes();
19163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.updateSignalTimes();
19173d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1918d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
1919d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
192028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
192128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
192228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
192328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
192428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
192528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
192628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
19270a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson                glDoneFence, presentFence, compositorTiming);
192828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
192982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
193028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
193128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
193228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
193382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19343d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
19353d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
193628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
19373d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
193828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
193928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
194028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
194128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
194228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
194382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19443d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
19453d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
19463d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
194728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
194828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
194928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
19503d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
19513d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
19523d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
1953d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
195428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
195528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
195628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
195728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
1958d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
1959d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
19609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1961f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
19625ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
19635ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return;
19645ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
19655ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
19663d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
1967d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
19683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
19693d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
19703d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
19718cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    if (mPreviousFrameNumber != 0) {
19728cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mFrameEventHistory.addRelease(mPreviousFrameNumber,
19738cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                dequeueReadyTime, std::move(releaseFenceTime));
19748cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    }
19759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
19769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
19779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
19781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
19791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
19801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& parent = getParent();
19811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
19821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
19831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
19851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1987da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
19889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
19896452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha() > 0.0f
19909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
19926452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return !(isHiddenByPolicy()) && getAlpha()
19939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1995da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
1996da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
1997cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
1998cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
1999cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
2000cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
2001cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
2002cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2003cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
2004cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
2005cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
2006cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2007cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
2008cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2009cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
2010cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
2011cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
2012cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
2013cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
2014cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
2015cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
2016cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2017cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2018cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
2019cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
2020cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
2021cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
2022cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2023d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
20251c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
20261c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2027399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
2028399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
2029399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
203012e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
203112e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
203212e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
203312e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
20345bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
20355bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
20365bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
20371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
2038399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
2039399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
20404fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
2041223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
2042223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2043223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
204499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
2045223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
2046223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
2047223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
2048223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
2049223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
2050223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2051223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2052223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20531ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2054223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2055223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2056223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2057223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2058223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2059223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20602c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2061223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2062223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2063223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2064223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2065223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2066cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2067223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2068223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2069223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2070223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2071223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2072223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2073223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2074223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2075223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
20767b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
20777b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
20787b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    mOverrideScalingMode, mFreezePositionUpdates);
2079223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2080223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2081223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2082223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2083223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2084223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2085223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2086223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2087223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2088223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2089223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2090063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
20916b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2092223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2093223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2094223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2095223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2096223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2097223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2098223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2099223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2100223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2101223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2102223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2103223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2104223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2105223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2106ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2107223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2108223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2109223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2110223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2111223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2112ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2115223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2116223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2118223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2119223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2120223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2121223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
21256b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
21276b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
21286b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2130223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2131ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
21321585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2133223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2134223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2135223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2136223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2137223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2138223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2139d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2140223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
214106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(
214206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            &mActiveBufferSlot);
2143223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2145223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2146223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2147702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2148d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2149d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2150d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2151d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2152d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2153d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2154d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2155d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
21563d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2157d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
21583d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
21598cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
21608cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRelease(mPreviousFrameNumber,
21618cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    latchTime, std::move(releaseFenceTime));
21628cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
2163d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2164d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2165d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2167223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2174bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2175bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2176223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2177223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2179223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2180223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2181223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2182223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2183223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2185223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2186223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2187223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2188702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2189223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2190223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2193223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2194702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2195702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2196223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2197702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2202cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2205223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2206223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2207223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2208223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2209223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2210223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2211223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2212223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2213223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2214223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2215223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2216223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2217223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2218223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2219223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2220223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2221cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2222cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2223223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2224cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2225223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2226223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2227223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2228223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
22291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
22301c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22314fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
223413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
223513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
223613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
223713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
223813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
223913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
224013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
224103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
224203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
224303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
224413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
224513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
224613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
224713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
224813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
224913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
225013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
225113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
225213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
225313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
225413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
225513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
225613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
225713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
225813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
225913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
226013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
226113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
226213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
226313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
226413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
226513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
226613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22673e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
22681b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
22691eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
227013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22713e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
227274d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
227313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
227413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
22753e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
227613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22772ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
227813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2279ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
228013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
228113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
228274d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2283acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2284acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
228513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
22869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
22879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
22899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
229113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
22921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
22931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
22941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2295b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2296b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2297b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2298b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
22994125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
230013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
23013dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
23023dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
230313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
23041b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2305a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2306a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
23071b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
23081b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
23091b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
23101b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2311a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
23121b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
231374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
23141b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2315ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
23166905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2317a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
23186905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
23191b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2320bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
23213d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2322bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2323d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2324d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
23259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2326e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2327e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2328e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2329e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2330e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2331e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2332e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2333e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2334e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2335e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2336e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2337e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2338e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2339e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2340e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2341e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2342e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2343e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2344e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2345e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2346e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2347e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2348e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2349e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2350e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2351e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2352e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2353e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2354e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2355e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2356e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2357e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2358e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2359e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2360e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2361e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2362e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2363e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
23645a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
2365e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2366e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2367e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2368e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2369e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2370e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
23719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2372e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2373d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2374d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
237582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
237682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2377d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2378d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
237925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
238025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
23816547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
23826547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
23836547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
23846547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2385d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2386d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2387d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2388d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2389d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2390d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2391d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2392d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2393d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2394d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2395d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2396d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
23975ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
23985ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
23995ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
24005ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
24015ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
24023890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
24033890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2404d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2405d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
24063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2407d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2408d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
240940845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
24103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
24113890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2412d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
241340845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2414e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2415e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2416e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2417e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2418e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2419e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2420e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2421e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2422e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2423e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2424e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2425e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2426e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2427e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2428367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2429367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2430367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2431367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
24321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
24331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
24341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
24351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
24381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
24391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
24401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24421db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
24431db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
24441db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
24451db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
24461db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
24471db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24481db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
24491db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
24501db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
24511db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
24521db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
24531db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24541db73f66624e7d151710483dd58e03eed672f064Robert Carr
24551db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
24561db73f66624e7d151710483dd58e03eed672f064Robert Carr        newParent->addChild(child);
24571db73f66624e7d151710483dd58e03eed672f064Robert Carr
24581db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
24591db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
24601db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
24611db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
24621db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24631db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
24641db73f66624e7d151710483dd58e03eed672f064Robert Carr
24651db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
24661db73f66624e7d151710483dd58e03eed672f064Robert Carr}
24671db73f66624e7d151710483dd58e03eed672f064Robert Carr
24689524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
24699524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    traverseInZOrder([this](Layer* child) {
24709524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
24719524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
24729524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
24739524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
24749524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
24759524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (client != nullptr) {
24769524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
24779524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
24789524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
24799524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
24809524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
24819524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
24829524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
24831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
24841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mParent = layer;
24851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
24881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
24891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
24901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
24931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
24941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
24951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
24971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
25001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
25011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
25041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Negatively signed children are before 'this' in Z-order.
25051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
25061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) {
25071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
25081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
25091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() >= 0)
25111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
25121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
25131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
25151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
25161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
25181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
25221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Positively signed children are before 'this' in reverse Z-order.
25231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
25241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) {
25251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
25261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (i = mDrawingChildren.size()-1; i>=0; i--) {
25271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() < 0) {
25291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
25301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
25311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
25321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
25341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
25351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
25371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
25411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
25421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
25431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
25441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
25451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
25471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25496452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#ifdef USE_HWC2
25506452f12c95e855a96ab8f690f28914cd37de762bRobert Carrfloat Layer::getAlpha() const {
25516452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    const auto& p = getParent();
25526452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
25536452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0;
25546452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return parentAlpha * getDrawingState().alpha;
25556452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
25566452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#else
25576452f12c95e855a96ab8f690f28914cd37de762bRobert Carruint8_t Layer::getAlpha() const {
25586452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    const auto& p = getParent();
25596452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
25606452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float parentAlpha = (p != nullptr) ? (p->getAlpha() / 255.0f) : 1.0;
25616452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    float drawingAlpha = getDrawingState().alpha / 255.0f;
25626452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    drawingAlpha = drawingAlpha * parentAlpha;
25636452f12c95e855a96ab8f690f28914cd37de762bRobert Carr    return static_cast<uint8_t>(std::round(drawingAlpha * 255));
25646452f12c95e855a96ab8f690f28914cd37de762bRobert Carr}
25656452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#endif
25666452f12c95e855a96ab8f690f28914cd37de762bRobert Carr
25671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
25681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
25691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
25701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
25711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
25731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
257513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
257613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
25773f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25793f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
25803f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
25813f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25833f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
25843f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
25853f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2586