Layer.cpp revision f1961f713de2b3f54c8ce7653964b969e1a02bc8
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer" 201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h> 43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h> 4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 473e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 480f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 507b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 51b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 59c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE 0 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 6713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const String8& name, uint32_t w, uint32_t h, uint32_t flags) 7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian : contentDirty(false), 7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 73a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mTextureName(-1U), 7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mName("unnamed"), 7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat(PIXEL_FORMAT_NONE), 7713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 80a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 81399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 82a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 83a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 84933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 85c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 86a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 87d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched(false), 88cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 898cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mPreviousFrameNumber(0), 904d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending(false), 9182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 9313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 945cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition(false), 979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mHasSurface(false), 10003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 103a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 104a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 10565476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 10604839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos mUpdateTexImageFailed(false), 10782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 1087bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates(false) 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating Layer %s", name.string()); 1129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 114a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mFlinger->getRenderEngine().genTextures(1, &mTextureName); 11649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 1194d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eHidden) 1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerHidden; 1214125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (flags & ISurfaceComposerClient::eOpaque) 1224125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerOpaque; 123231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza if (flags & ISurfaceComposerClient::eSecure) 124231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza layerFlags |= layer_state_t::eLayerSecure; 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eNonPremultiplied) 1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mPremultipliedAlpha = false; 1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 130f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza mTransactionName = String8("TX - ") + mName; 1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1334d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1343dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 135b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 136b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedFinalCrop = mCurrentState.finalCrop; 1387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedCrop = mCurrentState.crop; 1394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 1409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentState.alpha = 1.0f; 1429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentState.alpha = 0xFF; 1449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.flags = layerFlags; 1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 149bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1502f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1512f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1524d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1534d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1544d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1556547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t displayPeriod = 1629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 1639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1646547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1650a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1660a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1670a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1680a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 169e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 170e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 1713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() { 172bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 173b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferProducer> producer; 174b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer; 1750556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian BufferQueue::createBufferQueue(&producer, &consumer, true); 1761db73f66624e7d151710483dd58e03eed672f064Robert Carr mProducer = new MonitoredProducer(producer, mFlinger, this); 177468051e20be19130572231266db306396a56402bIrvel mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this); 178bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 179399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSurfaceFlingerConsumer->setContentsChangedListener(this); 1804d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mSurfaceFlingerConsumer->setName(mName); 181b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam 18263a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard if (mFlinger->isLayerTripleBufferingDisabled()) { 18363a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard mProducer->setMaxDequeuedBufferCount(2); 18463a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard } 1856905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 1868430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 1878430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian updateTransformHint(hw); 188b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 18996f0819f81293076e652792794a961543e6750d7Mathias Agopian 1904d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1918ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos sp<Client> c(mClientRef.promote()); 1928ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos if (c != 0) { 1938ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos c->detachLayer(this); 1948ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos } 1958ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos 196cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mRemoteSyncPoints) { 197cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setTransactionApplied(); 198cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 199c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza for (auto& point : mLocalSyncPoints) { 200c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza point->setFrameAvailable(); 201c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 202921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mFlinger->deleteTextureAsync(mTextureName); 2036547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 204b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 205b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#ifdef USE_HWC2 206c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu if (!mHwcLayers.empty()) { 207c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu ALOGE("Found stale hardware composer layers when destroying " 208c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu "surface flinger layer %s", mName.string()); 209c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu destroyAllHwcLayers(); 210c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 211b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#endif 21296f0819f81293076e652792794a961543e6750d7Mathias Agopian} 21396f0819f81293076e652792794a961543e6750d7Mathias Agopian 21413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 21613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.empty()) { 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 2279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface* layer) { 2289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer) { 2299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer->onDisplayed(); 2309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 2319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 23413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2356b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) { 2366b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Add this buffer from our internal queue tracker 2376b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza { // Autolock scope 2386b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 239468051e20be19130572231266db306396a56402bIrvel mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), 240468051e20be19130572231266db306396a56402bIrvel item.mGraphicBuffer->getHeight(), item.mFrameNumber); 241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Reset the frame number tracker when we receive the first buffer after 242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // a frame number reset 243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (item.mFrameNumber == 1) { 244a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = 0; 245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Ensure that callbacks are handled in order 248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 249a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 250a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ms2ns(500)); 251a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (result != NO_ERROR) { 252a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 253a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 254a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 255a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2566b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.push_back(item); 257ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza android_atomic_inc(&mQueuedFrames); 258a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 259a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Wake up any pending callbacks 260a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 261a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition.broadcast(); 2626b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2636b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 26499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mFlinger->signalLayerUpdate(); 265579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 266579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 2676b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) { 2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza { // Autolock scope 2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Mutex::Autolock lock(mQueueItemLock); 270a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Ensure that callbacks are handled in order 2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ms2ns(500)); 2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (result != NO_ERROR) { 2767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 2777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 278a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 279a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mQueueItems.empty()) { 2817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("Can't replace a frame on an empty queue"); 2827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 2837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 2844d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos mQueueItems.editItemAt(mQueueItems.size() - 1) = item; 2857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 2867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake up any pending callbacks 2877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 2887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mQueueItemCondition.broadcast(); 2896b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2906b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 2916b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 292399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() { 293399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 294399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was false 295399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mFlinger->signalLayerUpdate(); 296399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 297399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall} 298399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 299c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() { 300c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mCurrentState to mLayersPendingRemoval 301c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 3025edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 3035edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 3045edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 3055edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 306c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mFlinger->setTransactionFlags(eTraversalNeeded); 3075edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 3085edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 3095edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 3105edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 311c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu for (const auto& child : mCurrentChildren) { 312c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu child->onRemovedFromCurrentState(); 313c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 314c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu} 3153851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 316c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() { 317c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mLayersPendingRemoval 318c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 319c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mSurfaceFlingerConsumer->abandon(); 3203851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#ifdef USE_HWC2 321b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyAllHwcLayers(); 3223851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#endif 3233851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 3261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 32748d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 328cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 33213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3331eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 33613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h, 33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian PixelFormat format, uint32_t flags) 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t const maxSurfaceDims = min( 34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 34313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // never allow a surface larger than what our underlying GL implementation 34413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // can handle. 34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return BAD_VALUE; 34813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 34913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 35013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat = format; 35113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 35203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 35313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentOpacity = getOpacityForFormat(format); 35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 35713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 35813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 35913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 36013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return NO_ERROR; 36113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 36213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3634d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 3644d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 3654d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 3674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian "Layer::getHandle() has already been called"); 3684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHasSurface = true; 3704d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3714d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 372582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 373582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 374b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const { 375b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer; 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 37913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 38013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 38113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 382b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#ifdef USE_HWC2 383b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { 384b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, 385b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas "Already have a layer for hwcId %d", hwcId); 386b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWC2::Layer* layer = hwc->createLayer(hwcId); 387b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (!layer) { 388b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return false; 389b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 390b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWCInfo& hwcInfo = mHwcLayers[hwcId]; 391b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc = hwc; 392b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.layer = layer; 393b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas layer->setLayerDestroyedListener( 394b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas [this, hwcId] (HWC2::Layer* /*layer*/){mHwcLayers.erase(hwcId);}); 395b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return true; 396b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 397b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 398b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyHwcLayer(int32_t hwcId) { 399b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (mHwcLayers.count(hwcId) == 0) { 400b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return; 401b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 402b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas auto& hwcInfo = mHwcLayers[hwcId]; 403b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, 404b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas "Attempt to destroy null layer"); 405b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer"); 406b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer); 407b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // The layer destroyed listener should have cleared the entry from 408b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // mHwcLayers. Verify that. 409b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, 410b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas "Stale layer entry in mHwcLayers"); 411b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 412b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 413b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() { 414b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas size_t numLayers = mHwcLayers.size(); 415b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas for (size_t i = 0; i < numLayers; ++i) { 416b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed"); 417b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyHwcLayer(mHwcLayers.begin()->first); 418b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 419b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(), 420b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas "All hardware composer layers should have been destroyed"); 421b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 422b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#endif 423b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 424a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 425a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 426a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 427f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 428f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 429a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 430f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 431a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 432a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 433a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 434f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 435a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 4364fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 437f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 438f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 439f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 440f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 441f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 442f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 443f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 444f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 445f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 446f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 447f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 448f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 449f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 450f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 4521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 4531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 4541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 4561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 4571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 4611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 46241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr if (!s.finalCrop.isEmpty()) { 46341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr win.intersect(s.finalCrop, &win); 46441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr } 46541b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr 466e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const sp<Layer>& p = mDrawingParent.promote(); 4671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 4711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 4721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 4731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 4741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 4751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 4761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 4841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 48913127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 4901eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 4916c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 4926c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 4936c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 4946c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 4956c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 49613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 497b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 498b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 499b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 50013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 5011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 503e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 5041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 505de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 506de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 507de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 5081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 5091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 5111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 5121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 5131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 5141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 5151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 5161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5176c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 5186c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 51913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 52013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 5211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 522b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 52313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 5241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 52513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 52613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 52713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 5286b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 5296b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 5306b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 5316b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 5320e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 5330e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 534b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 535df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu activeCrop.intersect(s.crop, &activeCrop); 5360e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 5370e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 5381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 5391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 543b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 544b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!activeCrop.intersect(s.finalCrop, &activeCrop)) { 545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 5491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 5501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5515a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 5521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 5531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 5545a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 5551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 5571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 5581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 5601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 561e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 5621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 5631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto parentCrop = p->computeInitialCrop(hw); 5641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop.intersect(parentCrop, &activeCrop); 5651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 5661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 5671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 5681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 56913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 57028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 57128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 57228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 57328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 57428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 57528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 576acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 577acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 578acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 57913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 580f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 581f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 582f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 583acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 584acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 585acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 586acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 587cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 588acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 589021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 590021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 591acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransformOrient = 593021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 594acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 595acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 596acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 597acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 59813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 599acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 6000f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos invTransform = (Transform(invTransformOrient) * Transform(invTransform)) 6010f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos .getOrientation(); 602acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 603acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 604acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 605acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 606acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 607acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 608acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 609acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 610acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 611acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 612acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 613acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 614acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 615acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 616acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 617acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 618acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 619acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 620acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 621acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos const Rect winCrop = activeCrop.transform( 622acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform, s.active.w, s.active.h); 62313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 624acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 625acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float xScale = crop.getWidth() / float(winWidth); 626acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 62713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 628acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetL = winCrop.left * xScale; 629acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetT = winCrop.top * yScale; 630acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetR = (winWidth - winCrop.right ) * xScale; 631acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 632acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 633acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.left += insetL; 634acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.top += insetT; 635acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.right -= insetR; 636acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 63713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 63813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 63913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 64013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 6419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 642ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 6439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry( 6459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw, 6469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) 6479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 648a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 6499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 6529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setDefaultState(); 6549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 655a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 6563e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 6579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 6619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 6659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(false); 6679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (isSecure() && !hw->isSecure()) { 6699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 6709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 672dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 67313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 6741eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 6759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 676ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 6776452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 678ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman blendMode = mPremultipliedAlpha ? 6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 681ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 682ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" 683ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman " %s (%d)", mName.string(), to_string(blendMode).c_str(), 684ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman to_string(error).c_str(), static_cast<int32_t>(error)); 6859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6866452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 0xFF) { 6879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBlending(mPremultipliedAlpha ? 6889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_PREMULT : 6899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_COVERAGE); 6909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 69213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 69313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 69413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 6956c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 6961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 697b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 698b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 6991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 7009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 701acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 7029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 7049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 705acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 706acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 7071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 70828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 70928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 71028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 71128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 71228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 71328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 714acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 715acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 716acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 7176c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 7186c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 7196c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 7206c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, s.active.h)); 7216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 7226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeCrop.left, activeCrop.bottom)); 7236c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 7246c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, activeCrop.bottom)); 7256c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 7261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 7271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 728b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 729b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!frame.intersect(s.finalCrop, &frame)) { 730acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 731acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 732acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 7339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 734acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 735acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 736acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 739ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 740e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 741e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", 742e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza mName.string(), transformedFrame.left, transformedFrame.top, 743e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza transformedFrame.right, transformedFrame.bottom, 744e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 745e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 746e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 747e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7495a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 751e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 752e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 753e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, 754e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), 755e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza static_cast<int32_t>(error)); 756e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 757e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 758e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7606452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float alpha = getAlpha(); 7616452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " 7636452f12c95e855a96ab8f690f28914cd37de762bRobert Carr "%s (%d)", mName.string(), alpha, to_string(error).c_str(), 7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 766ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", 768ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr mName.string(), z, to_string(error).c_str(), 7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 7702f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 7712a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int type = s.type; 7722a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int appId = s.appId; 773e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> parent = mDrawingParent.promote(); 7742a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk if (parent.get()) { 7752a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk auto& parentState = parent->getDrawingState(); 7762a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk type = parentState.type; 7772a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk appId = parentState.appId; 7782a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk } 7792a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk 7802a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk error = hwcLayer->setInfo(type, appId); 7812f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", 7822f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mName.string(), static_cast<int32_t>(error)); 7839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!frame.intersect(hw->getViewport(), &frame)) { 7859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.clear(); 7869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 7889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setFrame(tr.transform(frame)); 7899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setCrop(computeCrop(hw)); 7906452f12c95e855a96ab8f690f28914cd37de762bRobert Carr layer.setPlaneAlpha(getAlpha()); 7919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 7929f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 79329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 79429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 79529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 79629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 79729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 79829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 79929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 80029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 80129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 8021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 803c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 804cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 805c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 806021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 807021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 808c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 809021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransform = 810021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 811c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 812c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 813c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 814c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian NATIVE_WINDOW_TRANSFORM_FLIP_H; 815c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 816cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 817cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 818cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 819cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 820cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 821cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 822cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 823cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 824c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 82529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 82629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 82713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 8289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 8299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 8309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 8319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 8329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 8339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 8349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 8359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: " 8369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), to_string(transform).c_str(), 8379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 8409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (orientation & Transform::ROT_INVALID) { 8419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we can only handle simple transformation 8429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 8439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setTransform(orientation); 8459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 847a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 848a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 8499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 8509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 8519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 8529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 8539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 8549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 8579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 8589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 8609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply this display's projection's viewport to the visible region 8619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // before giving it to the HWC HAL. 8629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr = displayDevice->getTransform(); 8639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& viewport = displayDevice->getViewport(); 8649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Region visible = tr.transform(visibleRegion.intersect(viewport)); 8659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 866aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcInfo = mHwcLayers[hwcId]; 867aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcLayer = hwcInfo.layer; 8689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setVisibleRegion(visible); 8699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 8709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 8719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza visible.dump(LOG_TAG); 8739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 8769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 8779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 8789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza surfaceDamageRegion.dump(LOG_TAG); 8809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8820f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Sideband layers 8839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mSidebandStream.get()) { 8840f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Sideband); 8850f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Sideband composition", mName.string()); 8860f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 8879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 8889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", 8899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mName.string(), mSidebandStream->handle(), 8909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8920f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 8939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8950a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // Client layers 896aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu if (hwcInfo.forceClientComposition || 8970a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) { 8980f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Client composition", mName.string()); 8999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Client); 9000f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 9010f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 9020f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 9030a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // SolidColor layers 9040a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (mActiveBuffer == nullptr) { 9050a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza setCompositionType(hwcId, HWC2::Composition::SolidColor); 906c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 907c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // For now, we only support black for DimLayer 9080a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza error = hwcLayer->setColor({0, 0, 0, 255}); 9090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (error != HWC2::Error::None) { 9100a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), 9110a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 9120a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 913c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 914c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // Clear out the transform, because it doesn't make sense absent a 915c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // source buffer 916c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza error = hwcLayer->setTransform(HWC2::Transform::None); 917c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza if (error != HWC2::Error::None) { 918c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), 919c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 920c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza } 921c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 9220a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza return; 9230a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 9240a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza 9250f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Device or Cursor layers 9260f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (mPotentialCursor) { 9270f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Cursor composition", mName.string()); 9280f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Cursor); 9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting Device composition", mName.string()); 9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Device); 9329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9330f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 934bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace); 935bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter error = hwcLayer->setDataspace(mCurrentState.dataSpace); 936bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (error != HWC2::Error::None) { 937bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), 938bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace, to_string(error).c_str(), 939bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter static_cast<int32_t>(error)); 940bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter } 941bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 94206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu uint32_t hwcSlot = 0; 9431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara sp<GraphicBuffer> hwcBuffer; 9441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, 9451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara &hwcSlot, &hwcBuffer); 94606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu 9470f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 9481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence); 9490f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (error != HWC2::Error::None) { 9500f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), 9510f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza mActiveBuffer->handle, to_string(error).c_str(), 9520f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza static_cast<int32_t>(error)); 9530f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 9549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9559551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter 9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) { 9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we have to set the visible region on every frame because 9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we currently free it during onLayerDisplayed(), which is called 9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // after HWComposer::commit() -- every frame. 9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Apply this display's projection's viewport to the visible region 9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // before giving it to the HWC HAL. 9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr = hw->getTransform(); 9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setVisibleRegionScreen(visible); 9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSurfaceDamage(surfaceDamageRegion); 9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); 969ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mSidebandStream.get()) { 9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSidebandStream(mSidebandStream); 9729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // NOTE: buffer can be NULL if the client never drew into this 9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // layer yet, or if we ran out of memory 9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBuffer(mActiveBuffer); 9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 9819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 9829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 9839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0 || 9849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza getCompositionType(hwcId) != HWC2::Composition::Cursor) { 9859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 9869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 9889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 9899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 990dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 9919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 9929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 9939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 994b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 995b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 9969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 9989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 9991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 10009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 1001b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1002b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 1003acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 10049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 10059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 10069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 10079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, 10089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top); 10099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position " 10109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "to (%d, %d): %s (%d)", mName.string(), position.left, 10119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top, to_string(error).c_str(), 10129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 10139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 10149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 10159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 10169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) { 10179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fenceFd = -1; 10189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 10199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // TODO: there is a possible optimization here: we only need to set the 10209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // acquire fence the first time a new buffer is acquired on EACH display. 10219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 10229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 10239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 10249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fence->isValid()) { 10259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard fenceFd = fence->dup(); 10269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fenceFd == -1) { 10279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("failed to dup layer fence, skipping sync: %d", errno); 10289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setAcquireFenceFd(fenceFd); 10329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 10339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 10349d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition( 10359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw) 10369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 10379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this gives us only the "orientation" component of the transform 10389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const State& s(getCurrentState()); 10399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 10409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // apply the layer's transform, followed by the display's global transform 10419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // here we're guaranteed that the layer's transform preserves rects 10429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect win(s.active.w, s.active.h); 10439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.crop.isEmpty()) { 10449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard win.intersect(s.crop, &win); 10459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // subtract the transparent region and snap to the bounds 10479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect bounds = reduce(win, s.activeTransparentRegion); 10481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 10499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(hw->getViewport(), &frame); 10509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.finalCrop.isEmpty()) { 10519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(s.finalCrop, &frame); 10529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 10549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return Rect(tr.transform(frame)); 10559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 10569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 105703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 105813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 105913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 106213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 1063c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, clip, false); 106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 106513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1066c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw, 1067c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const { 1068c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), useIdentityTransform); 106913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 107013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1071c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const { 1072c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), false); 1073c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 1074c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 1075cae605cd5668f8107e340ad8a672c7f034147401Robert Carrstatic constexpr mat4 inverseOrientation(uint32_t transform) { 1076cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 1077cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 1078cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 1079cae605cd5668f8107e340ad8a672c7f034147401Robert Carr mat4 tr; 1080cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 1081cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 1082cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * rot90; 1083cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1084cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) { 1085cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * flipH; 1086cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1087cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) { 1088cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * flipV; 1089cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1090cae605cd5668f8107e340ad8a672c7f034147401Robert Carr return inverse(tr); 1091cae605cd5668f8107e340ad8a672c7f034147401Robert Carr} 1092cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 10935d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter/* 10945d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter * onDraw will draw the current layer onto the presentable buffer 10955d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter */ 1096c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 1097c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 10991c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 11001c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 1101a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (CC_UNLIKELY(mActiveBuffer == 0)) { 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the texture has not been created yet, this Layer has 1103179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // in fact never been drawn into. This happens frequently with 1104179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // SurfaceView because the WindowManager can't know when the client 1105179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // has drawn the first time. 1106179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 1107179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // If there is nothing under us, we paint the screen in black, otherwise 1108179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // we just skip this update. 1109179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 1110179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // figure out if there is something below us 1111179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region under; 11121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bool finished = false; 1113412903fce3a93f411c85c54375a1851bfb370400Dan Stoza mFlinger->mDrawingState.traverseInZOrder([&](Layer* layer) { 11141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (finished || layer == static_cast<Layer const*>(this)) { 11151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr finished = true; 11161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return; 11171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 11184297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 11191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr }); 1120179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // if not everything below us is covered, we plug the holes! 1121179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region holes(clip.subtract(under)); 1122179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian if (!holes.isEmpty()) { 11231748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0, 0, 0, 1); 1124179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian } 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1127a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 112897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // Bind the current buffer to the GL texture, and wait for it to be 112997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // ready for us to draw into. 1130bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 1131bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (err != NO_ERROR) { 113297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 1133dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // Go ahead and draw the buffer anyway; no matter what we do the screen 1134dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // is probably going to have something visibly wrong. 1135dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 1136dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 1137dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 1138dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 1139875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1140875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 1141dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis if (!blackOutLayer) { 1142cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // TODO: we could be more subtle with isFixedSize() 1143eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 1144cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1145cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Query the texture matrix given our current filtering mode. 1146cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis float textureMatrix[16]; 1147bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 1148bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 1149cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1150cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 1151c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1152c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 1153021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to 1154021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the texture transform 1155c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 1156021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 1157021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 1158cae605cd5668f8107e340ad8a672c7f034147401Robert Carr mat4 tr = inverseOrientation(transform); 1159cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 1160cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /** 1161cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * TODO(b/36727915): This is basically a hack. 1162cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * 1163cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Ensure that regardless of the parent transformation, 1164cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * this buffer is always transformed from native display 1165cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * orientation to display orientation. For example, in the case 1166cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * of a camera where the buffer remains in native orientation, 1167cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * we want the pixels to always be upright. 1168cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 1169e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> p = mDrawingParent.promote(); 1170e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu if (p != nullptr) { 1171e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto parentTransform = p->getTransform(); 1172cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * inverseOrientation(parentTransform.getOrientation()); 1173cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1174c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1175c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and finally apply it to the original texture matrix 1176c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 1177c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 1178c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 1179c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1180cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Set things up for texturing. 118149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 118249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setFiltering(useFiltering); 118349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setMatrix(textureMatrix); 118449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian 118549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian engine.setupLayerTexturing(mTexture); 1186a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } else { 1187875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.setupLayerBlackedOut(); 1188a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } 11898578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard drawWithOpenGL(hw, useIdentityTransform); 1190875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableTexturing(); 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1194c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 11951748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard float red, float green, float blue, 1196c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza float alpha) const 119713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 119819733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1199c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, false); 120019733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 120119733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 120213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 120313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 120413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL( 12051748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard const sp<const DisplayDevice>& hw) const { 12061748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0,0,0,0); 120713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 120813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1209c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 12108578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard bool useIdentityTransform) const { 12111eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 121213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1213c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, useIdentityTransform); 121413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 121513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian /* 121613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * NOTE: the way we compute the texture coordinates here produces 121713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * different results than when we take the HWC path -- in the later case 121813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * the "source crop" is rounded to texel boundaries. 121913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * This can produce significantly different results when the texture 122013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * is scaled by a large amount. 122113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * 122213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * The GL code below is more logical (imho), and the difference with 122313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * HWC is due to a limitation of the HWC API to integers -- a question 1224c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian * is suspend is whether we should ignore this problem or revert to 122513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * GL composition when a buffer scaling is applied (maybe with some 122613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * minimal value)? Or, we could make GL behave like HWC -- but this feel 122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * like more of a hack. 122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian */ 1229acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos Rect win(computeBounds()); 1230acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 12311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 1232b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 12331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 1234b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!win.intersect(s.finalCrop, &win)) { 1235acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1236acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 12371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 1238acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!win.intersect(computeBounds(), &win)) { 1239acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1240acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1241acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 124213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 12433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float left = float(win.left) / float(s.active.w); 12443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float top = float(win.top) / float(s.active.h); 12453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float right = float(win.right) / float(s.active.w); 12463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float bottom = float(win.bottom) / float(s.active.h); 124713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1248875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // TODO: we probably want to generate the texture coords with the mesh 1249875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // here we assume that we only have 4 vertices 1250ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 1251ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[0] = vec2(left, 1.0f - top); 1252ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[1] = vec2(left, 1.0f - bottom); 1253ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[2] = vec2(right, 1.0f - bottom); 1254ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[3] = vec2(right, 1.0f - top); 125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1256875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 12576452f12c95e855a96ab8f690f28914cd37de762bRobert Carr engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), getAlpha()); 12585d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2 12595d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter engine.setSourceDataSpace(mCurrentState.dataSpace); 12605d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif 12615cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian engine.drawMesh(mMesh); 1262875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableBlending(); 126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 12659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 12669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, 12679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool callIntoHwc) { 12689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 12699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 12709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 12719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 12739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 12749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), 12759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), static_cast<int>(callIntoHwc)); 12769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 12779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 12789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 12799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 12809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 12819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set " 12829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "composition type %s: %s (%d)", mName.string(), 12839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), to_string(error).c_str(), 12849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 12859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 12889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 1290ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 1291ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 1292ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 1293ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 1294ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 12959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 1296ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 12979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 12989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 13009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 13019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 13029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 13039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 13049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 13059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 13069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 13079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 13089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 13099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 13109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 13119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 13129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 13139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 13149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 13159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 13169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 13179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 13189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 13191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const { 13201681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int producerStickyTransform = 0; 13211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 13221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (ret != OK) { 13231681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 13241681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk strerror(-ret), ret); 13251681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return 0; 13261681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 13271681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return static_cast<uint32_t>(producerStickyTransform); 13281681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 13291681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 1330c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() { 1331c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool propertyLoaded = false; 1332c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool latch = false; 1333c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static std::mutex mutex; 1334c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza std::lock_guard<std::mutex> lock(mutex); 1335c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (!propertyLoaded) { 1336c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza char value[PROPERTY_VALUE_MAX] = {}; 1337c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza property_get("debug.sf.latch_unsignaled", value, "0"); 1338c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza latch = atoi(value); 1339c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza propertyLoaded = true; 1340c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1341c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return latch; 1342c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza} 1343c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 1344cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const { 1345cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mQueueItemLock); 1346cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!mQueueItems.empty()) { 1347cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mQueueItems[0].mFrameNumber; 1348cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1349cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mCurrentFrameNumber; 13507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1351cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza} 13527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13531ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const { 13549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1355c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (latchUnsignaledBuffers()) { 1356c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return true; 1357c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1358c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 13591ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza Mutex::Autolock lock(mQueueItemLock); 13601ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems.empty()) { 13611ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 13621ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 13631ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems[0].mIsDroppable) { 13641ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // Even though this buffer's fence may not have signaled yet, it could 13651ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // be replaced by another buffer before it has a chance to, which means 13661ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // that it's possible to get into a situation where a buffer is never 13671ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // able to be latched. To avoid this, grab this buffer anyway. 13681ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 13691ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 1370fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson return mQueueItems[0].mFenceTime->getSignalTime() != 1371fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson Fence::SIGNAL_TIME_PENDING; 13729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 13739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return true; 13749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 13751ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza} 13761ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 1377cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 1378cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 1379cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 1380cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 1381cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 13827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1383cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1384cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1385cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 1386cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 13877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 138913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1397ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range 1398ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and 1399ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel 1400ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into 1401ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here. 1402ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 1403ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 14045773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) { 1405a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (HARDWARE_IS_DEVICE_FORMAT(format)) { 1406a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return true; 1407ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold } 14085773d3f5b2694c647e010246dff99acc70131289Mathias Agopian switch (format) { 14095773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 14105773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 1411ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy case HAL_PIXEL_FORMAT_RGBA_FP16: 1412541f22658ab1617c9d12c98684ab40248df8749bRomain Guy case HAL_PIXEL_FORMAT_RGBA_1010102: 1413dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return false; 14145773d3f5b2694c647e010246dff99acc70131289Mathias Agopian } 14155773d3f5b2694c647e010246dff99acc70131289Mathias Agopian // in all other case, we have no blending (also for unknown formats) 1416dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return true; 1417ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold} 1418ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 142213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 1424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 1425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 1426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 1428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 1429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 1431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 1432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 1434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 1435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 1437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1438c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 1439c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 144013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 14411eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 14421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Transform hwTransform(hw->getTransform()); 144313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t hw_h = hw->getHeight(); 14441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 14453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 1447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 1448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 1449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 1450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 14511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 1452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 14531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 14541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 14551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 14561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 1457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1459b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1460b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 1461b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 1462b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 1463b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 1464acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1465acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1466ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 14671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[0] = hwTransform.transform(lt); 14681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[1] = hwTransform.transform(lb); 14691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[2] = hwTransform.transform(rb); 14701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[3] = hwTransform.transform(rt); 14713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian for (size_t i=0 ; i<4 ; i++) { 14725cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian position[i].y = hw_h - position[i].y; 147313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 147413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1475ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 14764125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const 1477a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{ 1478e6fd41d064711395c7d060abacd86d487495530dneo.he // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the 1479a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // layer's opaque flag. 1480e6fd41d064711395c7d060abacd86d487495530dneo.he if ((mSidebandStream == nullptr) && (mActiveBuffer == nullptr)) { 1481a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return false; 1482db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis } 1483a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 1484a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if the layer has the opaque flag, then we're always opaque, 1485a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // otherwise we use the current buffer's format. 14864125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 1487a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian} 1488a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 1489231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const 1490231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{ 1491231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 1492231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 1493231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 1494231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 14957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const 14967a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{ 1497a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 14987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis return (activeBuffer != 0) && 14997a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 15007a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1501b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 150213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const { 1503c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE; 150413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 150513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 150613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const { 150713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return !mCurrentCrop.isEmpty(); 150813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 150913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 151013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 151113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mNeedsFiltering || hw->needsFiltering(); 151213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 151313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 151413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 151513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 151613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 151713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 151813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 151913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 152013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 152113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 152213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 152313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 152413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region& 152513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setVisibleNonTransparentRegion) { 152613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 152713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 152813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 152913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 153013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 153113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 153213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 153313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 15347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 15357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 15367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 15407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 15410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 15420d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 15430d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 15440d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 15467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 15477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 15480d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 15493bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 15503bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos auto syncPoint = std::make_shared<SyncPoint>( 15513bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos mCurrentState.frameNumber); 15520d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 1553cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 1554cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1555cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 1556cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 15570d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1558cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 15597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 15627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 1563f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 15647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 1566f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 15677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 156905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 157005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 157105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 157205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos stateToCommit->flags = (oldFlags & ~stateToCommit->mask) | 157305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos (stateToCommit->flags & stateToCommit->mask); 15747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 1576f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 15777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 157905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 15807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 15817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 15820d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 15837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 15847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 15857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 15867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 15877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 158805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 15897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 15907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 15917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1593cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (mRemoteSyncPoints.front()->getFrameNumber() != 1594cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mPendingStates[0].frameNumber) { 1595cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ALOGE("[%s] Unexpected sync point frame number found", 1596cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mName.string()); 1597cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1598cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 1599cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 1600cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 1601cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 1602cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1603cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 16047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 16057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 160605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 16077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 16087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 16097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 16107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 16117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 1612792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 1613792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 16147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 16157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 161605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 16177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 16187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 16197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 16207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 16217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 16227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 16237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 16247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 16257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 16267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 16277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 16287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 16297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 16307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 16317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 16327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() { 1633cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto headFrameNumber = getHeadFrameNumber(); 16341ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza bool headFenceSignaled = headFenceHasSignaled(); 1635cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1636cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mLocalSyncPoints) { 16371ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { 1638cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setFrameAvailable(); 1639cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 16407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 16417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 16427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 164313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 16441c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 16451c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 16467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 164705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 164805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 16497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 16507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 16517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 16521eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 16541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const bool sizeChanged = (c.requested.w != s.requested.w) || 16551eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian (c.requested.h != s.requested.h); 1656a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1657a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian if (sizeChanged) { 1658cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 16599d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 16606905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1661419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1662b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n" 1663419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1664b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n", 1665c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr this, getName().string(), mCurrentTransform, 1666c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr getEffectiveScalingMode(), 16671eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.active.w, c.active.h, 1668b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.left, 1669b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.top, 1670b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.right, 1671b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.bottom, 1672b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getWidth(), 1673b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getHeight(), 16741eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h, 16751eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian s.active.w, s.active.h, 1676b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, 1677b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.top, 1678b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, 1679b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.bottom, 1680b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getWidth(), 1681b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getHeight(), 1682b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.requested.w, s.requested.h); 1683a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 16842a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 16852a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1686bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setDefaultBufferSize( 16871eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h); 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1689cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 169082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr const bool resizePending = (c.requested.w != c.active.w) || 169182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr (c.requested.h != c.active.h); 16920cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 16939e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 169413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // don't let Layer::doTransaction update the drawing state 16950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // if we have a pending resize, unless we are in fixed-size mode. 16960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // the drawing state will be updated only once we receive a buffer 16970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // with the correct size. 16980cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // 16990cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // in particular, we want to make sure the clip (which is part 17000cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // of the geometry state) is latched together with the size but is 17010cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // latched immediately when no resizing is involved. 17029e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // 17039e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // If a sideband stream is attached, however, we want to skip this 17049e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // optimization so that transactions aren't missed when a buffer 17059e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // never arrives 17060cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 17070cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 17080cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 17090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 17100cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 17117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we apply various requested geometry states, depending on our 17127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // latching configuration. See Layer.h for a detailed discussion of 17137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // how geometry latching is controlled. 17147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (!(flags & eDontUpdateGeometryState)) { 17157d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 17167bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 17177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize 17187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // mode, which causes attributes which normally latch regardless of scaling mode, 17197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to be delayed. We copy the requested state to the active state making sure 17207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to respect these rules (again see Layer.h for a detailed discussion). 17217bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 17227bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // There is an awkward asymmetry in the handling of the crop states in the position 17237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // states, as can be seen below. Largely this arises from position and transform 17247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // being stored in the same data structure while having different latching rules. 17257bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 17267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 17277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Careful that "c" and editCurrentState may not begin as equivalent due to 17287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // applyPendingStates in the presence of deferred transactions. 17297bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mFreezeGeometryUpdates) { 173082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 173182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 173282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 173382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 173482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 173582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 173682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 173782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 173882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 173913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 174013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 17411eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 174313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 174413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 174513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 17461eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 174813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 174913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 175013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 175113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 17523dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 17533dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mNeedsFiltering = (!c.active.transform.preserveRects() || 175413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian (type >= Transform::SCALE)); 175513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 175613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1757c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1758c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1759c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1760c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 17611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1762c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1763c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 176413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 176505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 176613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 176905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 177005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1771a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1772a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 177513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 177613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 177813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 177913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 178013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 178182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 17823dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 178313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 178413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 178569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 178669663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 178769663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 178869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 17893dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 17907bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 17917bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we directly update the active state 17927bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // unlike other setters, because we store it within 17937bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // the transform, but use different latching rules. 17947bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 179582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 179682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 17977bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 179869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 17997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 180013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 180113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 180213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 180382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 18041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 18051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 18061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 18071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 18081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 18101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 18111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 18121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 18141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1816ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.z == z) 181813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 181913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 182013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 18217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1822db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1823db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1824db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1825db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1826db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1827db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1828db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1829db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1830db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 183113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 183213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 183313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 18341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1835db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1836db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1837db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1838db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1839db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1840db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1841db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1842db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1843db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1844db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1845db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1846db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1847db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1848db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1849db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) { 1850db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1851db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1852db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1853db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1854db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1855db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1856db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1857db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1858db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1859db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1860db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1861db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.z = z; 1862db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1863db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1864db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1865db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1866db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1867db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1868db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1869db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1870db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 187113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 187213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 187313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 187413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 187513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 18767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 187713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 187813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 187913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 18809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 18819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 18829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 18839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) { 18849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 188513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.alpha == alpha) 188613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 188713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 188813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.alpha = alpha; 18897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 189013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 189113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 189213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 189313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 189413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 18953dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set( 1896cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 18977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 189813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 189913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 190013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 190113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 19022ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 19037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 190413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 190513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 190613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 190713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 190813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 190913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.flags == newFlags) 191013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 191113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 191213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 19137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 19147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 191513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 191613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 191713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 191899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 191999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 19207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mCurrentState.requestedCrop == crop) 192113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 192213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 192399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 19247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 192599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 192699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 19277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 19287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 19297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 193013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 193113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 193213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 19338d5227b8416b099c884429312daf2d60496fa484Robert Carr 19348d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 19357bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mCurrentState.requestedFinalCrop == crop) 1936acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return false; 1937acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 19388d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 19397bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 19408d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 19418d5227b8416b099c884429312daf2d60496fa484Robert Carr } 19427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 19437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 1944acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1945acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1946acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1947acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 194813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1949c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 1950c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (scalingMode == mOverrideScalingMode) 1951c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return false; 1952c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 195382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1954c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1955c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1956c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 19572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 19582f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = appId; 19592f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = type; 19602f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.modified = true; 19612f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara setTransactionFlags(eTransactionNeeded); 19622f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 19632f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1964c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const { 1965c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (mOverrideScalingMode >= 0) { 1966c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mOverrideScalingMode; 1967c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 1968c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mCurrentScalingMode; 1969c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1970c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 197113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 197213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.layerStack == layerStack) 197313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 197413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 197513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 19767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 197713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 197813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1979a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1980a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1981bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 1982bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (mCurrentState.dataSpace == dataSpace) 1983bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return false; 1984bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1985bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1986bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1987bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1988bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1989bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1990bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 1991532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 1992532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1993532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1994532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 19951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 1996e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu auto p = mDrawingParent.promote(); 19971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 19981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 19991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 20001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 20011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 20021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 20030d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, 20047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber) { 20050d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 20067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 20077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 20087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 20097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 20107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 20110d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 2012792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 20137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 20140d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 20150d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 20160d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, 20170d48072f6047140119ff194c1194ce402fca2c0bRobert Carr uint64_t frameNumber) { 20180d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 20190d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 20207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 20217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 2022ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() { 2023ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza if (mFlinger->mForceFullDamage) { 2024ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = Region::INVALID_REGION; 2025ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } else { 2026ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 2027ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } 2028ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 2029ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 2030ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() { 2031ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.clear(); 2032ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 2033ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20386b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const { 2039ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mSidebandStreamChanged || mAutoRefresh) { 2040d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza return true; 2041d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza } 2042d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza 20436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 20440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza if (mQueueItems.empty()) { 20450eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return false; 20460eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza } 20470eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza auto timestamp = mQueueItems[0].mTimestamp; 20486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza nsecs_t expectedPresent = 20496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 20500eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 20510eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza // Ignore timestamps more than a second in the future 20520eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 20530eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 20540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza "relative to expectedPresent %" PRId64, mName.string(), timestamp, 20550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza expectedPresent); 20560eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 20570eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isDue = timestamp < expectedPresent; 20580eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return isDue || !isPlausible; 20596b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 20606b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 2061d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) { 2062d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (mBufferLatched) { 2063d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2064d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime); 2065d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 20664d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending = false; 2067ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh; 206899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 206999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 20700a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, 20713d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson const std::shared_ptr<FenceTime>& presentFence, 20720a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson const CompositorTiming& compositorTiming) { 2073d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // mFrameLatencyNeeded is true when a new frame was latched for the 2074d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // composition. 207528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (!mFrameLatencyNeeded) 207628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return false; 207728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 207828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameEventHistory. 207928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard { 208028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard Mutex::Autolock lock(mFrameEventHistoryMutex); 208128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameEventHistory.addPostComposition(mCurrentFrameNumber, 20820a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson glDoneFence, presentFence, compositorTiming); 208328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 208482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 208528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameTracker. 208628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 208728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setDesiredPresentTime(desiredPresentTime); 208882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 20893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime> frameReadyFence = 20903d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mSurfaceFlingerConsumer->getCurrentFenceTime(); 209128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (frameReadyFence->isValid()) { 20923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setFrameReadyFence(std::move(frameReadyFence)); 209328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 209428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // There was no fence for this frame, so assume that it was ready 209528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // to be presented at the desired present time. 209628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setFrameReadyTime(desiredPresentTime); 209728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 209882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 20993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson if (presentFence->isValid()) { 21003d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentFence( 21013d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime>(presentFence)); 210228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 210328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // The HWC doesn't support present fences, so use the refresh 210428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // timestamp instead. 21053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentTime( 21063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFlinger->getHwComposer().getRefreshTimestamp( 21073d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson HWC_DISPLAY_PRIMARY)); 2108d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 210928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 211028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.advanceFrame(); 211128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameLatencyNeeded = false; 211228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return true; 2113d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 2114d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 21159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2116f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { 21175ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { 21185ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson return; 21195ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson } 21205ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 21213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 2122d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 2123fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mReleaseTimeline.updateSignalTimes(); 21243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 21253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 21263d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 21278cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson if (mPreviousFrameNumber != 0) { 21288cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mFrameEventHistory.addRelease(mPreviousFrameNumber, 21298cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson dequeueReadyTime, std::move(releaseFenceTime)); 21308cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson } 21319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 21329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 21339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 21341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 21351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 2136e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& parent = mDrawingParent.promote(); 21371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 21381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 21391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 21401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 21411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 21421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2143da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const { 21449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 21456452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return !(isHiddenByPolicy()) && getAlpha() > 0.0f 21469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza && (mActiveBuffer != NULL || mSidebandStream != NULL); 21479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 21486452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return !(isHiddenByPolicy()) && getAlpha() 21499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard && (mActiveBuffer != NULL || mSidebandStream != NULL); 21509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2151da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 2152da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2153cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() { 2154cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard auto headFrameNumber = getHeadFrameNumber(); 2155cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool matchingFramesFound = false; 2156cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool allTransactionsApplied = true; 2157cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 2158cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2159cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard for (auto& point : mLocalSyncPoints) { 2160cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (point->getFrameNumber() > headFrameNumber) { 2161cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 2162cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 2163cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard matchingFramesFound = true; 2164cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2165cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!point->frameIsAvailable()) { 2166cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // We haven't notified the remote layer that the frame for 2167cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // this point is available yet. Notify it now, and then 2168cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // abort this attempt to latch. 2169cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard point->setFrameAvailable(); 2170cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = false; 2171cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 2172cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 2173cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2174cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied(); 2175cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 2176cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard return !matchingFramesFound || allTransactionsApplied; 2177cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard} 2178cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2179d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) 2180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 21811c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 21821c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 2183399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 2184399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was true 2185399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 218612e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza if (mSidebandStream != NULL) { 218712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza setTransactionFlags(eTransactionNeeded); 218812e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 218912e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza } 21905bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall recomputeVisibleRegions = true; 21915bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall 21925bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall const State& s(getDrawingState()); 21931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getTransform().transform(Region(Rect(s.active.w, s.active.h))); 2194399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 2195399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 21964fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region outDirtyRegion; 2197223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mQueuedFrames <= 0 && !mAutoRefresh) { 2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 220099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // if we've already called updateTexImage() without going through 2202223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // a composition step, we have to skip this layer at this point 2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // because we cannot call updateTeximage() without a corresponding 2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // compositionComplete() call. 2205223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // we'll trigger an update in onPreComposition(). 2206223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mRefreshPending) { 2207223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2208223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 22091ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 2210223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the head buffer's acquire fence hasn't signaled yet, return and 2211223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // try again later 2212223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!headFenceHasSignaled()) { 2213223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2214223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2215223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 22162c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 2217223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Capture the old state of the layer for comparisons later 2218223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const State& s(getDrawingState()); 2219223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const bool oldOpacity = isOpaque(s); 2220223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 2221223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2222cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!allTransactionsSignaled()) { 2223223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2224223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2225223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2226223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2227223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This boolean is used to make sure that SurfaceFlinger's shadow copy 2228223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // of the buffer queue isn't modified when the buffer queue is returning 2229223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // BufferItem's that weren't actually queued. This can happen in shared 2230223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // buffer mode. 2231223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bool queuedBuffer = false; 22327b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 22337b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard getProducerStickyTransform() != 0, mName.string(), 22347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mOverrideScalingMode, mFreezeGeometryUpdates); 2235223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 2236223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, 2237223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mLastFrameNumberReceived); 2238223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (updateResult == BufferQueue::PRESENT_LATER) { 2239223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Producer doesn't want buffer to be displayed yet. Signal a 2240223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // layer update so we check again at the next opportunity. 2241223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2242223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2243223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 2244223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the buffer has been rejected, remove it from the shadow queue 2245223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // and return early 2246063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 22476b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 2248223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2249223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 2250223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2251223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2252223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 2253223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This can occur if something goes wrong when trying to create the 2254223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // EGLImage for this buffer. If this happens, the buffer has already 2255223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // been released, so we need to clean up the queue and bug out 2256223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // early. 2257223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2258223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2259223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.clear(); 2260223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_and(0, &mQueuedFrames); 2261223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2262ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2263223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Once we have hit this state, the shadow queue may no longer 2264223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // correctly reflect the incoming BufferQueue's contents, so even if 2265223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage starts working, the only safe course of action is 2266223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // to continue to ignore updates. 2267223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mUpdateTexImageFailed = true; 2268ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2269223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2270223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2271223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2272223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2273223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Autolock scope 2274223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2275223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2276223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2277223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2278223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any stale buffers that have been dropped during 2279223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage 2280223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 22816b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.removeAt(0); 2282223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 22836b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 22846b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 2285223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2286223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2287ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 22881585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 2289223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Decrement the queued-frames count. Signal another event if we 2290223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // have more frames pending. 2291223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 2292223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard || mAutoRefresh) { 2293223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2294223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2295d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian 2296223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // update the active buffer 229706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer( 229806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &mActiveBufferSlot); 2299223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mActiveBuffer == NULL) { 2300223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // this can only happen if the very first buffer was rejected. 2301223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2302223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2303702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2304d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched = true; 2305d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mPreviousFrameNumber = mCurrentFrameNumber; 2306d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2307d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2308d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson { 2309d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2310d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); 2311d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2 23123d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 2313d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 2314fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mReleaseTimeline.updateSignalTimes(); 23153d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 23168cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson if (mPreviousFrameNumber != 0) { 23178cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mFrameEventHistory.addRelease(mPreviousFrameNumber, 23188cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson latchTime, std::move(releaseFenceTime)); 23198cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson } 2320d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif 2321d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 2322d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2323223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mRefreshPending = true; 2324223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFrameLatencyNeeded = true; 2325223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer == NULL) { 2326223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // the first time we receive a buffer, we need to trigger a 2327223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // geometry invalidation. 2328223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2329223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2330223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2331bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace()); 2332bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 2333223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 2334223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 2335223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 2336223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((crop != mCurrentCrop) || 2337223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (transform != mCurrentTransform) || 2338223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (scalingMode != mCurrentScalingMode)) 2339223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2340223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentCrop = crop; 2341223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentTransform = transform; 2342223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentScalingMode = scalingMode; 2343223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2344223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2345702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2346223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer != NULL) { 2347223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufWidth = mActiveBuffer->getWidth(); 2348223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufHeight = mActiveBuffer->getHeight(); 2349223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (bufWidth != uint32_t(oldActiveBuffer->width) || 2350223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bufHeight != uint32_t(oldActiveBuffer->height)) { 2351702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian recomputeVisibleRegions = true; 2352702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2353223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2354702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2355223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 2356223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldOpacity != isOpaque(s)) { 2357223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2358223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2359cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2360223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any sync points corresponding to the buffer which was just 2361223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latched 2362223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2363223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 2364223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto point = mLocalSyncPoints.begin(); 2365223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (point != mLocalSyncPoints.end()) { 2366223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!(*point)->frameIsAvailable() || 2367223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard !(*point)->transactionIsApplied()) { 2368223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This sync point must have been added since we started 2369223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latching. Don't drop it yet. 2370223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2371223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard continue; 2372223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2373223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2374223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((*point)->getFrameNumber() <= mCurrentFrameNumber) { 2375223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard point = mLocalSyncPoints.erase(point); 2376223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else { 2377223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2378cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2379cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2380223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2381cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2382223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // FIXME: postedRegion should be dirty & bounds 2383223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Region dirtyRegion(Rect(s.active.w, s.active.h)); 2384223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2385223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // transform the dirty region to window-manager space 23861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr outDirtyRegion = (getTransform().transform(dirtyRegion)); 23871c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 23884fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 2389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 239113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const 239213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 239313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 239413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 239513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 239613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 239713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 239803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 239903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 240003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 240113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 240213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 240313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 240413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 240513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 240613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 240713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 240813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 240913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 241013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 241113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 241213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 241313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 241413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 241513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 241613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 241713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setTransformHint(orientation); 241813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 241913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 242013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 242113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 242213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 242313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2424a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const { 2425a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerDebugInfo info; 2426a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const Layer::State& ds = getDrawingState(); 2427a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mName = getName(); 24281acbec7884a47f316005ba4f2b5e47c74317ee43chaviw sp<Layer> parent = getParent(); 2429a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); 2430a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mType = String8(getTypeId()); 2431a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mTransparentRegion = ds.activeTransparentRegion; 2432a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mVisibleRegion = visibleRegion; 2433a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mSurfaceDamageRegion = surfaceDamageRegion; 2434a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mLayerStack = getLayerStack(); 2435a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mX = ds.active.transform.tx(); 2436a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mY = ds.active.transform.ty(); 2437a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mZ = ds.z; 2438a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mWidth = ds.active.w; 2439a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mHeight = ds.active.h; 2440a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mCrop = ds.crop; 2441a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFinalCrop = ds.finalCrop; 2442a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mAlpha = ds.alpha; 2443a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFlags = ds.flags; 2444a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mPixelFormat = getPixelFormat(); 2445a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mDataSpace = getDataSpace(); 2446a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][0] = ds.active.transform[0][0]; 2447a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][1] = ds.active.transform[0][1]; 2448a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][0] = ds.active.transform[1][0]; 2449a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][1] = ds.active.transform[1][1]; 2450a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 2451a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita sp<const GraphicBuffer> activeBuffer = getActiveBuffer(); 2452a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (activeBuffer != 0) { 2453a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = activeBuffer->getWidth(); 2454a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = activeBuffer->getHeight(); 2455a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = activeBuffer->getStride(); 2456a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = activeBuffer->format; 2457a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } else { 2458a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = 0; 2459a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = 0; 2460a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = 0; 2461a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = 0; 2462a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 2463bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 2464a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mNumQueuedFrames = getQueuedFrameCount(); 2465a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mRefreshPending = isBufferLatched(); 2466a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mIsOpaque = isOpaque(ds); 2467a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mContentDirty = contentDirty; 2468a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return info; 2469d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 2470d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian 24719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2472e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 2473e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2474e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2475e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 2476e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 2477e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 2478e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 2479e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 2480e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2481e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2482e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 2483e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2484e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 2485e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 2486e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 2487e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2488e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2489e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 2490e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 2491e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 2492e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 2493e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 2494e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 2495e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 2496e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 2497e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 2498e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2499e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2500e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 2501e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2502e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 2503e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 25048c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck result.appendFormat(" %10d | ", layerState.z); 2505e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%10s | ", 2506e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(getCompositionType(hwcId)).c_str()); 2507e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 2508e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, 2509e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza frame.right, frame.bottom); 25105a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 2511e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, 2512e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza crop.right, crop.bottom); 2513e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2514e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 2515e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 2516e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 25179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2518e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2519d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 2520d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 252182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 252282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2523d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 2524d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 252525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 252625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 25276547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 25286547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 25296547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 25306547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 2531d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 2532d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 2533d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 2534d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 2535d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 2536d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson result.appendFormat("- Layer %s (%s, %p)\n", 2537d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson getName().string(), getTypeId(), this); 2538d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2539d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 2540d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 2541d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 2542d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 25435ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 25445ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 25455ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 25465ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 25475ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 25483890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 25493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta *outDelta) { 2550d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2551d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 2552fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // If there are any unsignaled fences in the aquire timeline at this 2553fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // point, the previously queued frame hasn't been latched yet. Go ahead 2554fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // and try to get the signal time here so the syscall is taken out of 2555fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // the main thread's critical path. 2556fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mAcquireTimeline.updateSignalTimes(); 2557fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // Push the new fence after updating since it's likely still pending. 25583d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 2559d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 2560d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 256140845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 25623890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 25633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 2564d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 256540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 2566e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2567e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory( 2568e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza bool forceFlush) { 2569e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza std::vector<OccupancyTracker::Segment> history; 2570e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, 2571e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza &history); 2572e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza if (result != NO_ERROR) { 2573e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), 2574e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza result); 2575e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return {}; 2576e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza } 2577e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return history; 2578e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza} 2579e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2580367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const { 2581367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); 2582367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr} 2583367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 258498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const { 258598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu size_t count = 0; 258698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu for (const sp<Layer>& child : mCurrentChildren) { 258798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu count += 1 + child->getChildrenCount(); 258898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu } 258998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu return count; 259098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu} 259198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu 25921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 25931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 25941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 25951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 25981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 25991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 26001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26021db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 26031db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 26041db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 26051db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 26061db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 26071db73f66624e7d151710483dd58e03eed672f064Robert Carr } 26081db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 26091db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 26101db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 26111db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 26121db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 26131db73f66624e7d151710483dd58e03eed672f064Robert Carr } 26141db73f66624e7d151710483dd58e03eed672f064Robert Carr 26151db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 2616e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu newParent->addChild(child); 26171db73f66624e7d151710483dd58e03eed672f064Robert Carr 26181db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 26191db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 26201db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 26211db73f66624e7d151710483dd58e03eed672f064Robert Carr } 26221db73f66624e7d151710483dd58e03eed672f064Robert Carr } 26231db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 26241db73f66624e7d151710483dd58e03eed672f064Robert Carr 26251db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 26261db73f66624e7d151710483dd58e03eed672f064Robert Carr} 26271db73f66624e7d151710483dd58e03eed672f064Robert Carr 2628f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) { 2629f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (newParentHandle == nullptr) { 26300617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 26310617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 26320617894190ea0c3ee50889bee1d4df0f369b0761chaviw 26330617894190ea0c3ee50889bee1d4df0f369b0761chaviw auto handle = static_cast<Handle*>(newParentHandle.get()); 26340617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Layer> newParent = handle->owner.promote(); 26350617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (newParent == nullptr) { 26360617894190ea0c3ee50889bee1d4df0f369b0761chaviw ALOGE("Unable to promote Layer handle"); 26370617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 26380617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 26390617894190ea0c3ee50889bee1d4df0f369b0761chaviw 2640f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Layer> parent = getParent(); 2641f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (parent != nullptr) { 2642f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw parent->removeChild(this); 26430617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 2644f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw newParent->addChild(this); 26450617894190ea0c3ee50889bee1d4df0f369b0761chaviw 2646f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Client> client(mClientRef.promote()); 26470617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Client> newParentClient(newParent->mClientRef.promote()); 26480617894190ea0c3ee50889bee1d4df0f369b0761chaviw 2649f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (client != newParentClient) { 2650f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw client->setParentLayer(newParent); 26510617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 26520617894190ea0c3ee50889bee1d4df0f369b0761chaviw 26530617894190ea0c3ee50889bee1d4df0f369b0761chaviw return true; 26540617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 26550617894190ea0c3ee50889bee1d4df0f369b0761chaviw 26569524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 2657412903fce3a93f411c85c54375a1851bfb370400Dan Stoza traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) { 26589524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (child == this) { 26599524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return; 26609524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 26619524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 2662161410b01a37bcc5522d8e91fe0a743989c86e70chaviw sp<Client> parentClient = mClientRef.promote(); 26639524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 2664161410b01a37bcc5522d8e91fe0a743989c86e70chaviw if (client != nullptr && parentClient != client) { 26659524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr client->detachLayer(child); 26669524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 26679524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr }); 26689524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 26699524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 26709524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 26719524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 26721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 2673e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mCurrentParent = layer; 26741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 26771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 26781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 26791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 26801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 26821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 26831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 26841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 26851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 26861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 26891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 26901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2692412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector Layer::makeTraversalList(LayerVector::StateSet stateSet) { 2693412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 2694412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 2695412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 2696412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 2697412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 2698412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 2699412903fce3a93f411c85c54375a1851bfb370400Dan Stoza if (state.zOrderRelatives.size() == 0) { 2700412903fce3a93f411c85c54375a1851bfb370400Dan Stoza return children; 2701db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2702db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 2703db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2704412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 2705db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 2706db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 2707db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 2708db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2709db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2710db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2711412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 2712db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 2713db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2714db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2715db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 2716db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 2717db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 27181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 2719db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 27201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 2721412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 2722412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 2723db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 27241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 2725db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 2726db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2727db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 27281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 2729db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2730412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 27311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2732412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 2733db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 2734db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2735412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 27361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 27371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 27381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 27391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 2740db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 27411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 2742412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 2743412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 2744412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 2745db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 27461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 2747db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (i = list.size()-1; i>=0; i--) { 2748db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2749db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 27501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 27511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2752412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 27531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2754412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 27551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i>=0; i--) { 2756db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2757412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 27581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 27591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 27601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 27611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 27621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 2763e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 27641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 27651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 27669b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 27679b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 27689b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 27699b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 27709b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 27719b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 27720a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu if (p->isFixedSize() && p->mActiveBuffer != nullptr) { 27731725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 27741725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 27751725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 27761725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getWidth(); 27771725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getHeight(); 27781725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 27791725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getWidth(); 27801725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getHeight(); 27811725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 27829b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr float sx = p->getDrawingState().active.w / 27831725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr static_cast<float>(bufferWidth); 27849b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr float sy = p->getDrawingState().active.h / 27851725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr static_cast<float>(bufferHeight); 27869b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 27879b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 27889b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 27899b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 27901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 27911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 27921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 27931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 27946452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#ifdef USE_HWC2 27956452f12c95e855a96ab8f690f28914cd37de762bRobert Carrfloat Layer::getAlpha() const { 2796e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 27976452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 27986452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0; 27996452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return parentAlpha * getDrawingState().alpha; 28006452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 28016452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#else 28026452f12c95e855a96ab8f690f28914cd37de762bRobert Carruint8_t Layer::getAlpha() const { 2803e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 28046452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 28056452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float parentAlpha = (p != nullptr) ? (p->getAlpha() / 255.0f) : 1.0; 28066452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float drawingAlpha = getDrawingState().alpha / 255.0f; 28076452f12c95e855a96ab8f690f28914cd37de762bRobert Carr drawingAlpha = drawingAlpha * parentAlpha; 28086452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return static_cast<uint8_t>(std::round(drawingAlpha * 255)); 28096452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 28106452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#endif 28116452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 28121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 28131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 28141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 28151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 28161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 28171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 2818e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mDrawingParent = mCurrentParent; 28191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 28201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 282113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 282213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 28233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 28263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 28273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28293f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 28303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 28313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2832