Layer.cpp revision 5ea5e5905170f32d5cf45ad35c552d64743892c3
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
443e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
477b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
48b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
53875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
54875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
55c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
56c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE    0
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
654d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
6713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    :   contentDirty(false),
6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
70a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mTextureName(-1U),
7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mName("unnamed"),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFormat(PIXEL_FORMAT_NONE),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
77a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
78399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
80933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
81c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
83d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mBufferLatched(false),
84cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
858cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mPreviousFrameNumber(0),
864d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        mRefreshPending(false),
8782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
8813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
8913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
905cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mHasSurface(false),
9603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
98a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10165476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10204839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos        mUpdateTexImageFailed(false),
10382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mFreezePositionUpdates(false)
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Creating Layer %s", name.string());
1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
110a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
11249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eHidden)
1164125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerHidden;
1174125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (flags & ISurfaceComposerClient::eOpaque)
1184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerOpaque;
119231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    if (flags & ISurfaceComposerClient::eSecure)
120231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza        layerFlags |= layer_state_t::eLayerSecure;
1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eNonPremultiplied)
1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mPremultipliedAlpha = false;
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1293dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
130b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
131b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
1339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mCurrentState.alpha = 1.0f;
1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mCurrentState.alpha = 0xFF;
1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.flags = layerFlags;
1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
142bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1432f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1442f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    nsecs_t displayPeriod =
1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1576547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1580a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1590a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1600a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1610a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
162e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
163e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
1643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() {
165bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
166b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer;
167b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer;
168468051e20be19130572231266db306396a56402bIrvel    BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true);
1691db73f66624e7d151710483dd58e03eed672f064Robert Carr    mProducer = new MonitoredProducer(producer, mFlinger, this);
170468051e20be19130572231266db306396a56402bIrvel    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this);
171bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
172399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mSurfaceFlingerConsumer->setContentsChangedListener(this);
1734d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mSurfaceFlingerConsumer->setName(mName);
174b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
17563a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    if (mFlinger->isLayerTripleBufferingDisabled()) {
17663a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard        mProducer->setMaxDequeuedBufferCount(2);
17763a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    }
1786905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1798430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
1808430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    updateTransformHint(hw);
181b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
18296f0819f81293076e652792794a961543e6750d7Mathias Agopian
1834d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1848ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos  sp<Client> c(mClientRef.promote());
1858ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    if (c != 0) {
1868ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos        c->detachLayer(this);
1878ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    }
1888ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos
189cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mRemoteSyncPoints) {
190cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        point->setTransactionApplied();
191cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    }
192c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    for (auto& point : mLocalSyncPoints) {
193c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza        point->setFrameAvailable();
194c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
195921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    mFlinger->deleteTextureAsync(mTextureName);
1966547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
19796f0819f81293076e652792794a961543e6750d7Mathias Agopian}
19896f0819f81293076e652792794a961543e6750d7Mathias Agopian
19913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
21913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2206b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2216b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2226b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2236b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
224468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
225468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
226a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
227a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
242ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
244a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2476b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
24999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
250579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
251579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2526b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
255a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
263a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
264a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2694d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2746b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2756b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2766b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
27706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wuvoid Layer::onBuffersReleased() {
27806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#ifdef USE_HWC2
27906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    Mutex::Autolock lock(mHwcBufferCacheMutex);
28006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
28106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    for (auto info : mHwcBufferCaches) {
28206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        info.second.clear();
28306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    }
28406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#endif
28506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu}
28606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
287399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
288399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
289399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
290399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
291399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
292399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
293399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2946710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after
2956710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before
2966710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list)
29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() {
298bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->abandon();
2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
30248d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
303cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
30413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3081eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
32813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
33213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
33313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
33613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
347582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
348582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
349b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
350b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
357a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
358a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
359a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
360f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
361f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
362a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
363f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
364a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
365a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
366a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
367f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
368a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
3694fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
370f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
371f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
374f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
375f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
376f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
377f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
378f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
379f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
380f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
381f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
382f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
383f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const sp<Layer>& p = getParent();
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
41813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4191eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4206c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4236c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4246c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
42513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
426b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
427b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
428b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
42913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
4301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
4321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
434de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
435de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
436de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
4371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
4421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
4431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
4441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4466c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
4476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
44813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
44913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
451b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
45213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
4531eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
45413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
45513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
45613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
4576b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
4586b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
4596b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
4606b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
4610e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4620e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
463b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
464b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        activeCrop = s.crop;
4650e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
4660e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
469acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
471acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
472b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
473b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
474acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
475acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
476acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrgfx::FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    gfx::FloatRect crop = getContentCrop().toFloatRect();
4841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
4931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
4941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
49813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
49928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
50028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
50128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
50228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
50328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
50428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
505acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
506acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
50813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
509f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
510f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
511f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
512acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
513acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
514acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
518021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
519021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
521021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
522021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
523acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
52713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5290f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
5300f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
55213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
553acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
55613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
557acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
558acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
559acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
560acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
561acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
562acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
563acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
564acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
565acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
56613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
56713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
56813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
56913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
571ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
5729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
5769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
577a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
5819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
584a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
5853e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
5869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
5889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
5949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
601dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
60213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
6031eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
6049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
6059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (!isOpaque(s) || s.alpha != 1.0f) {
6069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto blendMode = mPremultipliedAlpha ?
6079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
6089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setBlendMode(blendMode);
6099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
6109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                " %s (%d)", mName.string(), to_string(blendMode).c_str(),
6119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
6139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!isOpaque(s) || s.alpha != 0xFF) {
6159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
62013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
62113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
62213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6236c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
625b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
626b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
629acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
6309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
6329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
633acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
634acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
63628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
63728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
63828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
63928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
64028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
64128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
642acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
643acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
644acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6456c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
6466c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
6476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
6486c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
6496c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
6506c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
6516c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
6526c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
6536c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
6541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
6551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
656b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
657b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
658acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
659acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
660acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
662acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
663acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
664acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setDisplayFrame(transformedFrame);
668e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
669e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
670e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
671e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
672e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
673e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
674e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
675e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
67771bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza    gfx::FloatRect sourceCrop = computeCrop(displayDevice);
6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
679e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
680e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
681e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
682e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
683e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
684e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
685e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
686e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setPlaneAlpha(s.alpha);
6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(),
6919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
693ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
695ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6972f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
6982f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    error = hwcLayer->setInfo(s.type, s.appId);
6992f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
7002f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
7019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
7039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
7049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
7069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
7079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
7089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setPlaneAlpha(s.alpha);
7099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7109f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
71129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
71229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
71329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
71429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
71529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
71629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
71729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
71829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
71929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
7201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
721c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
722c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
723c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
724021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
725021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
726c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
727021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
728021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
729c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
730c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
731c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
732c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
733c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
734c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // and apply to the current transform
7350f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        transform = Transform(invTransform) * transform;
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}
7709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = mHwcLayers[hwcId].layer;
7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7950f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
7970f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
7980f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
7990f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
8009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
8019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
8029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
8039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
8050f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8080a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
8090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mHwcLayers[hwcId].forceClientComposition ||
8100a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
8110f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
8129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
8130f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8140f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8150f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
8160a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
8170a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
8180a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
819c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
820c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
8210a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
8220a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
8230a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
8240a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8250a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
826c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
827c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
828c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
829c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
830c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
831c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
832c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
833c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
834c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
8350a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
8360a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
8370a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
8380f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
8390f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
8400f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
8410f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
8429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
8449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
8459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8460f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
847bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
848bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
849bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
850bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
851bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
852bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
853bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
854bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
85506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
85606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    buffer_handle_t hwcHandle = nullptr;
85706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    {
85806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        Mutex::Autolock lock(mHwcBufferCacheMutex);
85906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
86006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        auto& hwcBufferCache = mHwcBufferCaches[hwcId];
86106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        sp<GraphicBuffer> hwcBuffer;
86206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        hwcBufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer,
86306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu                &hwcSlot, &hwcBuffer);
86406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        if (hwcBuffer != nullptr) {
86506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            hwcHandle = hwcBuffer->handle;
86606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        }
86706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    }
86806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
8690f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
87006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    error = hwcLayer->setBuffer(hwcSlot, hwcHandle, acquireFence);
8710f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
8720f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
8730f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
8740f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
8750f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
8819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
890ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
8919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
8929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
8939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
8959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
8969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
8979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
8989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
8999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
9029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
9039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
9049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
9059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
9069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
9109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
911dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
9129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
9139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
9149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
915b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
916b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
9179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
9199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
9201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
922b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
923b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
924acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
9279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
9329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
9339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
9349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
9399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
9489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
9499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
9509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
9519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
9539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
9691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
9729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
97803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
97913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
98013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
98113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
98213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
98313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
984c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
98613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
987c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
988c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
989c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
99013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
99113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
992c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
993c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
994c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
995c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
996c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
997c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
9991c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
10001c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1001a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
1003179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
1004179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
1005179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
1006179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1007179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
1008179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
1009179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1010179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
1011179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
10121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
10131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) {
10141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
10151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
10161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
10171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
10184297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
10191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
1020179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
1021179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
1022179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
10231748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
1024179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1027a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
102897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
102997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1030bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1031bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
103297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1033dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1034dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1035dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1036dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1037dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1038dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1039875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1040875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1041dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1042cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1043eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1044cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1045cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1046cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1047bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1048bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1049cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1050c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
1051c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1052c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1053021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1054021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1055c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1056c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1057c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // create a 4x4 transform matrix from the display transform flags
1058c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
1059c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
1060c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
1061c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1062c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            mat4 tr;
1063021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1064021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1065c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
1066c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * rot90;
1067c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
1068c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * flipH;
1069c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
1070c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * flipV;
1071c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1072c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // calculate the inverse
1073c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            tr = inverse(tr);
1074c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1075c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1076c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1077c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1078c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1079c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1080cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
108149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
108249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
108349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
108449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
108549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1086a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1087875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1088a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
10898578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1090875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1094c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
10951748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1096c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
109713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
109819733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1099c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
110019733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
110119733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
110213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
110313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
110413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
11051748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
11061748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
110713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
110813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1109c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
11108578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
11111eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
111213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1113c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
111413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
111513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
111613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
111813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
111913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
112013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
112113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
112313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1124c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
112513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
112613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
112713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1129acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1130acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
11311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1132b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
11331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1134b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1135acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1136acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
11371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1138acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1139acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1140acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1141acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
114213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
11443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
11453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
11463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
114713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1148875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1149875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1150ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1151ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1152ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1153ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1154ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
115513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1156875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
11574125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
11585cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1159875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
116013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
116113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
11639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
11649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
11659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
11679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
11689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
11709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
11719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
11729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
11739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
11749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
11759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
11769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
11779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
11789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
11799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
11809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
11819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
11829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
11839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1187ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1188ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1189ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1190ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1191ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
11929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1193ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
11949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
11979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
12009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
12059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
12089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
12109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
12119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
12139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12161681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
12171681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
12181681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
12191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
12201681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
12211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
12221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
12231681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
12241681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
12251681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
12261681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1227c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1228c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1229c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1230c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1231c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1232c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1233c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1234c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1235c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1236c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1237c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1238c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1239c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1240c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1241cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1242cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1243cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1244cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1245cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1246cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
12477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1248cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
12497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
12501ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
12519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1252c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1253c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1254c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1255c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
12561ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
12571ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
12581ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12591ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12601ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
12611ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
12621ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
12631ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
12641ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
12651ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12661ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12671ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
12689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
12699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
12709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12711ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
12721ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1273cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1274cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1275cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1276cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1277cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
12787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1279cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1280cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1281cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1282cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
12837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
12847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
128513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
128613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
128813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
129013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
129113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
129213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1293ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1294ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1295ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1296ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1297ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1298ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1299ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13005773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1301a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1302a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1303ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
13045773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
13055773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
13065773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1307ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1308dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
13095773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
13105773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1311dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1312ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1313ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
131413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
131513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
131613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
131713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1318acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1319acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1320acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1321acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1322acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1323acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1324acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1325acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1326acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1327acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1328acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1329acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1330acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1331acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1332acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1333c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1334c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
133513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
13361eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
13371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
13391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
13403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1341acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1342acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1343acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1344acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1345acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
13461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1347acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
13481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
13491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
13501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
13511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1352acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1353acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1354b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1355b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1356b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1357b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1358b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1359acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1360acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1361ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
13621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
13631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
13641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
13651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
13663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
13675cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
136813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1370ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13714125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1372a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1373a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if we don't have a buffer yet, we're translucent regardless of the
1374a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1375db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    if (mActiveBuffer == 0) {
1376a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1377db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1378a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1379a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1380a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
13814125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1382a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1383a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1384231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1385231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1386231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1387231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1388231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1389231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
13907a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
13917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1392a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
13937a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
13947a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
13957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1396b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
139713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1398c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
139913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
140013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
140213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
140413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
140513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
140613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
140713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
140813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
140913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
141013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
141113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
141213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
141313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
141413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
141513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
141613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
141713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
141813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
142213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
142713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
142813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
14297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
14307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
14317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
14327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
14357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
14367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (mCurrentState.handle != nullptr) {
143722851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        sp<IBinder> strongBinder = mCurrentState.handle.promote();
143822851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        sp<Handle> handle = nullptr;
143922851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        sp<Layer> handleLayer = nullptr;
144022851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        if (strongBinder != nullptr) {
144122851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza            handle = static_cast<Handle*>(strongBinder.get());
144222851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza            handleLayer = handle->owner.promote();
144322851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        }
144422851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza        if (strongBinder == nullptr || handleLayer == nullptr) {
14457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("[%s] Unable to promote Layer handle", mName.string());
14467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
14477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
14487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
14497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            mCurrentState.handle = nullptr;
14503bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
14513bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
14523bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
1453cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (handleLayer->addSyncPoint(syncPoint)) {
1454cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1455cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1456cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1457cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
1458cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mCurrentState.handle = nullptr;
1459cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
14607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
14617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
14637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1464f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
14657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
14677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
146905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
147005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
147105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
147205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
147305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
14747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
14767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
147805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
14817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mPendingStates[0].handle != nullptr) {
14827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
14837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
14847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
14857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
148705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
14887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
14907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
14917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1492cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1493cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1494cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1495cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1496cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1497cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1498cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1499cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1500cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1501cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1502cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
15037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
15047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
150505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
15107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1511792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1512792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
15137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
151505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
15167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
15177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
15227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
15237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
15297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1532cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
15331ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1534cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1535cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
15361ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1537cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1538cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
154213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
15431c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
15441c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
154605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
154705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
15487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
15497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15511eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15531eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
15541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1555a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1556a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1557cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
15589d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
15596905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1560419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1561b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1562419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1563b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1564c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1565c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
15661eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1567b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1568b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1569b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1570b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1571b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1572b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
15731eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
15741eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1575b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1576b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1577b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1578b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1580b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1581b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1582a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
15832a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
15842a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1585bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
15861eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1588cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
158982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
159082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
15910cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
15929e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
159313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
15940cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
15950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
15960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
15970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
15980cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
15990cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
16000cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
16019e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
16029e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
16039e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
16049e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
16050cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
16060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
16070cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
16080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
16090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
161013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always set active to requested, unless we're asked not to
161113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this is used by Layer, which special cases resizes.
161213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (flags & eDontUpdateGeometryState)  {
161313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    } else {
16147d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
161582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        if (mFreezePositionUpdates) {
161682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
161782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
161882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
161982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
162082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
162182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
162282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
162382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
162482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
162513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
162613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16271eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
162813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16321eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
163313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
163413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
163613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
163713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
16383dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
16393dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
164113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
164213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1643c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1644c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1645c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1646c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
16471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1648c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1649c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
165013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
165105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
165605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1657a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1658a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
165913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
166013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
166113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
166213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
166313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
166413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
166513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
166613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
166782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
16683dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
166913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
167013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
167169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
167269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
167369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
167469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
16753dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
167682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    if (immediate && !mFreezePositionUpdates) {
167782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
167882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
167982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
168069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
16817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
168313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
168413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
168582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
16861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
16871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
16881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
16891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
16901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
16921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
16931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
16941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
16961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1698ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
169913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
170113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
170213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
17037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
170413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
170513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
170613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
170813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
170913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
171013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
171113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
17137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
171413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
171513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
171613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
17189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
17199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
17209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
17219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
172213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
172313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
172413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
172513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
17267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
172713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
172813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
172913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
173013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
173113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
17323dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
173313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
17347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
173513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
173613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
173713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
173813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
17392ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
17407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
174113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
174313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
174413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
174513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
174613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
174813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
174913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
17507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
17517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
175213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
175313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
175413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
175599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
175699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
1757b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.crop == crop)
175813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
175913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
176099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
176199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    if (immediate) {
176299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
176399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
17647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
176513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
176613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
176713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1768acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosbool Layer::setFinalCrop(const Rect& crop) {
1769b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.finalCrop == crop)
1770acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1771acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
1772b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop = crop;
1773acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1774acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1775acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1776acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1778c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1779c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1780c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1781c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
178282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1783c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1784c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1785c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
17862f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
17872f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
17882f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
17892f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
17902f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
17912f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
17922f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1793c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1794c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1795c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1796c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1797c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1798c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1799c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
180013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
180113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
180213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
180313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
180413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
18057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
180613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
180713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1808a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1809a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1810bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1811bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1812bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1813bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1814bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1815bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1816bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1817bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1818bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1819bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
18201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
18211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    auto p = getParent();
18221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
18231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
18241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
18261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::deferTransactionUntil(const sp<IBinder>& handle,
18297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
18307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.handle = handle;
18317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
18327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
18337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
18347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
18357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
1836792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.handle = nullptr;
1837792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
18387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
18397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
18407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1841ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1842ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1843ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1844ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1845ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1846ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1847ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1848ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1849ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1850ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1851ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1852ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18576b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1858ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1859d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1860d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1861d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
18626b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
18630eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
18640eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
18650eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
18660eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
18676b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
18686b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
18690eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18700eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
18710eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
18720eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
18730eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
18740eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
18750eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18760eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
18770eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
18786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
18796b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
1880d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
1881d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
1882d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
1883d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
1884d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
18854d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
1886ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
188799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
188899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
18890a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
18903d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
18910a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const std::shared_ptr<FenceTime>& retireFence,
18920a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const CompositorTiming& compositorTiming) {
18933d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mAcquireTimeline.updateSignalTimes();
18943d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.updateSignalTimes();
18953d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1896d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
1897d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
189828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
189928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
190028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
190128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
190228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
190328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
190428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
19050a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson                glDoneFence, presentFence, compositorTiming);
19068cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
19078cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRetire(mPreviousFrameNumber,
19088cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    retireFence);
19098cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
191028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
191182dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
191228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
191328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
191428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
191582dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
19173d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
191828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
19193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
192028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
192128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
192228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
192328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
192428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
192582dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19263d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
19273d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
19283d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
19293d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    } else if (retireFence->isValid()) {
19303d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
19313d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(retireFence));
193228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
193328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
193428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
19353d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
19363d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
19373d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
1938d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
193928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
194028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
194128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
194228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
1943d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
1944d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
19459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1946f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
19475ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
19485ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return;
19495ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
19505ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
19513d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
1952d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
19533d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
19543d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
19553d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
19568cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    if (mPreviousFrameNumber != 0) {
19578cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mFrameEventHistory.addRelease(mPreviousFrameNumber,
19588cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                dequeueReadyTime, std::move(releaseFenceTime));
19598cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    }
19609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
19619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
19629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
19631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
19641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
19651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& parent = getParent();
19661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
19671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
19681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
19701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1972da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
197313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const Layer::State& s(mDrawingState);
19749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
19751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return !(isHiddenByPolicy()) && s.alpha > 0.0f
19769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
19781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return !(isHiddenByPolicy()) && s.alpha
19799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1981da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
1982da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
1983cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
1984cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
1985cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
1986cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
1987cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
1988cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1989cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
1990cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
1991cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
1992cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
1993cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
1994cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1995cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
1996cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
1997cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
1998cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
1999cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
2000cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
2001cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
2002cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2003cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2004cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
2005cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
2006cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
2007cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
2008cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2009d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
20111c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
20121c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2013399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
2014399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
2015399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
201612e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
201712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
201812e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
201912e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
20205bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
20215bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
20225bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
20231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
2024399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
2025399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
20264fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
2027223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
2028223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2029223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
203099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
2031223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
2032223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
2033223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
2034223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
2035223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
2036223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2037223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2038223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20391ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2040223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2041223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2042223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2043223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2044223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2045223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20462c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2047223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2048223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2049223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2050223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2051223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2052cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2053223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2054223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2055223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2056223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2057223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2058223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2059223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2060223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2061223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
20627b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
20637b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
20647b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    mOverrideScalingMode, mFreezePositionUpdates);
2065223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2066223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2067223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2068223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2069223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2070223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2071223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2072223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2073223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2074223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2075223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2076063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
20776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2078223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2079223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2080223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2081223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2082223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2083223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2084223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2085223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2086223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2087223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2088223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2089223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2090223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2091223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2092ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2093223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2094223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2095223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2096223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2097223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2098ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2099223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2100223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2101223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2102223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2103223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2104223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2105223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2106223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2107223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2108223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2109223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2110223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
21116b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
21136b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
21146b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2115223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2116223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2117ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
21181585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2119223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2120223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2121223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2125d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
212706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(
212806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            &mActiveBufferSlot);
2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2130223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2131223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2132223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2133702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2134d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2135d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2136d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2137d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2138d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2139d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2140d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2141d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
21423d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2143d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
21443d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
21458cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
21468cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRelease(mPreviousFrameNumber,
21478cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    latchTime, std::move(releaseFenceTime));
21488cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
2149d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2150d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2151d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2152223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2160bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2161bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2165223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2167223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2174702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2175223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2176223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2177223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2179223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2180702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2181702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2182223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2183702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2185223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2186223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2187223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2188cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2189223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2190223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2193223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2194223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2195223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2196223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2197223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2202223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2205223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2206223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2207cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2208cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2209223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2210cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2211223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2212223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2213223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2214223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
22151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
22161c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22174fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
222013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
222113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
222213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
222313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
222413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
222513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
222613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
222703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
222803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
222903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
223013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
223113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
223213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
223313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
223413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
223513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
223613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
223713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
223813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
223913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
224013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
224113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
224213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
224313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
224413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
224513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
224613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
224713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
224813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
224913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
225013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
225113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
225213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22533e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
22541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
22551eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
225613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22573e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
225874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
225913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
226013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
22613e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
226213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22632ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
226413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2265ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
226613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
226713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
226874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2269acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2270acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
227113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
22729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
22739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
22759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
227713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
22781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
22791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
22801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2281b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2282b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2283b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2284b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
22854125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
228613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
22873dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
22883dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
228913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
22901b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2291a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2292a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
22931b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
22941b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
22951b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
22961b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2297a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
22981b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
229974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
23001b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2301ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
23026905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2303a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
23046905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
23051b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2306bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
23073d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2308bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2309d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2310d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
23119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2312e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2313e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2314e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2315e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2316e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2317e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2318e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2319e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2320e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2321e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2322e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2323e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2324e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2325e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2326e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2327e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2328e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2329e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2330e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2331e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2332e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2333e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2334e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2335e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2336e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2337e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2338e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2339e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2340e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2341e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2342e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2343e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2344e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2345e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2346e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2347e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2348e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2349e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
235071bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza    const gfx::FloatRect& crop = hwcInfo.sourceCrop;
2351e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2352e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2353e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2354e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2355e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2356e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
23579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2358e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2359d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2360d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
236182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
236282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2363d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2364d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
236525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
236625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
23676547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
23686547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
23696547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
23706547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2371d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2372d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2373d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2374d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2375d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2376d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2377d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2378d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2379d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2380d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2381d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2382d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
23835ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
23845ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
23855ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
23865ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
23875ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
23883890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
23893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2390d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2391d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
23923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2393d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2394d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
239540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
23963890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
23973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2398d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
239940845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2400e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2401e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2402e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2403e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2404e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2405e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2406e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2407e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2408e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2409e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2410e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2411e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2412e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2413e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2414367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2415367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2416367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2417367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
24181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
24191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
24201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
24211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
24241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
24251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
24261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24281db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
24291db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
24301db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
24311db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
24321db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
24331db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24341db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
24351db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
24361db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
24371db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
24381db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
24391db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24401db73f66624e7d151710483dd58e03eed672f064Robert Carr
24411db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
24421db73f66624e7d151710483dd58e03eed672f064Robert Carr        newParent->addChild(child);
24431db73f66624e7d151710483dd58e03eed672f064Robert Carr
24441db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
24451db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
24461db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
24471db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
24481db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24491db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
24501db73f66624e7d151710483dd58e03eed672f064Robert Carr
24511db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
24521db73f66624e7d151710483dd58e03eed672f064Robert Carr}
24531db73f66624e7d151710483dd58e03eed672f064Robert Carr
24541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
24551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mParent = layer;
24561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
24591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
24601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
24611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
24641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
24651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
24661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
24681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
24711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
24721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
24751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Negatively signed children are before 'this' in Z-order.
24761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
24771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) {
24781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
24791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
24801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() >= 0)
24821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
24831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
24841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
24861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
24871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
24891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
24931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Positively signed children are before 'this' in reverse Z-order.
24941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
24951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) {
24961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
24971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (i = mDrawingChildren.size()-1; i>=0; i--) {
24981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
24991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() < 0) {
25001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
25011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
25021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
25031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
25051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
25061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
25081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
25121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
25131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
25141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
25151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
25161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
25181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
25211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
25221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
25231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
25241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
25261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
252813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
252913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
25303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
25333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
25343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
25373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
25383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2539