Layer.cpp revision ecf0fa5340c54757870881c5d24eb331c517d78c
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0
189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG
199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer"
201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h>
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h>
351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h>
41a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
4290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h>
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
453e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h"
460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
487b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h"
49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
54875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
56c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex>
57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE    0
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1;
6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    :   contentDirty(false),
6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        sequence(uint32_t(android_atomic_inc(&sSequence))),
7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFlinger(flinger),
71a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mTextureName(-1U),
7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mPremultipliedAlpha(true),
7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mName("unnamed"),
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFormat(PIXEL_FORMAT_NONE),
7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mTransactionFlags(0),
767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStateMutex(),
777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mPendingStates(),
78a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mQueuedFrames(0),
79399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStreamChanged(false),
80a9347647eca3101c014be902b713772de3977d87Mathias Agopian        mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentTransform(0),
82933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
83c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        mOverrideScalingMode(-1),
84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        mCurrentOpacity(true),
85d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mBufferLatched(false),
86cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        mCurrentFrameNumber(0),
878cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mPreviousFrameNumber(0),
884d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        mRefreshPending(false),
8982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        mFrameLatencyNeeded(false),
9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mFiltering(false),
9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mNeedsFiltering(false),
925cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mIsGlesComposition(false),
959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mProtectedByApp(false),
9713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        mHasSurface(false),
9803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        mClientRef(client),
99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mPotentialCursor(false),
100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemLock(),
101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition(),
102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItems(),
10365476f3332641066a99e22338bf5cf49ce4af642Dan Stoza        mLastFrameNumberReceived(0),
10404839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos        mUpdateTexImageFailed(false),
10582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mAutoRefresh(false),
10682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mFreezePositionUpdates(false)
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Creating Layer %s", name.string());
1109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
112a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mCurrentCrop.makeInvalid();
1133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
11449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    uint32_t layerFlags = 0;
1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eHidden)
1184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerHidden;
1194125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (flags & ISurfaceComposerClient::eOpaque)
1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        layerFlags |= layer_state_t::eLayerOpaque;
121231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    if (flags & ISurfaceComposerClient::eSecure)
122231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza        layerFlags |= layer_state_t::eLayerSecure;
1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (flags & ISurfaceComposerClient::eNonPremultiplied)
1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mPremultipliedAlpha = false;
1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mName = name;
1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.w = w;
1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.active.h = h;
1313dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.active.transform.set(0, 0);
132b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.crop.makeInvalid();
133b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop.makeInvalid();
1344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.z = 0;
1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mCurrentState.alpha = 1.0f;
1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mCurrentState.alpha = 0xFF;
1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.layerStack = 0;
1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.flags = layerFlags;
1424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.sequence = 0;
1434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mCurrentState.requested = mCurrentState.active;
144bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
1452f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.appId = 0;
1462f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    mCurrentState.type = 0;
1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    // drawing state & current state are identical
1494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mDrawingState = mCurrentState;
1506547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
1519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& hwc = flinger->getHwComposer();
1539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    nsecs_t displayPeriod =
1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1596547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
1600a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1610a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming compositorTiming;
1620a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    flinger->getCompositorTiming(&compositorTiming);
1630a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
164e8696a40e09b24b634214684d18526187b316a2fJamie Gennis}
165e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
1663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() {
167bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
168b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer;
169b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer;
170468051e20be19130572231266db306396a56402bIrvel    BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true);
1711db73f66624e7d151710483dd58e03eed672f064Robert Carr    mProducer = new MonitoredProducer(producer, mFlinger, this);
172468051e20be19130572231266db306396a56402bIrvel    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this);
173bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
174399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mSurfaceFlingerConsumer->setContentsChangedListener(this);
1754d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mSurfaceFlingerConsumer->setName(mName);
176b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
17763a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    if (mFlinger->isLayerTripleBufferingDisabled()) {
17863a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard        mProducer->setMaxDequeuedBufferCount(2);
17963a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard    }
1806905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1818430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
1828430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    updateTransformHint(hw);
183b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
18496f0819f81293076e652792794a961543e6750d7Mathias Agopian
1854d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() {
1868ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos  sp<Client> c(mClientRef.promote());
1878ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    if (c != 0) {
1888ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos        c->detachLayer(this);
1898ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos    }
1908ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos
191cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mRemoteSyncPoints) {
192cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        point->setTransactionApplied();
193cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    }
194c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    for (auto& point : mLocalSyncPoints) {
195c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza        point->setFrameAvailable();
196c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
197921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    mFlinger->deleteTextureAsync(mTextureName);
1986547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
19996f0819f81293076e652792794a961543e6750d7Mathias Agopian}
20096f0819f81293076e652792794a961543e6750d7Mathias Agopian
20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks
20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.empty()) {
2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface* layer) {
2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer) {
2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer->onDisplayed();
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
22113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
2226b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) {
2236b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    // Add this buffer from our internal queue tracker
2246b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    { // Autolock scope
2256b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        Mutex::Autolock lock(mQueueItemLock);
226468051e20be19130572231266db306396a56402bIrvel        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
227468051e20be19130572231266db306396a56402bIrvel                item.mGraphicBuffer->getHeight(), item.mFrameNumber);
228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Reset the frame number tracker when we receive the first buffer after
229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // a frame number reset
230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        if (item.mFrameNumber == 1) {
231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            mLastFrameNumberReceived = 0;
232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Ensure that callbacks are handled in order
235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                    ms2ns(500));
238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            if (result != NO_ERROR) {
239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            }
241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        mQueueItems.push_back(item);
244ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        android_atomic_inc(&mQueuedFrames);
245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        // Wake up any pending callbacks
247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        mQueueItemCondition.broadcast();
2496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2506b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
25199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger->signalLayerUpdate();
252579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
253579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
2546b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) {
2557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    { // Autolock scope
2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        Mutex::Autolock lock(mQueueItemLock);
257a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Ensure that callbacks are handled in order
2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                    ms2ns(500));
2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (result != NO_ERROR) {
2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] Timed out waiting on callback", mName.string());
2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
265a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        }
266a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza
2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        if (mQueueItems.empty()) {
2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            ALOGE("Can't replace a frame on an empty queue");
2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            return;
2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
2714d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake up any pending callbacks
2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mLastFrameNumberReceived = item.mFrameNumber;
2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mQueueItemCondition.broadcast();
2766b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    }
2776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
2786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
27906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wuvoid Layer::onBuffersReleased() {
28006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#ifdef USE_HWC2
28106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    Mutex::Autolock lock(mHwcBufferCacheMutex);
28206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
28306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    for (auto info : mHwcBufferCaches) {
28406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        info.second.clear();
28506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    }
28606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#endif
28706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu}
28806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
289399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() {
290399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
291399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was false
292399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mFlinger->signalLayerUpdate();
293399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
294399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
295399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2966710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after
2976710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before
2986710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list)
29913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() {
300bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    mSurfaceFlingerConsumer->abandon();
3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->onRemoved();
3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
30448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian}
305cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up
30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3101eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const {
31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mName;
31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h,
31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                            PixelFormat format, uint32_t flags)
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t const maxSurfaceDims = min(
31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // never allow a surface larger than what our underlying GL implementation
32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // can handle.
32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return BAD_VALUE;
32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFormat = format;
32813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
32903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentOpacity = getOpacityForFormat(format);
33213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
33613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return NO_ERROR;
33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
3404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() {
3414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    Mutex::Autolock _l(mLock);
3424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
3444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            "Layer::getHandle() has already been called");
3454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHasSurface = true;
3474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
3484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return new Handle(mFlinger, this);
349582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
350582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
351b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const {
352b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza    return mProducer;
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up
35713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
35813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
359a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const {
360a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // this is the crop rectangle that applies to the buffer
361a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    // itself (as opposed to the window)
362f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop;
363f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!mCurrentCrop.isEmpty()) {
364a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if the buffer crop is defined, we use that
365f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = mCurrentCrop;
366a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian    } else if (mActiveBuffer != NULL) {
367a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // otherwise we use the whole buffer
368a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        crop = mActiveBuffer->getBounds();
369f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    } else {
370a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian        // if we don't have a buffer yet, we use an empty/invalid crop
3714fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        crop.makeInvalid();
372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return crop;
374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
375f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
376f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) {
377f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (CC_LIKELY(exclude.isEmpty())) {
378f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win;
379f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
380f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    if (exclude.isRect()) {
381f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian        return win.reduce(exclude.getBounds());
382f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    }
383f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    return Region(win).subtract(exclude).getBounds();
384f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian}
385f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(getDrawingState());
3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win(s.active.w, s.active.h);
3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (!s.crop.isEmpty()) {
3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(s.crop, &win);
3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    win = t.transform(win);
3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const sp<Layer>& p = getParent();
3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Now we need to calculate the parent bounds, so we can clip ourselves to those.
3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // When calculating the parent bounds for purposes of clipping,
4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // we don't need to constrain the parent to its transparent region.
4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // The transparent region is an optimization based on the
4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer contents of the layer, but does not affect the space allocated to
4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // it by policy, and thus children should be allowed to extend into the
4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // parent's transparent region. In fact one of the main uses, is to reduce
4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // buffer allocation size in cases where a child window sits behind a main window
4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // (by marking the hole in the parent window as a transparent region)
4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        Rect bounds = p->computeScreenBounds(false);
4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bounds.intersect(win, &win);
4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (reduceTransparentRegion) {
4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = reduce(win, screenTransparentRegion);
4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return win;
4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
42013127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const {
4211eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
4226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return computeBounds(s.activeTransparentRegion);
4236c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine}
4246c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine
4256c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const {
4266c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    const Layer::State& s(getDrawingState());
42713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    Rect win(s.active.w, s.active.h);
428b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr
429b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
430b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
43113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
4321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect bounds = win;
4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
436de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // Look in computeScreenBounds recursive call for explanation of
437de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        // why we pass false here.
438de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr        bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
4391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
4441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win.intersect(bounds, &win);
4451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
4461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4486c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian    // subtract the transparent region and snap to the bounds
4496c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    return reduce(win, activeTransparentRegion);
45013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
45113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
4521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
453b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    // the crop is the area of the window that gets cropped, but not
45413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // scaled in any ways.
4551eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
45613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
45713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the projection's clipping to the window crop in
45813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // layerstack space, and convert-back to layer space.
4596b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // if there are no window scaling involved, this operation will map to full
4606b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // pixels in the buffer.
4616b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
4626b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian    // a viewport clipping and a window transform. we should use floating point to fix this.
4630e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4640e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    Rect activeCrop(s.active.w, s.active.h);
465b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
466b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        activeCrop = s.crop;
4670e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian    }
4680e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian
4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.transform(activeCrop);
471acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
472acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
473acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
474b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
475b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
476acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
477acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
478acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return activeCrop;
4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4825a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // the content crop is the area of the content that gets scaled to the
4841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // layer's size. This is in buffer space.
4855a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect crop = getContentCrop().toFloatRect();
4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // In addition there is a WM-specified crop we pull from our drawing state.
4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const State& s(getDrawingState());
4891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
4901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Screen space to make reduction to parent crop clearer.
4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect activeCrop = computeInitialCrop(hw);
4921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
4931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
4941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        auto parentCrop = p->computeInitialCrop(hw);
4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop.intersect(parentCrop, &activeCrop);
4961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
4971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
4981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    // Back to layer space to work with the content crop.
4991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    activeCrop = t.inverse().transform(activeCrop);
50013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
50128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // This needs to be here as transform.transform(Rect) computes the
50228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transformed rect and then takes the bounding box of the result before
50328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // returning. This means
50428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // transform.inverse().transform(transform.transform(Rect)) != Rect
50528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // in which case we need to make sure the final rect is clipped to the
50628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine    // display bounds.
507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
508acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        activeCrop.clear();
509acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
51013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
511f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    // subtract the transparent region and snap to the bounds
512f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
513f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian
514acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // Transform the window crop to match the buffer coordinate system,
515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // which means using the inverse of the current transform set on the
516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // SurfaceFlingerConsumer.
517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    uint32_t invTransform = mCurrentTransform;
518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
519acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        /*
520021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
521021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
522acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos         */
523021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransformOrient =
524021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // calculate the inverse transform
526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
52913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // and apply to the current transform
5310f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
5320f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos                .getOrientation();
533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winWidth = s.active.w;
536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    int winHeight = s.active.h;
537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // If the activeCrop has been rotate the ends are rotated but not
539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // the space itself so when transforming ends back we can't rely on
540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // a modification of the axes of rotation. To account for this we
541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // need to reorient the inverse rotation in terms of the current
542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        // axes of rotation.
543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (is_h_flipped == is_v_flipped) {
546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winWidth = s.active.h;
550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        winHeight = s.active.w;
551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    const Rect winCrop = activeCrop.transform(
553acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            invTransform, s.active.w, s.active.h);
55413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    // below, crop is intersected with winCrop expressed in crop's coordinate space
556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float xScale = crop.getWidth()  / float(winWidth);
557acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float yScale = crop.getHeight() / float(winHeight);
55813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
559acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetL = winCrop.left                 * xScale;
560acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetT = winCrop.top                  * yScale;
561acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetR = (winWidth - winCrop.right )  * xScale;
562acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    float insetB = (winHeight - winCrop.bottom) * yScale;
563acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
564acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.left   += insetL;
565acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.top    += insetT;
566acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.right  -= insetR;
567acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    crop.bottom -= insetB;
56813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
56913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return crop;
57013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
57113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
5729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
573ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry(
5769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw,
5779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer)
5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
579a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
5809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto hwcId = displayDevice->getHwcDisplayId();
5829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setDefaultState();
5859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
586a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
5873e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    // enable this layer
5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    hwcInfo.forceClientComposition = false;
5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (isSecure() && !displayDevice->isSecure()) {
5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
5949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
5959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSkip(false);
5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (isSecure() && !hw->isSecure()) {
6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
6019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
603dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
60413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this gives us only the "orientation" component of the transform
6051eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
6069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
607ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto blendMode = HWC2::BlendMode::None;
6089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (!isOpaque(s) || s.alpha != 1.0f) {
609ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman        blendMode = mPremultipliedAlpha ?
6109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
6119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
612ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    auto error = hwcLayer->setBlendMode(blendMode);
613ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
614ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             " %s (%d)", mName.string(), to_string(blendMode).c_str(),
615ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman             to_string(error).c_str(), static_cast<int32_t>(error));
6169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!isOpaque(s) || s.alpha != 0xFF) {
6189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBlending(mPremultipliedAlpha ?
6199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_PREMULT :
6209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                HWC_BLENDING_COVERAGE);
6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
6229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
62313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
62413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // apply the layer's transform, followed by the display's global transform
62513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // here we're guaranteed that the layer's transform preserves rects
6266c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    Region activeTransparentRegion(s.activeTransparentRegion);
6271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
628b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
629b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        Rect activeCrop(s.crop);
6301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.transform(activeCrop);
6319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
632acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
6339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
6349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
6359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
636acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
637acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        activeCrop = t.inverse().transform(activeCrop, true);
63928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // This needs to be here as transform.transform(Rect) computes the
64028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transformed rect and then takes the bounding box of the result before
64128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // returning. This means
64228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // transform.inverse().transform(transform.transform(Rect)) != Rect
64328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // in which case we need to make sure the final rect is clipped to the
64428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine        // display bounds.
645acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
646acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            activeCrop.clear();
647acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
6486c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        // mark regions outside the crop as transparent
6496c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
6506c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
6516c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, s.active.h));
6526c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
6536c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                activeCrop.left, activeCrop.bottom));
6546c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
6556c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine                s.active.w, activeCrop.bottom));
6566c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine    }
6571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
6581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(t.transform(computeBounds(activeTransparentRegion)));
659b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
660b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if(!frame.intersect(s.finalCrop, &frame)) {
661acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            frame.clear();
662acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
663acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
665acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
666acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        frame.clear();
667acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr(displayDevice->getTransform());
6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect transformedFrame = tr.transform(frame);
670ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman    error = hwcLayer->setDisplayFrame(transformedFrame);
671e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
672e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
673e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                mName.string(), transformedFrame.left, transformedFrame.top,
674e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                transformedFrame.right, transformedFrame.bottom,
675e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
676e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
677e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.displayFrame = transformedFrame;
678e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6805a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    FloatRect sourceCrop = computeCrop(displayDevice);
6819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSourceCrop(sourceCrop);
682e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (error != HWC2::Error::None) {
683e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
684e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top,
685e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
686e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza                static_cast<int32_t>(error));
687e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
688e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        hwcInfo.sourceCrop = sourceCrop;
689e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
6919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setPlaneAlpha(s.alpha);
6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
6939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(),
6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
696ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr    error = hwcLayer->setZOrder(z);
6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
698ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            mName.string(), z, to_string(error).c_str(),
6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
7002f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
7012f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    error = hwcLayer->setInfo(s.type, s.appId);
7022f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)",
7032f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara             mName.string(), static_cast<int32_t>(error));
7049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!frame.intersect(hw->getViewport(), &frame)) {
7069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.clear();
7079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
7099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setFrame(tr.transform(frame));
7109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setCrop(computeCrop(hw));
7119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setPlaneAlpha(s.alpha);
7129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7139f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian
71429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    /*
71529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * Transformations are applied in this order:
71629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 1) buffer orientation/flip/mirror
71729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 2) state transformation (window manager)
71829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * 3) layer orientation (screen orientation)
71929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     * (NOTE: the matrices are multiplied in reverse order)
72029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian     */
72129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
72229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    const Transform bufferOrientation(mCurrentTransform);
7231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform transform(tr * t * bufferOrientation);
724c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
725c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
726c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        /*
727021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * the code below applies the primary display's inverse transform to the
728021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos         * buffer
729c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian         */
730021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t invTransform =
731021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                DisplayDevice::getPrimaryDisplayOrientationTransform();
732c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // calculate the inverse transform
733c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
734c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
735c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
736c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
737c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        // and apply to the current transform
7380f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos        transform = Transform(invTransform) * transform;
739c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
74029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
74129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    // this gives us only the "orientation" component of the transform
74213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t orientation = transform.getOrientation();
7439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (orientation & Transform::ROT_INVALID) {
7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // we can only handle simple transformation
7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.forceClientComposition = true;
7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto transform = static_cast<HWC2::Transform>(orientation);
7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        auto error = hwcLayer->setTransform(transform);
7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                "%s (%d)", mName.string(), to_string(transform).c_str(),
7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
7559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (orientation & Transform::ROT_INVALID) {
7569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // we can only handle simple transformation
7579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSkip(true);
7589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
7599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setTransform(orientation);
7609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
7619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
762a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
763a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
7649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) {
7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].forceClientComposition = true;
7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
7739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply this display's projection's viewport to the visible region
7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // before giving it to the HWC HAL.
7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const Transform& tr = displayDevice->getTransform();
7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const auto& viewport = displayDevice->getViewport();
7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Region visible = tr.transform(visibleRegion.intersect(viewport));
7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = mHwcLayers[hwcId].layer;
7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = hwcLayer->setVisibleRegion(visible);
7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
7879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        visible.dump(LOG_TAG);
7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != HWC2::Error::None) {
7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
7949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                to_string(error).c_str(), static_cast<int32_t>(error));
7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        surfaceDamageRegion.dump(LOG_TAG);
7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
7979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
7980f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Sideband layers
7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mSidebandStream.get()) {
8000f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Sideband);
8010f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Sideband composition", mName.string());
8020f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
8039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (error != HWC2::Error::None) {
8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
8059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    mName.string(), mSidebandStream->handle(),
8069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
8080f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
8110a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // Client layers
8120a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mHwcLayers[hwcId].forceClientComposition ||
8130a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
8140f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Client composition", mName.string());
8159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Client);
8160f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        return;
8170f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8180f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
8190a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    // SolidColor layers
8200a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    if (mActiveBuffer == nullptr) {
8210a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        setCompositionType(hwcId, HWC2::Composition::SolidColor);
822c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
823c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // For now, we only support black for DimLayer
8240a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        error = hwcLayer->setColor({0, 0, 0, 255});
8250a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        if (error != HWC2::Error::None) {
8260a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza            ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
8270a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
8280a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        }
829c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
830c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // Clear out the transform, because it doesn't make sense absent a
831c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        // source buffer
832c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        error = hwcLayer->setTransform(HWC2::Transform::None);
833c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        if (error != HWC2::Error::None) {
834c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza            ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
835c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza                    to_string(error).c_str(), static_cast<int32_t>(error));
836c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza        }
837c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza
8380a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza        return;
8390a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza    }
8400a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza
8410f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    // Device or Cursor layers
8420f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (mPotentialCursor) {
8430f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGV("[%s] Requesting Cursor composition", mName.string());
8440f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Cursor);
8459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
8469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("[%s] Requesting Device composition", mName.string());
8479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        setCompositionType(hwcId, HWC2::Composition::Device);
8489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
8490f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza
850bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
851bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    error = hwcLayer->setDataspace(mCurrentState.dataSpace);
852bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (error != HWC2::Error::None) {
853bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
854bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              mCurrentState.dataSpace, to_string(error).c_str(),
855bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter              static_cast<int32_t>(error));
856bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    }
857bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
85806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    uint32_t hwcSlot = 0;
85906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    buffer_handle_t hwcHandle = nullptr;
86006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    {
86106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        Mutex::Autolock lock(mHwcBufferCacheMutex);
86206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
86306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        auto& hwcBufferCache = mHwcBufferCaches[hwcId];
86406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        sp<GraphicBuffer> hwcBuffer;
86506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        hwcBufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer,
86606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu                &hwcSlot, &hwcBuffer);
86706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        if (hwcBuffer != nullptr) {
86806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            hwcHandle = hwcBuffer->handle;
86906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu        }
87006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    }
87106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu
8720f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
87306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    error = hwcLayer->setBuffer(hwcSlot, hwcHandle, acquireFence);
8740f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    if (error != HWC2::Error::None) {
8750f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
8760f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                mActiveBuffer->handle, to_string(error).c_str(),
8770f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza                static_cast<int32_t>(error));
8780f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza    }
8799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
8819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we have to set the visible region on every frame because
8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // we currently free it during onLayerDisplayed(), which is called
8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // after HWComposer::commit() -- every frame.
8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // Apply this display's projection's viewport to the visible region
8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // before giving it to the HWC HAL.
8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr = hw->getTransform();
8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
8909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setVisibleRegionScreen(visible);
8919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setSurfaceDamage(surfaceDamageRegion);
8929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
893ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
8949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (mSidebandStream.get()) {
8959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setSidebandStream(mSidebandStream);
8969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
8979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // NOTE: buffer can be NULL if the client never drew into this
8989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // layer yet, or if we ran out of memory
8999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        layer.setBuffer(mActiveBuffer);
9009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
9039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
9059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
9069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto hwcId = displayDevice->getHwcDisplayId();
9079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0 ||
9089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
9099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
9109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // This gives us only the "orientation" component of the transform
9139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    const State& s(getCurrentState());
914dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
9159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Apply the layer's transform, followed by the display's global transform
9169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Here we're guaranteed that the layer's transform preserves rects
9179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect win(s.active.w, s.active.h);
918b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.crop.isEmpty()) {
919b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        win.intersect(s.crop, &win);
9209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    // Subtract the transparent region and snap to the bounds
9229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Rect bounds = reduce(win, s.activeTransparentRegion);
9231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    frame.intersect(displayDevice->getViewport(), &frame);
925b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
926b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        frame.intersect(s.finalCrop, &frame);
927acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
9289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& displayTransform(displayDevice->getTransform());
9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto position = displayTransform.transform(frame);
9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
9329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top);
9339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
9349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "to (%d, %d): %s (%d)", mName.string(), position.left,
9359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            position.top, to_string(error).c_str(),
9369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            static_cast<int32_t>(error));
9379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
9399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        HWComposer::HWCLayerInterface& layer) {
9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    int fenceFd = -1;
9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // TODO: there is a possible optimization here: we only need to set the
9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // acquire fence the first time a new buffer is acquired on EACH display.
9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
9489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (fence->isValid()) {
9499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            fenceFd = fence->dup();
9509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            if (fenceFd == -1) {
9519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
9529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            }
9539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        }
9549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    layer.setAcquireFenceFd(fenceFd);
9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition(
9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const sp<const DisplayDevice>& hw)
9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{
9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // this gives us only the "orientation" component of the transform
9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const State& s(getCurrentState());
9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // apply the layer's transform, followed by the display's global transform
9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // here we're guaranteed that the layer's transform preserves rects
9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect win(s.active.w, s.active.h);
9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.crop.isEmpty()) {
9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        win.intersect(s.crop, &win);
9699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // subtract the transparent region and snap to the bounds
9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    Rect bounds = reduce(win, s.activeTransparentRegion);
9721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect frame(getTransform().transform(bounds));
9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    frame.intersect(hw->getViewport(), &frame);
9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (!s.finalCrop.isEmpty()) {
9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        frame.intersect(s.finalCrop, &frame);
9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    const Transform& tr(hw->getTransform());
9789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return Rect(tr.transform(frame));
9799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
9809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
98103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews
98213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
98313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing...
98413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
98613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
987c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, clip, false);
98813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
98913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
990c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw,
991c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const {
992c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
99313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
99413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
995c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const {
996c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    onDraw(hw, Region(hw->bounds()), false);
997c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza}
998c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
999c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
1000c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
10021c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
10031c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
1004a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (CC_UNLIKELY(mActiveBuffer == 0)) {
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the texture has not been created yet, this Layer has
1006179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // in fact never been drawn into. This happens frequently with
1007179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // SurfaceView because the WindowManager can't know when the client
1008179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // has drawn the first time.
1009179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1010179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // If there is nothing under us, we paint the screen in black, otherwise
1011179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // we just skip this update.
1012179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
1013179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // figure out if there is something below us
1014179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region under;
10151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        bool finished = false;
10161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) {
10171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            if (finished || layer == static_cast<Layer const*>(this)) {
10181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                finished = true;
10191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr                return;
10201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            }
10214297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
10221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        });
1023179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        // if not everything below us is covered, we plug the holes!
1024179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        Region holes(clip.subtract(under));
1025179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        if (!holes.isEmpty()) {
10261748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard            clearWithOpenGL(hw, 0, 0, 0, 1);
1027179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian        }
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1030a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
103197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // Bind the current buffer to the GL texture, and wait for it to be
103297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    // ready for us to draw into.
1033bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
1034bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
103597eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
1036dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // Go ahead and draw the buffer anyway; no matter what we do the screen
1037dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall        // is probably going to have something visibly wrong.
1038dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall    }
1039dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall
1040dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
1041dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis
1042875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1043875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian
1044dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    if (!blackOutLayer) {
1045cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // TODO: we could be more subtle with isFixedSize()
1046eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
1047cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1048cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Query the texture matrix given our current filtering mode.
1049cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        float textureMatrix[16];
1050bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
1051bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
1052cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
1053c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
1054c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1055c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            /*
1056021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the code below applies the primary display's inverse transform to
1057021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos             * the texture transform
1058c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian             */
1059c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1060c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // create a 4x4 transform matrix from the display transform flags
1061c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
1062c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
1063c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
1064c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1065c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            mat4 tr;
1066021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            uint32_t transform =
1067021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                    DisplayDevice::getPrimaryDisplayOrientationTransform();
1068c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
1069c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * rot90;
1070c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
1071c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * flipH;
1072c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
1073c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian                tr = tr * flipV;
1074c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1075c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // calculate the inverse
1076c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            tr = inverse(tr);
1077c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1078c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            // and finally apply it to the original texture matrix
1079c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1080c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1081c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        }
1082c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
1083cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis        // Set things up for texturing.
108449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
108549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setFiltering(useFiltering);
108649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        mTexture.setMatrix(textureMatrix);
108749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian
108849457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian        engine.setupLayerTexturing(mTexture);
1089a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    } else {
1090875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        engine.setupLayerBlackedOut();
1091a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    }
10928578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard    drawWithOpenGL(hw, useIdentityTransform);
1093875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableTexturing();
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1097c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
10981748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        float red, float green, float blue,
1099c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        float alpha) const
110013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
110119733a32799f792125913e746e8644d16f8dc223Mathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
1102c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, false);
110319733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.setupFillWithColor(red, green, blue, alpha);
110419733a32799f792125913e746e8644d16f8dc223Mathias Agopian    engine.drawMesh(mMesh);
110513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
110613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
110713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL(
11081748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard        const sp<const DisplayDevice>& hw) const {
11091748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard    clearWithOpenGL(hw, 0,0,0,0);
111013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
111113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1112c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
11138578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard        bool useIdentityTransform) const {
11141eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const State& s(getDrawingState());
111513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1116c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    computeGeometry(hw, mMesh, useIdentityTransform);
111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
111813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    /*
111913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * NOTE: the way we compute the texture coordinates here produces
112013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * different results than when we take the HWC path -- in the later case
112113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * the "source crop" is rounded to texel boundaries.
112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * This can produce significantly different results when the texture
112313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * is scaled by a large amount.
112413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     *
112513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * The GL code below is more logical (imho), and the difference with
112613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * HWC is due to a limitation of the HWC API to integers -- a question
1127c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian     * is suspend is whether we should ignore this problem or revert to
112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * GL composition when a buffer scaling is applied (maybe with some
112913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * minimal value)? Or, we could make GL behave like HWC -- but this feel
113013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     * like more of a hack.
113113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian     */
1132acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    Rect win(computeBounds());
1133acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
11341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t = getTransform();
1135b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
11361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.transform(win);
1137b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        if (!win.intersect(s.finalCrop, &win)) {
1138acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1139acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
11401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        win = t.inverse().transform(win);
1141acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        if (!win.intersect(computeBounds(), &win)) {
1142acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            win.clear();
1143acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        }
1144acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
114513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float left   = float(win.left)   / float(s.active.w);
11473f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float top    = float(win.top)    / float(s.active.h);
11483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float right  = float(win.right)  / float(s.active.w);
11493f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float bottom = float(win.bottom) / float(s.active.h);
115013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1151875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // TODO: we probably want to generate the texture coords with the mesh
1152875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    // here we assume that we only have 4 vertices
1153ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1154ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[0] = vec2(left, 1.0f - top);
1155ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[1] = vec2(left, 1.0f - bottom);
1156ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[2] = vec2(right, 1.0f - bottom);
1157ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    texCoords[3] = vec2(right, 1.0f - top);
115813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1159875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    RenderEngine& engine(mFlinger->getRenderEngine());
11604125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
11615cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    engine.drawMesh(mMesh);
1162875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    engine.disableBlending();
116313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
116413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
11659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
11669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
11679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool callIntoHwc) {
11689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setCompositionType called without a valid HWC layer");
11709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
11719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcInfo = mHwcLayers[hwcId];
11739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto& hwcLayer = hwcInfo.layer;
11749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
11759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            to_string(type).c_str(), static_cast<int>(callIntoHwc));
11769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwcInfo.compositionType != type) {
11779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("    actually setting");
11789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        hwcInfo.compositionType = type;
11799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        if (callIntoHwc) {
11809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            auto error = hwcLayer->setCompositionType(type);
11819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
11829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    "composition type %s: %s (%d)", mName.string(),
11839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    to_string(type).c_str(), to_string(error).c_str(),
11849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                    static_cast<int32_t>(error));
11859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        }
11869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
11889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
11899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1190ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
1191ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // If we're querying the composition type for a display that does not
1192ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        // have a HWC counterpart, then it will always be Client
1193ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        return HWC2::Composition::Client;
1194ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza    }
11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
1196ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza        ALOGE("getCompositionType called with an invalid HWC layer");
11979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return HWC2::Composition::Invalid;
11989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
11999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).compositionType;
12009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) {
12039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("setClearClientTarget called without a valid HWC layer");
12059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
12069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mHwcLayers[hwcId].clearClientTarget = clear;
12089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const {
12119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
12129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE("getClearClientTarget called without a valid HWC layer");
12139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return false;
12149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mHwcLayers.at(hwcId).clearClientTarget;
12169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
12179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
12191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const {
12201681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int producerStickyTransform = 0;
12211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
12221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    if (ret != OK) {
12231681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
12241681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk                strerror(-ret), ret);
12251681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk        return 0;
12261681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    }
12271681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    return static_cast<uint32_t>(producerStickyTransform);
12281681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk}
12291681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk
1230c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() {
1231c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool propertyLoaded = false;
1232c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static bool latch = false;
1233c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    static std::mutex mutex;
1234c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    std::lock_guard<std::mutex> lock(mutex);
1235c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (!propertyLoaded) {
1236c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        char value[PROPERTY_VALUE_MAX] = {};
1237c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        property_get("debug.sf.latch_unsignaled", value, "0");
1238c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        latch = atoi(value);
1239c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        propertyLoaded = true;
1240c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1241c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    return latch;
1242c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza}
1243c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
1244cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const {
1245cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mQueueItemLock);
1246cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (!mQueueItems.empty()) {
1247cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mQueueItems[0].mFrameNumber;
1248cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    } else {
1249cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return mCurrentFrameNumber;
12507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1251cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza}
12527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
12531ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const {
12549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1255c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    if (latchUnsignaledBuffers()) {
1256c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza        return true;
1257c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza    }
1258c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza
12591ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
12601ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems.empty()) {
12611ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12621ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12631ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    if (mQueueItems[0].mIsDroppable) {
12641ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // Even though this buffer's fence may not have signaled yet, it could
12651ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // be replaced by another buffer before it has a chance to, which means
12661ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // that it's possible to get into a situation where a buffer is never
12671ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        // able to be latched. To avoid this, grab this buffer anyway.
12681ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        return true;
12691ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    }
12701ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
12719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
12729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return true;
12739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
12741ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza}
12751ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
1276cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1277cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1278cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // Don't bother with a SyncPoint, since we've already latched the
1279cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        // relevant frame
1280cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        return false;
12817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
1282cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1283cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1284cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    mLocalSyncPoints.push_back(point);
1285cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    return true;
12867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
12877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
128813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) {
128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mFiltering = filtering;
129013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
129113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
129213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const {
129313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mFiltering;
129413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
129513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1296ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range
1297ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and
1298ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel
1299ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into
1300ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here.
1301ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1302ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13035773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) {
1304a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1305a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return true;
1306ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    }
13075773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    switch (format) {
13085773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
13095773d3f5b2694c647e010246dff99acc70131289Mathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
1310ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy        case HAL_PIXEL_FORMAT_RGBA_FP16:
1311541f22658ab1617c9d12c98684ab40248df8749bRomain Guy        case HAL_PIXEL_FORMAT_RGBA_1010102:
1312dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian            return false;
13135773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    }
13145773d3f5b2694c647e010246dff99acc70131289Mathias Agopian    // in all other case, we have no blending (also for unknown formats)
1315dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian    return true;
1316ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
1317ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
131813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
131913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state
132013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
132113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1322acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) {
1323acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x < crop.left) {
1324acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.left;
1325acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1326acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->x > crop.right) {
1327acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->x = crop.right;
1328acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1329acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y < crop.top) {
1330acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.top;
1331acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1332acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (point->y > crop.bottom) {
1333acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        point->y = crop.bottom;
1334acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1335acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
1336acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1337c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1338c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) const
133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
13401eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
13411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Transform hwTransform(hw->getTransform());
134213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t hw_h = hw->getHeight();
13431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Rect win = computeBounds();
13443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1345acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lt = vec2(win.left, win.top);
1346acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 lb = vec2(win.left, win.bottom);
1347acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rb = vec2(win.right, win.bottom);
1348acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    vec2 rt = vec2(win.right, win.top);
1349acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
13501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform layerTransform = getTransform();
1351acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (!useIdentityTransform) {
13521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lt = layerTransform.transform(lt);
13531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        lb = layerTransform.transform(lb);
13541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rb = layerTransform.transform(rb);
13551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        rt = layerTransform.transform(rt);
1356acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1357acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1358b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (!s.finalCrop.isEmpty()) {
1359b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lt, s.finalCrop);
1360b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&lb, s.finalCrop);
1361b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rb, s.finalCrop);
1362b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr        boundPoint(&rt, s.finalCrop);
1363acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    }
1364acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos
1365ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
13661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[0] = hwTransform.transform(lt);
13671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[1] = hwTransform.transform(lb);
13681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[2] = hwTransform.transform(rb);
13691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    position[3] = hwTransform.transform(rt);
13703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    for (size_t i=0 ; i<4 ; i++) {
13715cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        position[i].y = hw_h - position[i].y;
137213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
137313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1374ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
13754125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const
1376a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{
1377a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if we don't have a buffer yet, we're translucent regardless of the
1378a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // layer's opaque flag.
1379db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    if (mActiveBuffer == 0) {
1380a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        return false;
1381db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    }
1382a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1383a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // if the layer has the opaque flag, then we're always opaque,
1384a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // otherwise we use the current buffer's format.
13854125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1386a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian}
1387a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
1388231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const
1389231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{
1390231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    const Layer::State& s(mDrawingState);
1391231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza    return (s.flags & layer_state_t::eLayerSecure);
1392231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza}
1393231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza
13947a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const
13957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{
1396a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
13977a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    return (activeBuffer != 0) &&
13987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
13997a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1400b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const {
1402c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
140413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
140513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const {
140613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return !mCurrentCrop.isEmpty();
140713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
140813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
140913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
141013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return mNeedsFiltering || hw->needsFiltering();
141113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
141213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
141313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) {
141413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
141513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleRegion = visibleRegion;
141613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
141713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
141813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) {
141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->coveredRegion = coveredRegion;
142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region&
142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        setVisibleNonTransparentRegion) {
142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always called from main thread
142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
142713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
142813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
142913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
143013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction
143113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
143213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
14337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() {
14347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mCurrentState.modified) {
14357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return;
14367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If this transaction is waiting on the receipt of a frame, generate a sync
14397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // point and send it to the remote layer.
14400d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    if (mCurrentState.barrierLayer != nullptr) {
14410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
14420d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (barrierLayer == nullptr) {
14430d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
14447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // If we can't promote the layer we are intended to wait on,
14457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // then it is expired or otherwise invalid. Allow this transaction
14467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            // to be applied as per normal (no synchronization).
14470d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            mCurrentState.barrierLayer = nullptr;
14483bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos        } else {
14493bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos            auto syncPoint = std::make_shared<SyncPoint>(
14503bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos                    mCurrentState.frameNumber);
14510d48072f6047140119ff194c1194ce402fca2c0bRobert Carr            if (barrierLayer->addSyncPoint(syncPoint)) {
1452cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.push_back(std::move(syncPoint));
1453cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            } else {
1454cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // We already missed the frame we're supposed to synchronize
1455cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // on, so go ahead and apply the state update
14560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr                mCurrentState.barrierLayer = nullptr;
1457cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
14587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
14597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        // Wake us up to check if the frame has been received
14617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
1462f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
14637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
14647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.push_back(mCurrentState);
14657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
146705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) {
146805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    auto oldFlags = stateToCommit->flags;
146905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    *stateToCommit = mPendingStates[0];
147005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
147105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            (stateToCommit->flags & stateToCommit->mask);
14727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
14737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mPendingStates.removeAt(0);
14747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
14757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
147605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) {
14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    bool stateUpdateAvailable = false;
14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    while (!mPendingStates.empty()) {
14790d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        if (mPendingStates[0].barrierLayer != nullptr) {
14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.empty()) {
14817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // If we don't have a sync point for this, apply it anyway. It
14827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // will be visually wrong, but it should keep us from getting
14837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // into too much trouble.
14847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                ALOGE("[%s] No local sync point found", mName.string());
148505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
14877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                continue;
14887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1490cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1491cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                    mPendingStates[0].frameNumber) {
1492cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                ALOGE("[%s] Unexpected sync point frame number found",
1493cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                        mName.string());
1494cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
1495cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                // Signal our end of the sync point and then dispose of it
1496cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
1497cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                mRemoteSyncPoints.pop_front();
1498cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza                continue;
1499cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
1500cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
15027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Apply the state update
150305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos                popPendingState(stateToCommit);
15047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                stateUpdateAvailable = true;
15057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                // Signal our end of the sync point and then dispose of it
15077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.front()->setTransactionApplied();
15087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza                mRemoteSyncPoints.pop_front();
1509792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza            } else {
1510792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza                break;
15117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            }
15127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        } else {
151305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos            popPendingState(stateToCommit);
15147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza            stateUpdateAvailable = true;
15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        }
15167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // If we still have pending updates, wake SurfaceFlinger back up and point
15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // it at this layer so we can process them
15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (!mPendingStates.empty()) {
15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        setTransactionFlags(eTransactionNeeded);
15227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        mFlinger->setTransactionFlags(eTraversalNeeded);
15237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
15267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return stateUpdateAvailable;
15277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() {
1530cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    auto headFrameNumber = getHeadFrameNumber();
15311ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza    bool headFenceSignaled = headFenceHasSignaled();
1532cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    Mutex::Autolock lock(mLocalSyncPointMutex);
1533cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza    for (auto& point : mLocalSyncPoints) {
15341ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza        if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
1535cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            point->setFrameAvailable();
1536cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
154013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) {
15411c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
15421c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
15437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
154405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    Layer::State c = getCurrentState();
154505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    if (!applyPendingStates(&c)) {
15467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        return 0;
15477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    }
15487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
15491eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15511eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const bool sizeChanged = (c.requested.w != s.requested.w) ||
15521eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                             (c.requested.h != s.requested.h);
1553a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1554a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    if (sizeChanged) {
1555cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // the size changed, we need to ask our client to request a new buffer
15569d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD_IF(DEBUG_RESIZE,
15576905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1558419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1559b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n"
1560419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1561b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                "            requested={ wh={%4u,%4u} }}\n",
1562c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                this, getName().string(), mCurrentTransform,
1563c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr                getEffectiveScalingMode(),
15641eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.active.w, c.active.h,
1565b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.left,
1566b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.top,
1567b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.right,
1568b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.bottom,
1569b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getWidth(),
1570b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                c.crop.getHeight(),
15711eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h,
15721eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                s.active.w, s.active.h,
1573b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.left,
1574b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.top,
1575b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.right,
1576b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.bottom,
1577b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getWidth(),
1578b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.crop.getHeight(),
1579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr                s.requested.w, s.requested.h);
1580a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
15812a0d5b608447a880beff5149805425f02691442bJamie Gennis        // record the new size, form this point on, when the client request
15822a0d5b608447a880beff5149805425f02691442bJamie Gennis        // a buffer, it'll get the new size.
1583bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        mSurfaceFlingerConsumer->setDefaultBufferSize(
15841eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian                c.requested.w, c.requested.h);
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1586cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
158782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    const bool resizePending = (c.requested.w != c.active.w) ||
158882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            (c.requested.h != c.active.h);
15890cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    if (!isFixedSize()) {
15909e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza        if (resizePending && mSidebandStream == NULL) {
159113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            // don't let Layer::doTransaction update the drawing state
15920cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // if we have a pending resize, unless we are in fixed-size mode.
15930cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // the drawing state will be updated only once we receive a buffer
15940cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // with the correct size.
15950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            //
15960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // in particular, we want to make sure the clip (which is part
15970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // of the geometry state) is latched together with the size but is
15980cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            // latched immediately when no resizing is involved.
15999e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            //
16009e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // If a sideband stream is attached, however, we want to skip this
16019e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // optimization so that transactions aren't missed when a buffer
16029e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza            // never arrives
16030cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
16040cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian            flags |= eDontUpdateGeometryState;
16050cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian        }
16060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian    }
16070cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian
160813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // always set active to requested, unless we're asked not to
160913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // this is used by Layer, which special cases resizes.
161013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (flags & eDontUpdateGeometryState)  {
161113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    } else {
16127d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos        Layer::State& editCurrentState(getCurrentState());
161382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        if (mFreezePositionUpdates) {
161482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float tx = c.active.transform.tx();
161582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            float ty = c.active.transform.ty();
161682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
161782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active.transform.set(tx, ty);
161882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = c.active;
161982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        } else {
162082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            editCurrentState.active = editCurrentState.requested;
162182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr            c.active = c.requested;
162282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        }
162313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
162413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16251eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (s.active != c.active) {
162613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
162713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= Layer::eVisibleRegion;
162813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
16301eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    if (c.sequence != s.sequence) {
163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // invalidate and recompute the visible regions if needed
163213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        flags |= eVisibleRegion;
163313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        this->contentDirty = true;
163413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // we may use linear filtering, if the matrix scales us
16363dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        const uint8_t type = c.active.transform.getType();
16373dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr        mNeedsFiltering = (!c.active.transform.preserveRects() ||
163813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian                (type >= Transform::SCALE));
163913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1641c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // If the layer is hidden, signal and clear out all local sync points so
1642c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // that transactions for layers depending on this layer's frames becoming
1643c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    // visible are not blocked
1644c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    if (c.flags & layer_state_t::eLayerHidden) {
16451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        clearSyncPoints();
1646c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza    }
1647c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza
164813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // Commit the transaction
164905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    commitTransaction(c);
165013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return flags;
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) {
165405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos    mDrawingState = stateToCommit;
1655a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
1656a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
165713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) {
165813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_and(~flags, &mTransactionFlags) & flags;
165913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
166013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
166113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) {
166213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return android_atomic_or(flags, &mTransactionFlags);
166313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
166413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
166582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) {
16663dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
166713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
166813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
166969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
167069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // We update the requested and active position simultaneously because
167169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // we want to apply the position portion of the transform matrix immediately,
167269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
16733dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(x, y);
167482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    if (immediate && !mFreezePositionUpdates) {
167582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr        mCurrentState.active.transform.set(x, y);
167682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    }
167782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
167869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr
16797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
168013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
168382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr
16841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
16851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    ssize_t idx = mCurrentChildren.indexOf(childLayer);
16861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (idx < 0) {
16871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return false;
16881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (childLayer->setLayer(z)) {
16901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.removeAt(idx);
16911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        mCurrentChildren.add(childLayer);
16921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
16931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return true;
16941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
16951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1696ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) {
169713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.z == z)
169813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
169913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.z = z;
17017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
170213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
170313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
170413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
170613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) {
170713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
170813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
170913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.w = w;
171013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.requested.h = h;
17117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
171313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
171413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
17159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
17169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) {
17179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
17189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) {
17199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
172013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.alpha == alpha)
172113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
172213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
172313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.alpha = alpha;
17247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
172513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
172613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
172713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
172813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
172913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
17303dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr    mCurrentState.requested.transform.set(
1731cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr            matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
17327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
173313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
173413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
173513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
173613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) {
17372ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    mCurrentState.requestedTransparentRegion = transparent;
17387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
173913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
174013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
174113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) {
174313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
174413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.flags == newFlags)
174513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
174613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.flags = newFlags;
17487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.mask = mask;
17497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
175013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
175113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
175213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
175399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr
175499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) {
1755b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.crop == crop)
175613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
175713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
175899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    mCurrentState.requestedCrop = crop;
175999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    if (immediate) {
176099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr        mCurrentState.crop = crop;
176199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    }
17627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
176313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
176413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
176513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
1766acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosbool Layer::setFinalCrop(const Rect& crop) {
1767b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    if (mCurrentState.finalCrop == crop)
1768acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos        return false;
1769acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.sequence++;
1770b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr    mCurrentState.finalCrop = crop;
1771acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    mCurrentState.modified = true;
1772acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    setTransactionFlags(eTransactionNeeded);
1773acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return true;
1774acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
177513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
1776c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) {
1777c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (scalingMode == mOverrideScalingMode)
1778c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr        return false;
1779c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    mOverrideScalingMode = scalingMode;
178082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    setTransactionFlags(eTransactionNeeded);
1781c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return true;
1782c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1783c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
17842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) {
17852f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.appId = appId;
17862f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.type = type;
17872f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  mCurrentState.modified = true;
17882f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  setTransactionFlags(eTransactionNeeded);
17892f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
17902f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1791c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const {
1792c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (mOverrideScalingMode >= 0) {
1793c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr      return mOverrideScalingMode;
1794c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    }
1795c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mCurrentScalingMode;
1796c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
1797c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
179813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) {
179913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mCurrentState.layerStack == layerStack)
180013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        return false;
180113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.sequence++;
180213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mCurrentState.layerStack = layerStack;
18037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
180413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    setTransactionFlags(eTransactionNeeded);
180513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return true;
1806a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian}
1807a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
1808bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) {
1809bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    if (mCurrentState.dataSpace == dataSpace)
1810bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter        return false;
1811bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.sequence++;
1812bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.dataSpace = dataSpace;
1813bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    mCurrentState.modified = true;
1814bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setTransactionFlags(eTransactionNeeded);
1815bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    return true;
1816bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter}
1817bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
18181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const {
18191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    auto p = getParent();
18201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p == nullptr) {
18211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getDrawingState().layerStack;
18221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
18231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return p->getLayerStack();
18241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
18251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
18260d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer,
18277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
18280d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = barrierLayer;
18297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.frameNumber = frameNumber;
18307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // We don't set eTransactionNeeded, because just receiving a deferral
18317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    // request without any other state updates shouldn't actually induce a delay
18327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = true;
18337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    pushPendingState();
18340d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    mCurrentState.barrierLayer = nullptr;
1835792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza    mCurrentState.frameNumber = 0;
18367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    mCurrentState.modified = false;
18370d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    ALOGE("Deferred transaction");
18380d48072f6047140119ff194c1194ce402fca2c0bRobert Carr}
18390d48072f6047140119ff194c1194ce402fca2c0bRobert Carr
18400d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle,
18410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr        uint64_t frameNumber) {
18420d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
18430d48072f6047140119ff194c1194ce402fca2c0bRobert Carr    deferTransactionUntil(handle->owner.promote(), frameNumber);
18447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
18457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
1846ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() {
1847ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    if (mFlinger->mForceFullDamage) {
1848ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = Region::INVALID_REGION;
1849ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    } else {
1850ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1851ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    }
1852ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1853ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1854ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() {
1855ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.clear();
1856ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
1857ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling...
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18626b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const {
1863ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    if (mSidebandStreamChanged || mAutoRefresh) {
1864d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza        return true;
1865d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza    }
1866d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza
18676b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    Mutex::Autolock lock(mQueueItemLock);
18680eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    if (mQueueItems.empty()) {
18690eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza        return false;
18700eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    }
18710eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    auto timestamp = mQueueItems[0].mTimestamp;
18726b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza    nsecs_t expectedPresent =
18736b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
18740eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18750eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    // Ignore timestamps more than a second in the future
18760eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
18770eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
18780eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
18790eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza            expectedPresent);
18800eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza
18810eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    bool isDue = timestamp < expectedPresent;
18820eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza    return isDue || !isPlausible;
18836b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza}
18846b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
1885d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) {
1886d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (mBufferLatched) {
1887d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
1888d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime);
1889d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
18904d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    mRefreshPending = false;
1891ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
189299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
189399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
18940a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
18953d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        const std::shared_ptr<FenceTime>& presentFence,
18960a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const std::shared_ptr<FenceTime>& retireFence,
18970a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        const CompositorTiming& compositorTiming) {
18983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mAcquireTimeline.updateSignalTimes();
18993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.updateSignalTimes();
19003d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1901d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // mFrameLatencyNeeded is true when a new frame was latched for the
1902d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // composition.
190328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (!mFrameLatencyNeeded)
190428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        return false;
190528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
190628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameEventHistory.
190728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    {
190828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        Mutex::Autolock lock(mFrameEventHistoryMutex);
190928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
19100a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson                glDoneFence, presentFence, compositorTiming);
19118cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
19128cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRetire(mPreviousFrameNumber,
19138cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    retireFence);
19148cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
191528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
191682dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
191728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    // Update mFrameTracker.
191828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
191928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.setDesiredPresentTime(desiredPresentTime);
192082dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> frameReadyFence =
19223d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mSurfaceFlingerConsumer->getCurrentFenceTime();
192328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    if (frameReadyFence->isValid()) {
19243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
192528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
192628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // There was no fence for this frame, so assume that it was ready
192728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // to be presented at the desired present time.
192828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        mFrameTracker.setFrameReadyTime(desiredPresentTime);
192928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    }
193082dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis
19313d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    if (presentFence->isValid()) {
19323d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
19333d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(presentFence));
19343d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    } else if (retireFence->isValid()) {
19353d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentFence(
19363d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                std::shared_ptr<FenceTime>(retireFence));
193728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    } else {
193828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // The HWC doesn't support present fences, so use the refresh
193928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard        // timestamp instead.
19403d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFrameTracker.setActualPresentTime(
19413d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            mFlinger->getHwComposer().getRefreshTimestamp(
19423d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson                HWC_DISPLAY_PRIMARY));
1943d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    }
194428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard
194528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameTracker.advanceFrame();
194628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    mFrameLatencyNeeded = false;
194728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard    return true;
1948d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
1949d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
19509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1951f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
19525ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
19535ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return;
19545ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
19555ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
19563d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    auto releaseFenceTime = std::make_shared<FenceTime>(
1957d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
19583d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    mReleaseTimeline.push(releaseFenceTime);
19593d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
19603d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
19618cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    if (mPreviousFrameNumber != 0) {
19628cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        mFrameEventHistory.addRelease(mPreviousFrameNumber,
19638cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                dequeueReadyTime, std::move(releaseFenceTime));
19648cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson    }
19659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
19669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
19679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
19681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const {
19691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const Layer::State& s(mDrawingState);
19701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& parent = getParent();
19711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (parent != nullptr && parent->isHiddenByPolicy()) {
19721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return true;
19731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
19741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return s.flags & layer_state_t::eLayerHidden;
19751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
19761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
1977da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const {
197813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const Layer::State& s(mDrawingState);
19799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
19801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return !(isHiddenByPolicy()) && s.alpha > 0.0f
19819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
19831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return !(isHiddenByPolicy()) && s.alpha
19849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            && (mActiveBuffer != NULL || mSidebandStream != NULL);
19859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1986da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
1987da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
1988cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() {
1989cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    auto headFrameNumber = getHeadFrameNumber();
1990cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool matchingFramesFound = false;
1991cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    bool allTransactionsApplied = true;
1992cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    Mutex::Autolock lock(mLocalSyncPointMutex);
1993cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
1994cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    for (auto& point : mLocalSyncPoints) {
1995cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (point->getFrameNumber() > headFrameNumber) {
1996cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard            break;
1997cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
1998cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        matchingFramesFound = true;
1999cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2000cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        if (!point->frameIsAvailable()) {
2001cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // We haven't notified the remote layer that the frame for
2002cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // this point is available yet. Notify it now, and then
2003cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           // abort this attempt to latch.
2004cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           point->setFrameAvailable();
2005cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           allTransactionsApplied = false;
2006cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard           break;
2007cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        }
2008cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2009cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard        allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied();
2010cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    }
2011cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    return !matchingFramesFound || allTransactionsApplied;
2012cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard}
2013cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard
2014d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
20161c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    ATRACE_CALL();
20171c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
2018399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
2019399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        // mSidebandStreamChanged was true
2020399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
202112e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        if (mSidebandStream != NULL) {
202212e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            setTransactionFlags(eTransactionNeeded);
202312e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza            mFlinger->setTransactionFlags(eTraversalNeeded);
202412e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza        }
20255bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        recomputeVisibleRegions = true;
20265bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall
20275bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall        const State& s(getDrawingState());
20281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        return getTransform().transform(Region(Rect(s.active.w, s.active.h)));
2029399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
2030399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
20314fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    Region outDirtyRegion;
2032223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mQueuedFrames <= 0 && !mAutoRefresh) {
2033223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2034223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
203599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
2036223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // if we've already called updateTexImage() without going through
2037223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // a composition step, we have to skip this layer at this point
2038223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // because we cannot call updateTeximage() without a corresponding
2039223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // compositionComplete() call.
2040223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // we'll trigger an update in onPreComposition().
2041223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mRefreshPending) {
2042223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2043223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20441ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza
2045223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // If the head buffer's acquire fence hasn't signaled yet, return and
2046223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // try again later
2047223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (!headFenceHasSignaled()) {
2048223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2049223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2050223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
20512c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian
2052223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Capture the old state of the layer for comparisons later
2053223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const State& s(getDrawingState());
2054223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const bool oldOpacity = isOpaque(s);
2055223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
2056223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2057cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard    if (!allTransactionsSignaled()) {
2058223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2059223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2060223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2061223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2062223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // This boolean is used to make sure that SurfaceFlinger's shadow copy
2063223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // of the buffer queue isn't modified when the buffer queue is returning
2064223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // BufferItem's that weren't actually queued. This can happen in shared
2065223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // buffer mode.
2066223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    bool queuedBuffer = false;
20677b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
20687b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    getProducerStickyTransform() != 0, mName.string(),
20697b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard                    mOverrideScalingMode, mFreezePositionUpdates);
2070223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
2071223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
2072223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mLastFrameNumberReceived);
2073223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (updateResult == BufferQueue::PRESENT_LATER) {
2074223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Producer doesn't want buffer to be displayed yet.  Signal a
2075223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // layer update so we check again at the next opportunity.
2076223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2077223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2078223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
2079223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // If the buffer has been rejected, remove it from the shadow queue
2080223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // and return early
2081063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        if (queuedBuffer) {
20826b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            Mutex::Autolock lock(mQueueItemLock);
2083223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.removeAt(0);
2084223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
2085223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2086223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2087223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
2088223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // This can occur if something goes wrong when trying to create the
2089223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // EGLImage for this buffer. If this happens, the buffer has already
2090223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // been released, so we need to clean up the queue and bug out
2091223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // early.
2092223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (queuedBuffer) {
2093223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            Mutex::Autolock lock(mQueueItemLock);
2094223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            mQueueItems.clear();
2095223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_and(0, &mQueuedFrames);
2096223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        }
2097ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2098223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Once we have hit this state, the shadow queue may no longer
2099223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // correctly reflect the incoming BufferQueue's contents, so even if
2100223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage starts working, the only safe course of action is
2101223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // to continue to ignore updates.
2102223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mUpdateTexImageFailed = true;
2103ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
2104223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2105223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2106223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2107223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (queuedBuffer) {
2108223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Autolock scope
2109223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2110223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2111223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mQueueItemLock);
2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // Remove any stale buffers that have been dropped during
2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // updateTexImage
2115223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
21166b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza            mQueueItems.removeAt(0);
2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            android_atomic_dec(&mQueuedFrames);
21186b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza        }
21196b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza
2120223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mQueueItems.removeAt(0);
2121223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2122ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza
21231585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Decrement the queued-frames count.  Signal another event if we
2125223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // have more frames pending.
2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
2127223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            || mAutoRefresh) {
2128223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mFlinger->signalLayerUpdate();
2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2130d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
2131223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // update the active buffer
213206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(
213306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            &mActiveBufferSlot);
2134223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (mActiveBuffer == NULL) {
2135223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        // this can only happen if the very first buffer was rejected.
2136223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        return outDirtyRegion;
2137223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2138702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2139d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mBufferLatched = true;
2140d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mPreviousFrameNumber = mCurrentFrameNumber;
2141d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2142d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2143d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    {
2144d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        Mutex::Autolock lock(mFrameEventHistoryMutex);
2145d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
2146d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2
21473d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        auto releaseFenceTime = std::make_shared<FenceTime>(
2148d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson                mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
21493d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mReleaseTimeline.push(releaseFenceTime);
21508cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        if (mPreviousFrameNumber != 0) {
21518cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson            mFrameEventHistory.addRelease(mPreviousFrameNumber,
21528cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson                    latchTime, std::move(releaseFenceTime));
21538cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson        }
2154d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif
2155d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
2156d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mRefreshPending = true;
2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mFrameLatencyNeeded = true;
2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer == NULL) {
2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // the first time we receive a buffer, we need to trigger a
2161223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard         // geometry invalidation.
2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard     }
2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2165bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter    setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
2166bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter
2167223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if ((crop != mCurrentCrop) ||
2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (transform != mCurrentTransform) ||
2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        (scalingMode != mCurrentScalingMode))
2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2174223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentCrop = crop;
2175223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentTransform = transform;
2176223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        mCurrentScalingMode = scalingMode;
2177223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2179702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2180223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldActiveBuffer != NULL) {
2181223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufWidth  = mActiveBuffer->getWidth();
2182223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        uint32_t bufHeight = mActiveBuffer->getHeight();
2183223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            bufHeight != uint32_t(oldActiveBuffer->height)) {
2185702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian            recomputeVisibleRegions = true;
2186702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian        }
2187223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2188702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian
2189223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2190223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    if (oldOpacity != isOpaque(s)) {
2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        recomputeVisibleRegions = true;
2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2193cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2194223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // Remove any sync points corresponding to the buffer which was just
2195223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // latched
2196223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    {
2197223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        Mutex::Autolock lock(mLocalSyncPointMutex);
2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        auto point = mLocalSyncPoints.begin();
2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard        while (point != mLocalSyncPoints.end()) {
2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if (!(*point)->frameIsAvailable() ||
2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                    !(*point)->transactionIsApplied()) {
2202223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // This sync point must have been added since we started
2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                // latching. Don't drop it yet.
2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2205223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                continue;
2206223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            }
2207223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2208223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2209223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                point = mLocalSyncPoints.erase(point);
2210223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard            } else {
2211223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard                ++point;
2212cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza            }
2213cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza        }
2214223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    }
2215cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza
2216223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // FIXME: postedRegion should be dirty & bounds
2217223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    Region dirtyRegion(Rect(s.active.w, s.active.h));
2218223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard
2219223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard    // transform the dirty region to window-manager space
22201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    outDirtyRegion = (getTransform().transform(dirtyRegion));
22211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
22224fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    return outDirtyRegion;
2223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
222513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const
222613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{
222713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    // TODO: should we do something special if mSecure is set?
222813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (mProtectedByApp) {
222913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // need a hardware-protected path to external video sink
223013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        usage |= GraphicBuffer::USAGE_PROTECTED;
223113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
223203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    if (mPotentialCursor) {
223303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews        usage |= GraphicBuffer::USAGE_CURSOR;
223403414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews    }
223513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
223613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    return usage;
223713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
223813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
223913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
224013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    uint32_t orientation = 0;
224113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    if (!mFlinger->mDebugDisableTransformHint) {
224213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // The transform hint is used to improve performance, but we can
224313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // only have a single transform hint, it cannot
224413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        // apply to all displays.
224513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const Transform& planeTransform(hw->getTransform());
224613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        orientation = planeTransform.getOrientation();
224713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        if (orientation & Transform::ROT_INVALID) {
224813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            orientation = 0;
224913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        }
225013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    }
225113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    mSurfaceFlingerConsumer->setTransformHint(orientation);
225213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian}
225313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
225413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
225513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging
225613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ----------------------------------------------------------------------------
225713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22583e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const
22591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
22601eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian    const Layer::State& s(getDrawingState());
226113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22623e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.colorize(result, Colorizer::GREEN);
226374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
226413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "+ %s %p (%s)\n",
226513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            getTypeId(), this, getName().string());
22663e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian    colorizer.reset(result);
226713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
22682ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian    s.activeTransparentRegion.dump(result, "transparentRegion");
226913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    visibleRegion.dump(result, "visibleRegion");
2270ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
227113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    sp<Client> client(mClientRef.promote());
227213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
227374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(            "      "
2274acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2275acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
227613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "isOpaque=%1d, invalidate=%1d, "
22779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
22789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
22809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
22819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
228213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            "      client=%p\n",
22831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            getLayerStack(), s.z,
22841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.transform.tx(), s.active.transform.ty(),
22851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            s.active.w, s.active.h,
2286b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.left, s.crop.top,
2287b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.crop.right, s.crop.bottom,
2288b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.left, s.finalCrop.top,
2289b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr            s.finalCrop.right, s.finalCrop.bottom,
22904125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden            isOpaque(s), contentDirty,
229113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            s.alpha, s.flags,
22923dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[0][0], s.active.transform[0][1],
22933dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr            s.active.transform[1][0], s.active.transform[1][1],
229413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian            client.get());
22951b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2296a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<const GraphicBuffer> buf0(mActiveBuffer);
2297a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t w0=0, h0=0, s0=0, f0=0;
22981b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    if (buf0 != 0) {
22991b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        w0 = buf0->getWidth();
23001b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        h0 = buf0->getHeight();
23011b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian        s0 = buf0->getStride();
2302a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        f0 = buf0->format;
23031b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    }
230474d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
23051b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
2306ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
23076905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            " queued-frames=%d, mRefreshPending=%d\n",
2308a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            mFormat, w0, h0, s0,f0,
23096905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden            mQueuedFrames, mRefreshPending);
23101b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2311bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mSurfaceFlingerConsumer != 0) {
23123d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross        mSurfaceFlingerConsumer->dumpState(result, "            ");
2313bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    }
2314d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian}
2315d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
23169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2317e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) {
2318e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2319e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2320e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Layer name\n");
2321e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("           Z | ");
2322e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append(" Comp Type | ");
2323e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("  Disp Frame (LTRB) | ");
2324e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("         Source Crop (LTRB)\n");
2325e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("----------------------------------------");
2326e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("---------------------------------------\n");
2327e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
2328e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2329e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const {
2330e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mHwcLayers.count(hwcId) == 0) {
2331e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        return;
2332e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2333e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2334e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    String8 name;
2335e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    if (mName.length() > 77) {
2336e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        std::string shortened;
2337e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string(), 36);
2338e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append("[...]");
2339e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        shortened.append(mName.string() + (mName.length() - 36), 36);
2340e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = shortened.c_str();
2341e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    } else {
2342e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza        name = mName;
2343e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    }
2344e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2345e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat(" %s\n", name.string());
2346e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2347e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Layer::State& layerState(getDrawingState());
2348e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const HWCInfo& hwcInfo = mHwcLayers.at(hwcId);
2349e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("  %10u | ", layerState.z);
2350e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%10s | ",
2351e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            to_string(getCompositionType(hwcId)).c_str());
2352e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    const Rect& frame = hwcInfo.displayFrame;
2353e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top,
2354e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            frame.right, frame.bottom);
23555a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    const FloatRect& crop = hwcInfo.sourceCrop;
2356e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top,
2357e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza            crop.right, crop.bottom);
2358e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2359e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - - ");
2360e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza    result.append("- - - - - - - - - - - - - - - - - - - -\n");
2361e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza}
23629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2363e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza
2364d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const {
2365d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.dumpStats(result);
236682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
236782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2368d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() {
2369d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.clearStats();
237025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
237125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
23726547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() {
23736547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    mFrameTracker.logAndResetStats(mName);
23746547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis}
23756547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis
2376d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const {
2377d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    mFrameTracker.getStats(outStats);
2378d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
2379d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
2380d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) {
2381d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    result.appendFormat("- Layer %s (%s, %p)\n",
2382d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson            getName().string(), getTypeId(), this);
2383d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2384d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.checkFencesForCompletion();
2385d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    mFrameEventHistory.dump(result);
2386d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson}
2387d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
23885ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() {
23895ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
23905ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    mFrameEventHistory.onDisconnect();
23915ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
23925ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
23933890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
23943890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
2395d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    Mutex::Autolock lock(mFrameEventHistoryMutex);
2396d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    if (newTimestamps) {
23973d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mAcquireTimeline.push(newTimestamps->acquireFence);
2398d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        mFrameEventHistory.addQueue(*newTimestamps);
2399d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
240040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos
24013890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (outDelta) {
24023890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mFrameEventHistory.getAndResetDelta(outDelta);
2403d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
240440845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos}
2405e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2406e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2407e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        bool forceFlush) {
2408e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
2409e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2410e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            &history);
2411e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    if (result != NO_ERROR) {
2412e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2413e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                result);
2414e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        return {};
2415e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
2416e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    return history;
2417e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
2418e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
2419367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const {
2420367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
2421367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
2422367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
24231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) {
24241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mCurrentChildren.add(layer);
24251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(this);
24261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) {
24291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    layer->setParent(nullptr);
24301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mCurrentChildren.remove(layer);
24311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24331db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
24341db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Handle> handle = nullptr;
24351db73f66624e7d151710483dd58e03eed672f064Robert Carr    sp<Layer> newParent = nullptr;
24361db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParentHandle == nullptr) {
24371db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
24381db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24391db73f66624e7d151710483dd58e03eed672f064Robert Carr    handle = static_cast<Handle*>(newParentHandle.get());
24401db73f66624e7d151710483dd58e03eed672f064Robert Carr    newParent = handle->owner.promote();
24411db73f66624e7d151710483dd58e03eed672f064Robert Carr    if (newParent == nullptr) {
24421db73f66624e7d151710483dd58e03eed672f064Robert Carr        ALOGE("Unable to promote Layer handle");
24431db73f66624e7d151710483dd58e03eed672f064Robert Carr        return false;
24441db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24451db73f66624e7d151710483dd58e03eed672f064Robert Carr
24461db73f66624e7d151710483dd58e03eed672f064Robert Carr    for (const sp<Layer>& child : mCurrentChildren) {
24471db73f66624e7d151710483dd58e03eed672f064Robert Carr        newParent->addChild(child);
24481db73f66624e7d151710483dd58e03eed672f064Robert Carr
24491db73f66624e7d151710483dd58e03eed672f064Robert Carr        sp<Client> client(child->mClientRef.promote());
24501db73f66624e7d151710483dd58e03eed672f064Robert Carr        if (client != nullptr) {
24511db73f66624e7d151710483dd58e03eed672f064Robert Carr            client->setParentLayer(newParent);
24521db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
24531db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
24541db73f66624e7d151710483dd58e03eed672f064Robert Carr    mCurrentChildren.clear();
24551db73f66624e7d151710483dd58e03eed672f064Robert Carr
24561db73f66624e7d151710483dd58e03eed672f064Robert Carr    return true;
24571db73f66624e7d151710483dd58e03eed672f064Robert Carr}
24581db73f66624e7d151710483dd58e03eed672f064Robert Carr
24599524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() {
24609524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    traverseInZOrder([this](Layer* child) {
24619524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (child == this) {
24629524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            return;
24639524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
24649524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
24659524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        sp<Client> client(child->mClientRef.promote());
24669524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        if (client != nullptr) {
24679524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr            client->detachLayer(child);
24689524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr        }
24699524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    });
24709524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
24719524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr    return true;
24729524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr}
24739524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr
24741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) {
24751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mParent = layer;
24761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() {
24791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (const auto& child : mCurrentChildren) {
24801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->clearSyncPoints();
24811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Mutex::Autolock lock(mLocalSyncPointMutex);
24841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (auto& point : mLocalSyncPoints) {
24851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        point->setFrameAvailable();
24861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
24871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mLocalSyncPoints.clear();
24881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const {
24911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return mDrawingState.z;
24921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
24931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
24941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
24951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Negatively signed children are before 'this' in Z-order.
24961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
24971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) {
24981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    size_t i = 0;
24991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
25001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() >= 0)
25021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
25031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
25041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
25061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i < mDrawingChildren.size(); i++) {
25071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInZOrder(exec);
25091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/**
25131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Positively signed children are before 'this' in reverse Z-order.
25141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */
25151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) {
25161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    int32_t i = 0;
25171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (i = mDrawingChildren.size()-1; i>=0; i--) {
25181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        if (child->getZ() < 0) {
25201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr            break;
25211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        }
25221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
25231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    exec(this);
25251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (; i>=0; i--) {
25261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mDrawingChildren[i];
25271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->traverseInReverseZOrder(exec);
25281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const {
25321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    Transform t;
25331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    const auto& p = getParent();
25341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    if (p != nullptr) {
25351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        t = p->getTransform();
25361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    return t * getDrawingState().active.transform;
25381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
25401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() {
25411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    for (size_t i = 0; i < mCurrentChildren.size(); i++) {
25421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        const auto& child = mCurrentChildren[i];
25431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr        child->commitChildList();
25441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    }
25451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr    mDrawingChildren = mCurrentChildren;
25461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr}
25471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr
254813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------
254913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian
25503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25523f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_)
25533f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file"
25543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_)
25573f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file"
25583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif
2559