Layer.cpp revision 8d5227b8416b099c884429312daf2d60496fa484
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer" 201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 373330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 41a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h> 4290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 453e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 487b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 54875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 56c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE 0 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const String8& name, uint32_t w, uint32_t h, uint32_t flags) 6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian : contentDirty(false), 6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 71a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mTextureName(-1U), 7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mName("unnamed"), 7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat(PIXEL_FORMAT_NONE), 7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 78a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 79399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 80a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 82933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 83c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 84a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 85d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched(false), 86cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 878cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mPreviousFrameNumber(0), 884d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending(false), 8982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 925cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition(false), 959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mHasSurface(false), 9803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 10365476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 10404839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos mUpdateTexImageFailed(false), 10582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 10682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mFreezePositionUpdates(false) 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating Layer %s", name.string()); 1109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 112a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mFlinger->getRenderEngine().genTextures(1, &mTextureName); 11449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eHidden) 1184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerHidden; 1194125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (flags & ISurfaceComposerClient::eOpaque) 1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerOpaque; 121231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza if (flags & ISurfaceComposerClient::eSecure) 122231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza layerFlags |= layer_state_t::eLayerSecure; 1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eNonPremultiplied) 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mPremultipliedAlpha = false; 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1313dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 132b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 133b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentState.alpha = 1.0f; 1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentState.alpha = 0xFF; 1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.flags = layerFlags; 1424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 144bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1452f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1462f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1506547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t displayPeriod = 1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1596547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1600a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1610a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1620a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1630a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 164e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 165e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 1663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() { 167bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 168b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferProducer> producer; 169b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer; 170f8b4ca51111cd2e566d1774ac464da859db78976Romain Guy BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true); 1711db73f66624e7d151710483dd58e03eed672f064Robert Carr mProducer = new MonitoredProducer(producer, mFlinger, this); 172468051e20be19130572231266db306396a56402bIrvel mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this); 173bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 174399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSurfaceFlingerConsumer->setContentsChangedListener(this); 1754d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mSurfaceFlingerConsumer->setName(mName); 176b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam 17763a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard if (mFlinger->isLayerTripleBufferingDisabled()) { 17863a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard mProducer->setMaxDequeuedBufferCount(2); 17963a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard } 1806905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 1818430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 1828430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian updateTransformHint(hw); 183b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 18496f0819f81293076e652792794a961543e6750d7Mathias Agopian 1854d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1868ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos sp<Client> c(mClientRef.promote()); 1878ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos if (c != 0) { 1888ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos c->detachLayer(this); 1898ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos } 1908ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos 191cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mRemoteSyncPoints) { 192cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setTransactionApplied(); 193cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 194c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza for (auto& point : mLocalSyncPoints) { 195c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza point->setFrameAvailable(); 196c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 197921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mFlinger->deleteTextureAsync(mTextureName); 1986547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 19996f0819f81293076e652792794a961543e6750d7Mathias Agopian} 20096f0819f81293076e652792794a961543e6750d7Mathias Agopian 20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.empty()) { 2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface* layer) { 2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer) { 2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer->onDisplayed(); 2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 22113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2226b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) { 2236b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Add this buffer from our internal queue tracker 2246b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza { // Autolock scope 2256b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 226468051e20be19130572231266db306396a56402bIrvel mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), 227468051e20be19130572231266db306396a56402bIrvel item.mGraphicBuffer->getHeight(), item.mFrameNumber); 228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Reset the frame number tracker when we receive the first buffer after 229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // a frame number reset 230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (item.mFrameNumber == 1) { 231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = 0; 232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Ensure that callbacks are handled in order 235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ms2ns(500)); 238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (result != NO_ERROR) { 239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.push_back(item); 244ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza android_atomic_inc(&mQueuedFrames); 245a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Wake up any pending callbacks 247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition.broadcast(); 2496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2506b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 25199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mFlinger->signalLayerUpdate(); 252579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 253579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 2546b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) { 2557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza { // Autolock scope 2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Mutex::Autolock lock(mQueueItemLock); 257a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Ensure that callbacks are handled in order 2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ms2ns(500)); 2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (result != NO_ERROR) { 2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 265a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 266a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mQueueItems.empty()) { 2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("Can't replace a frame on an empty queue"); 2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 2714d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos mQueueItems.editItemAt(mQueueItems.size() - 1) = item; 2727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake up any pending callbacks 2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mQueueItemCondition.broadcast(); 2766b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 2786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 279399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() { 280399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 281399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was false 282399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mFlinger->signalLayerUpdate(); 283399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 284399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall} 285399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 2866710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after 2876710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before 2886710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list) 28913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() { 290bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->abandon(); 2911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 2921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 2931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 29448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 295cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 29613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 29913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3001eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 30113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 30213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 30313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 30413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h, 30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian PixelFormat format, uint32_t flags) 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t const maxSurfaceDims = min( 30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // never allow a surface larger than what our underlying GL implementation 31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // can handle. 31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return BAD_VALUE; 31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat = format; 31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentOpacity = getOpacityForFormat(format); 32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return NO_ERROR; 32813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 3314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 3324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3334d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 3344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian "Layer::getHandle() has already been called"); 3354d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3364d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHasSurface = true; 3374d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 339582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 340582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 341b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const { 342b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer; 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 34813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 349a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 350a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 351a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 352f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 353f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 354a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 355f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 356a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 357a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 358a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 359f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 360a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 3614fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 362f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 363f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 365f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 366f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 367f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 368f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 369f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 370f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 371f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 372f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 373f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 374f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 375f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 3761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 3771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 3781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 3791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 3811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const sp<Layer>& p = getParent(); 3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 41013127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 4111eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 4126c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 4136c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 4146c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 4156c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 4166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 41713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 418b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 419b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 420b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 42113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 4221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 4241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 4251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 426de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 427de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 428de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 4291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 4351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 4361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4386c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 4396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 44013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 44113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 4421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 443b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 44413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 4451eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 44613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 44713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 44813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 4496b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 4506b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 4516b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 4526b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 4530e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4540e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 455b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 456b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr activeCrop = s.crop; 4570e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 4580e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 461acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 464b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 465b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!activeCrop.intersect(s.finalCrop, &activeCrop)) { 466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 467acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4725a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 4731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 4741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 4755a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 4761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto parentCrop = p->computeInitialCrop(hw); 4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop.intersect(parentCrop, &activeCrop); 4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 4891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 49013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 49128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 49228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 49328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 49428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 49528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 49628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 497acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 498acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 499acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 50013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 501f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 502f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 503f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 505acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 506acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 508acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 509acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 510021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 511021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 512acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 513021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransformOrient = 514021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 51913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 5210f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos invTransform = (Transform(invTransformOrient) * Transform(invTransform)) 5220f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos .getOrientation(); 523acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos const Rect winCrop = activeCrop.transform( 543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform, s.active.w, s.active.h); 54413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float xScale = crop.getWidth() / float(winWidth); 547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 54813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetL = winCrop.left * xScale; 550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetT = winCrop.top * yScale; 551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetR = (winWidth - winCrop.right ) * xScale; 552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 553acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.left += insetL; 555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.top += insetT; 556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.right -= insetR; 557acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 55813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 55913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 56013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 56113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 5629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 563ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 5649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry( 5669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw, 5679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) 5689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 569a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 5709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 5729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 5739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setDefaultState(); 5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 576a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 5773e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 5829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 5839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 5869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(false); 5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (isSecure() && !hw->isSecure()) { 5909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 5919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 593dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 59413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 5951eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 597ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 5989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (!isOpaque(s) || s.alpha != 1.0f) { 599ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman blendMode = mPremultipliedAlpha ? 6009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 6019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 602ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 603ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" 604ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman " %s (%d)", mName.string(), to_string(blendMode).c_str(), 605ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman to_string(error).c_str(), static_cast<int32_t>(error)); 6069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!isOpaque(s) || s.alpha != 0xFF) { 6089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBlending(mPremultipliedAlpha ? 6099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_PREMULT : 6109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_COVERAGE); 6119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 61313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 61413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 61513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 6166c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 6171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 618b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 619b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 6201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 622acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 6239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 6259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 626acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 627acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 62928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 63028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 63128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 63228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 63328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 63428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 635acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 636acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 637acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 6396c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 6406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 6416c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, s.active.h)); 6426c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 6436c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeCrop.left, activeCrop.bottom)); 6446c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 6456c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, activeCrop.bottom)); 6466c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 6471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 6481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 649b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 650b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!frame.intersect(s.finalCrop, &frame)) { 651acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 652acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 653acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 655acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 656acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 657acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 660ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 661e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 662e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", 663e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza mName.string(), transformedFrame.left, transformedFrame.top, 664e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza transformedFrame.right, transformedFrame.bottom, 665e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 666e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 667e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 668e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6705a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 6719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 672e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 673e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 674e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, 675e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), 676e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza static_cast<int32_t>(error)); 677e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 678e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 679e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setPlaneAlpha(s.alpha); 6829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " 6839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(), 6849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 686ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", 688ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr mName.string(), z, to_string(error).c_str(), 6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6902f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 6912f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara error = hwcLayer->setInfo(s.type, s.appId); 6922f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", 6932f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mName.string(), static_cast<int32_t>(error)); 6949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!frame.intersect(hw->getViewport(), &frame)) { 6969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.clear(); 6979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 6999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setFrame(tr.transform(frame)); 7009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setCrop(computeCrop(hw)); 7019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setPlaneAlpha(s.alpha); 7029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 7039f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 70429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 70529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 70629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 70729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 70829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 70929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 71029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 71129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 71229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 7131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 714c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 715c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 716c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 717021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 718021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 719c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 720021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransform = 721021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 722c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 723c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 724c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 725c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian NATIVE_WINDOW_TRANSFORM_FLIP_H; 726c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 727c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and apply to the current transform 7280f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos transform = Transform(invTransform) * transform; 729c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 73029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 73129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 73213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 7339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: " 7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), to_string(transform).c_str(), 7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (orientation & Transform::ROT_INVALID) { 7469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we can only handle simple transformation 7479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 7489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 7499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setTransform(orientation); 7509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 752a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 753a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 7549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 7569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply this display's projection's viewport to the visible region 7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // before giving it to the HWC HAL. 7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr = displayDevice->getTransform(); 7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& viewport = displayDevice->getViewport(); 7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Region visible = tr.transform(visibleRegion.intersect(viewport)); 7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 771aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcInfo = mHwcLayers[hwcId]; 772aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcLayer = hwcInfo.layer; 7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setVisibleRegion(visible); 7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza visible.dump(LOG_TAG); 7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza surfaceDamageRegion.dump(LOG_TAG); 7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7870f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Sideband layers 7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mSidebandStream.get()) { 7890f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Sideband); 7900f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Sideband composition", mName.string()); 7910f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", 7949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mName.string(), mSidebandStream->handle(), 7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7970f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 7989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8000a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // Client layers 801aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu if (hwcInfo.forceClientComposition || 8020a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) { 8030f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Client composition", mName.string()); 8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Client); 8050f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 8060f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 8070f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 8080a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // SolidColor layers 8090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (mActiveBuffer == nullptr) { 8100a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza setCompositionType(hwcId, HWC2::Composition::SolidColor); 811c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 812c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // For now, we only support black for DimLayer 8130a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza error = hwcLayer->setColor({0, 0, 0, 255}); 8140a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (error != HWC2::Error::None) { 8150a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), 8160a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8170a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 818c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 819c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // Clear out the transform, because it doesn't make sense absent a 820c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // source buffer 821c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza error = hwcLayer->setTransform(HWC2::Transform::None); 822c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza if (error != HWC2::Error::None) { 823c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), 824c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 825c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza } 826c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 8270a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza return; 8280a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 8290a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza 8300f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Device or Cursor layers 8310f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (mPotentialCursor) { 8320f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Cursor composition", mName.string()); 8330f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Cursor); 8349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 8359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting Device composition", mName.string()); 8369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Device); 8379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8380f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 839bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace); 840bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter error = hwcLayer->setDataspace(mCurrentState.dataSpace); 841bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (error != HWC2::Error::None) { 842bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), 843bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace, to_string(error).c_str(), 844bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter static_cast<int32_t>(error)); 845bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter } 846bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 84706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu uint32_t hwcSlot = 0; 84806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu buffer_handle_t hwcHandle = nullptr; 84906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu { 85006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu sp<GraphicBuffer> hwcBuffer; 851aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, 85206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &hwcSlot, &hwcBuffer); 85306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu if (hwcBuffer != nullptr) { 85406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu hwcHandle = hwcBuffer->handle; 85506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu } 85606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu } 85706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu 8580f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 85906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu error = hwcLayer->setBuffer(hwcSlot, hwcHandle, acquireFence); 8600f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (error != HWC2::Error::None) { 8610f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), 8620f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza mActiveBuffer->handle, to_string(error).c_str(), 8630f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza static_cast<int32_t>(error)); 8640f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 8659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 8669551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter 8679551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 8689551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter return mCurrentState.dataSpace; 8699551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter} 8709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 8729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) { 8739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we have to set the visible region on every frame because 8749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we currently free it during onLayerDisplayed(), which is called 8759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // after HWComposer::commit() -- every frame. 8769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Apply this display's projection's viewport to the visible region 8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // before giving it to the HWC HAL. 8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr = hw->getTransform(); 8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setVisibleRegionScreen(visible); 8819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSurfaceDamage(surfaceDamageRegion); 8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); 883ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mSidebandStream.get()) { 8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSidebandStream(mSidebandStream); 8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // NOTE: buffer can be NULL if the client never drew into this 8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // layer yet, or if we ran out of memory 8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBuffer(mActiveBuffer); 8909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 8939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 8959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 8969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 8979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0 || 8989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza getCompositionType(hwcId) != HWC2::Composition::Cursor) { 8999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 9009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 9029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 9039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 904dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 9059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 9069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 9079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 908b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 909b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 9109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 9129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 9131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 9149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 915b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 916b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 917acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 9189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 9199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 9209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, 9229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top); 9239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position " 9249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "to (%d, %d): %s (%d)", mName.string(), position.left, 9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top, to_string(error).c_str(), 9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 9279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 9299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 9309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) { 9319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fenceFd = -1; 9329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // TODO: there is a possible optimization here: we only need to set the 9349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // acquire fence the first time a new buffer is acquired on EACH display. 9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fence->isValid()) { 9399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard fenceFd = fence->dup(); 9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fenceFd == -1) { 9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("failed to dup layer fence, skipping sync: %d", errno); 9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setAcquireFenceFd(fenceFd); 9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9489d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition( 9499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw) 9509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 9519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this gives us only the "orientation" component of the transform 9529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const State& s(getCurrentState()); 9539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // apply the layer's transform, followed by the display's global transform 9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // here we're guaranteed that the layer's transform preserves rects 9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect win(s.active.w, s.active.h); 9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.crop.isEmpty()) { 9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard win.intersect(s.crop, &win); 9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // subtract the transparent region and snap to the bounds 9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect bounds = reduce(win, s.activeTransparentRegion); 9621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(hw->getViewport(), &frame); 9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.finalCrop.isEmpty()) { 9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(s.finalCrop, &frame); 9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return Rect(tr.transform(frame)); 9699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 97103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 97213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 97313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 97413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 97513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 97613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 977c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, clip, false); 97813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 97913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 980c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw, 981c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const { 982c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), useIdentityTransform); 98313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 98413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 985c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const { 986c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), false); 987c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 988c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 989c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 990c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9921c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 9931c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 994a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (CC_UNLIKELY(mActiveBuffer == 0)) { 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the texture has not been created yet, this Layer has 996179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // in fact never been drawn into. This happens frequently with 997179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // SurfaceView because the WindowManager can't know when the client 998179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // has drawn the first time. 999179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 1000179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // If there is nothing under us, we paint the screen in black, otherwise 1001179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // we just skip this update. 1002179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 1003179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // figure out if there is something below us 1004179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region under; 10051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bool finished = false; 10061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) { 10071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (finished || layer == static_cast<Layer const*>(this)) { 10081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr finished = true; 10091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return; 10101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 10114297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 10121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr }); 1013179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // if not everything below us is covered, we plug the holes! 1014179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region holes(clip.subtract(under)); 1015179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian if (!holes.isEmpty()) { 10161748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0, 0, 0, 1); 1017179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian } 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1020a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 102197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // Bind the current buffer to the GL texture, and wait for it to be 102297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // ready for us to draw into. 1023bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 1024bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (err != NO_ERROR) { 102597eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 1026dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // Go ahead and draw the buffer anyway; no matter what we do the screen 1027dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // is probably going to have something visibly wrong. 1028dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 1029dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 1030dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 1031dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 1032875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1033875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 1034dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis if (!blackOutLayer) { 1035cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // TODO: we could be more subtle with isFixedSize() 1036eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 1037cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1038cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Query the texture matrix given our current filtering mode. 1039cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis float textureMatrix[16]; 1040bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 1041bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 1042cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1043c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 1044c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1045c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 1046021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to 1047021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the texture transform 1048c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 1049c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1050c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // create a 4x4 transform matrix from the display transform flags 1051c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 1052c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 1053c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 1054c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1055c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mat4 tr; 1056021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 1057021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 1058c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) 1059c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * rot90; 1060c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) 1061c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * flipH; 1062c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) 1063c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * flipV; 1064c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1065c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse 1066c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = inverse(tr); 1067c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1068c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and finally apply it to the original texture matrix 1069c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 1070c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 1071c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 1072c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1073cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Set things up for texturing. 107449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 107549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setFiltering(useFiltering); 107649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setMatrix(textureMatrix); 107749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian 107849457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian engine.setupLayerTexturing(mTexture); 1079a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } else { 1080875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.setupLayerBlackedOut(); 1081a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } 10828578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard drawWithOpenGL(hw, useIdentityTransform); 1083875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableTexturing(); 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 108613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1087c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 10881748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard float red, float green, float blue, 1089c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza float alpha) const 109013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 109119733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1092c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, false); 109319733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 109419733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 109513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 109613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 109713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL( 10981748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard const sp<const DisplayDevice>& hw) const { 10991748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0,0,0,0); 110013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 110113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1102c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 11038578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard bool useIdentityTransform) const { 11041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 110513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1106c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, useIdentityTransform); 110713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 110813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian /* 110913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * NOTE: the way we compute the texture coordinates here produces 111013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * different results than when we take the HWC path -- in the later case 111113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * the "source crop" is rounded to texel boundaries. 111213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * This can produce significantly different results when the texture 111313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * is scaled by a large amount. 111413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * 111513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * The GL code below is more logical (imho), and the difference with 111613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * HWC is due to a limitation of the HWC API to integers -- a question 1117c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian * is suspend is whether we should ignore this problem or revert to 111813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * GL composition when a buffer scaling is applied (maybe with some 111913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * minimal value)? Or, we could make GL behave like HWC -- but this feel 112013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * like more of a hack. 112113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian */ 1122acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos Rect win(computeBounds()); 1123acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 11241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 1125b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 11261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 1127b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!win.intersect(s.finalCrop, &win)) { 1128acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1129acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 11301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 1131acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!win.intersect(computeBounds(), &win)) { 1132acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1133acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1134acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 113513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 11363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float left = float(win.left) / float(s.active.w); 11373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float top = float(win.top) / float(s.active.h); 11383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float right = float(win.right) / float(s.active.w); 11393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float bottom = float(win.bottom) / float(s.active.h); 114013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1141875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // TODO: we probably want to generate the texture coords with the mesh 1142875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // here we assume that we only have 4 vertices 1143ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 1144ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[0] = vec2(left, 1.0f - top); 1145ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[1] = vec2(left, 1.0f - bottom); 1146ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[2] = vec2(right, 1.0f - bottom); 1147ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[3] = vec2(right, 1.0f - top); 114813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1149875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 11504125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha); 11515cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian engine.drawMesh(mMesh); 1152875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableBlending(); 115313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 115413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 11559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 11569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, 11579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool callIntoHwc) { 11589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 11599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 11609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 11619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 11639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 11649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), 11659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), static_cast<int>(callIntoHwc)); 11669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 11679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 11689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 11709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 11719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set " 11729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "composition type %s: %s (%d)", mName.string(), 11739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), to_string(error).c_str(), 11749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 11759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 11799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 1180ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 1181ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 1182ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 1183ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 1184ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 11859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 1186ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 11879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 11889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 11909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 11929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 11939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 11949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 11969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 11989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 12019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 12039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 12049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 12069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 12079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12091681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const { 12101681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int producerStickyTransform = 0; 12111681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 12121681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (ret != OK) { 12131681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 12141681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk strerror(-ret), ret); 12151681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return 0; 12161681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 12171681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return static_cast<uint32_t>(producerStickyTransform); 12181681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 12191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 1220c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() { 1221c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool propertyLoaded = false; 1222c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool latch = false; 1223c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static std::mutex mutex; 1224c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza std::lock_guard<std::mutex> lock(mutex); 1225c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (!propertyLoaded) { 1226c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza char value[PROPERTY_VALUE_MAX] = {}; 1227c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza property_get("debug.sf.latch_unsignaled", value, "0"); 1228c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza latch = atoi(value); 1229c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza propertyLoaded = true; 1230c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1231c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return latch; 1232c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza} 1233c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 1234cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const { 1235cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mQueueItemLock); 1236cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!mQueueItems.empty()) { 1237cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mQueueItems[0].mFrameNumber; 1238cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1239cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mCurrentFrameNumber; 12407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1241cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza} 12427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 12431ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const { 12449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1245c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (latchUnsignaledBuffers()) { 1246c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return true; 1247c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1248c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 12491ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza Mutex::Autolock lock(mQueueItemLock); 12501ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems.empty()) { 12511ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 12521ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 12531ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems[0].mIsDroppable) { 12541ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // Even though this buffer's fence may not have signaled yet, it could 12551ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // be replaced by another buffer before it has a chance to, which means 12561ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // that it's possible to get into a situation where a buffer is never 12571ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // able to be latched. To avoid this, grab this buffer anyway. 12581ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 12591ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 12601ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return mQueueItems[0].mFence->getSignalTime() != INT64_MAX; 12619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 12629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return true; 12639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12641ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza} 12651ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 1266cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 1267cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 1268cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 1269cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 1270cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 12717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1272cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1273cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1274cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 1275cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 12767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 12777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 127813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 127913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 128013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 128113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 128213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 128313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 128413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 128513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1286ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range 1287ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and 1288ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel 1289ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into 1290ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here. 1291ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 1292ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 12935773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) { 1294a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (HARDWARE_IS_DEVICE_FORMAT(format)) { 1295a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return true; 1296ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold } 12975773d3f5b2694c647e010246dff99acc70131289Mathias Agopian switch (format) { 12985773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 12995773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 1300ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy case HAL_PIXEL_FORMAT_RGBA_FP16: 1301541f22658ab1617c9d12c98684ab40248df8749bRomain Guy case HAL_PIXEL_FORMAT_RGBA_1010102: 1302dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return false; 13035773d3f5b2694c647e010246dff99acc70131289Mathias Agopian } 13045773d3f5b2694c647e010246dff99acc70131289Mathias Agopian // in all other case, we have no blending (also for unknown formats) 1305dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return true; 1306ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold} 1307ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 130813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 130913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 131013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 131113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1312acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 1313acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 1314acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 1315acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1316acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 1317acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 1318acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1319acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 1320acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 1321acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1322acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 1323acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 1324acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1325acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 1326acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1327c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 1328c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 132913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 13301eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 13311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Transform hwTransform(hw->getTransform()); 133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t hw_h = hw->getHeight(); 13331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 13343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1335acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 1336acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 1337acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 1338acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 1339acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 13401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 1341acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 13421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 13431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 13441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 13451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 1346acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1347acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1348b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1349b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 1350b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 1351b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 1352b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 1353acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1354acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1355ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 13561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[0] = hwTransform.transform(lt); 13571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[1] = hwTransform.transform(lb); 13581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[2] = hwTransform.transform(rb); 13591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[3] = hwTransform.transform(rt); 13603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian for (size_t i=0 ; i<4 ; i++) { 13615cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian position[i].y = hw_h - position[i].y; 136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 136313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1364ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 13654125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const 1366a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{ 1367a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if we don't have a buffer yet, we're translucent regardless of the 1368a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // layer's opaque flag. 1369db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis if (mActiveBuffer == 0) { 1370a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return false; 1371db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis } 1372a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 1373a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if the layer has the opaque flag, then we're always opaque, 1374a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // otherwise we use the current buffer's format. 13754125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 1376a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian} 1377a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 1378231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const 1379231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{ 1380231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 1381231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 1382231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 1383231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 13847a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const 13857a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{ 1386a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 13877a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis return (activeBuffer != 0) && 13887a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 13897a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1390b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const { 1392c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE; 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const { 139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return !mCurrentCrop.isEmpty(); 139713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 139913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 140013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mNeedsFiltering || hw->needsFiltering(); 140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 140213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 140413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 140513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 140613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 140713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 140813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 140913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 141013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 141113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 141213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 141313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region& 141413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setVisibleNonTransparentRegion) { 141513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 141613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 141713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 141813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 142213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 14237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 14247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 14257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 14267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 14297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 14300d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 14310d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 14320d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 14330d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 14347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 14357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 14367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 14370d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 14383bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 14393bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos auto syncPoint = std::make_shared<SyncPoint>( 14403bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos mCurrentState.frameNumber); 14410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 1442cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 1443cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1444cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 1445cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 14460d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1447cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 14487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 14517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 1452f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 14537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 14557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 14567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 145705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 145805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 145905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 146005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos stateToCommit->flags = (oldFlags & ~stateToCommit->mask) | 146105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos (stateToCommit->flags & stateToCommit->mask); 14627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 14647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 14657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 146605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 14677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 14687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 14690d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 14707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 14717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 14727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 14737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 14747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 147505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 14767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1480cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (mRemoteSyncPoints.front()->getFrameNumber() != 1481cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mPendingStates[0].frameNumber) { 1482cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ALOGE("[%s] Unexpected sync point frame number found", 1483cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mName.string()); 1484cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1485cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 1486cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 1487cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 1488cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 1489cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1490cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 14917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 14927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 149305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 14947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 14957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 14977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 14987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 1499792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 1500792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 150305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 15047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 15057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 15107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 15117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 15127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 15137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 15167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 15177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() { 1520cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto headFrameNumber = getHeadFrameNumber(); 15211ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza bool headFenceSignaled = headFenceHasSignaled(); 1522cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1523cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mLocalSyncPoints) { 15241ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { 1525cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setFrameAvailable(); 1526cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 15277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 153013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 15311c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 15321c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 15337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 153405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 153505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 15367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15391eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 15411eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const bool sizeChanged = (c.requested.w != s.requested.w) || 15421eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian (c.requested.h != s.requested.h); 1543a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1544a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian if (sizeChanged) { 1545cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 15469d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 15476905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1548419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1549b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n" 1550419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1551b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n", 1552c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr this, getName().string(), mCurrentTransform, 1553c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr getEffectiveScalingMode(), 15541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.active.w, c.active.h, 1555b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.left, 1556b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.top, 1557b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.right, 1558b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.bottom, 1559b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getWidth(), 1560b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getHeight(), 15611eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h, 15621eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian s.active.w, s.active.h, 1563b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, 1564b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.top, 1565b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, 1566b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.bottom, 1567b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getWidth(), 1568b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getHeight(), 1569b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.requested.w, s.requested.h); 1570a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 15712a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 15722a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1573bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setDefaultBufferSize( 15741eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h); 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1576cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 157782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr const bool resizePending = (c.requested.w != c.active.w) || 157882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr (c.requested.h != c.active.h); 15790cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 15809e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 158113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // don't let Layer::doTransaction update the drawing state 15820cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // if we have a pending resize, unless we are in fixed-size mode. 15830cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // the drawing state will be updated only once we receive a buffer 15840cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // with the correct size. 15850cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // 15860cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // in particular, we want to make sure the clip (which is part 15870cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // of the geometry state) is latched together with the size but is 15880cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // latched immediately when no resizing is involved. 15899e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // 15909e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // If a sideband stream is attached, however, we want to skip this 15919e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // optimization so that transactions aren't missed when a buffer 15929e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // never arrives 15930cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 15940cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 15950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 15960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 15970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 159813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always set active to requested, unless we're asked not to 159913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this is used by Layer, which special cases resizes. 160013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (flags & eDontUpdateGeometryState) { 160113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } else { 16027d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 160382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (mFreezePositionUpdates) { 160482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 160582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 160682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 160782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 160882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 160982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 161082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 161182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 161282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 161313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 161413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 16151eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 161613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 161713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 161813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 161913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 16201eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 162113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 162213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 162313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 162413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 162513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 16263dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 16273dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mNeedsFiltering = (!c.active.transform.preserveRects() || 162813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian (type >= Transform::SCALE)); 162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1631c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1632c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1633c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1634c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 16351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1636c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1637c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 163813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 163905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 164405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1645a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1646a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 164713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 164813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 164913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 165013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 165113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 165582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 16563dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 165713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 165813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 165969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 166069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 166169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 166269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 16633dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 166482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (immediate && !mFreezePositionUpdates) { 166582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 166682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 166782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mFreezePositionUpdates = mFreezePositionUpdates || !immediate; 166869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 16697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 167013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 167113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 167213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 167382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 16741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 16751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 16761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 16781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 16801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 16811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 16821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 16841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1686ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 168713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.z == z) 168813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 168913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 169013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 16917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 169213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 169313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 169413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 16951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 169613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 169713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 169813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 169913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 17017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 170213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 170313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 170413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 17059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 17069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 17079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 17089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) { 17099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 171013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.alpha == alpha) 171113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 171313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.alpha = alpha; 17147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 171513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 171613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 171913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 17203dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set( 1721cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 17227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 172313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 172413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 172513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 172613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 17272ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 17287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 172913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 173013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 173113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 173213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 173313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 173413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.flags == newFlags) 173513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 173613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 173713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 17387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 17397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 174013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 174113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 174213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 174399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 174499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 1745b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.crop == crop) 174613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 174899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 174999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr if (immediate) { 175099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 175199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 17527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 175313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 175413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 175513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 17568d5227b8416b099c884429312daf2d60496fa484Robert Carr 17578d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 1758b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.finalCrop == crop) 1759acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return false; 1760acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 17618d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 17628d5227b8416b099c884429312daf2d60496fa484Robert Carr if (immediate) { 17638d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 17648d5227b8416b099c884429312daf2d60496fa484Robert Carr } 1765acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1766acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1767acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1768acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 176913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1770c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 1771c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (scalingMode == mOverrideScalingMode) 1772c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return false; 1773c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 177482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1775c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1776c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1777c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 17782f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 17792f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = appId; 17802f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = type; 17812f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.modified = true; 17822f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara setTransactionFlags(eTransactionNeeded); 17832f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 17842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1785c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const { 1786c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (mOverrideScalingMode >= 0) { 1787c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mOverrideScalingMode; 1788c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 1789c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mCurrentScalingMode; 1790c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1791c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 179213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 179313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.layerStack == layerStack) 179413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 179513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 179613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 17977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 179813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 179913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1800a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1801a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1802bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 1803bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (mCurrentState.dataSpace == dataSpace) 1804bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return false; 1805bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1806bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1807bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1808bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1809bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1810bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1811bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 18121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 18131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto p = getParent(); 18141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 18151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 18161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 18181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 18200d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, 18217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber) { 18220d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 18237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 18247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 18257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 18267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 18277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 18280d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1829792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 18307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 18310d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("Deferred transaction"); 18320d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 18330d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 18340d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, 18350d48072f6047140119ff194c1194ce402fca2c0bRobert Carr uint64_t frameNumber) { 18360d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 18370d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 18387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 18397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1840ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() { 1841ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza if (mFlinger->mForceFullDamage) { 1842ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = Region::INVALID_REGION; 1843ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } else { 1844ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1845ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } 1846ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1847ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1848ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() { 1849ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.clear(); 1850ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1851ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18566b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const { 1857ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mSidebandStreamChanged || mAutoRefresh) { 1858d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza return true; 1859d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza } 1860d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza 18616b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 18620eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza if (mQueueItems.empty()) { 18630eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return false; 18640eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza } 18650eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza auto timestamp = mQueueItems[0].mTimestamp; 18666b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza nsecs_t expectedPresent = 18676b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 18680eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 18690eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza // Ignore timestamps more than a second in the future 18700eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 18710eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 18720eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza "relative to expectedPresent %" PRId64, mName.string(), timestamp, 18730eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza expectedPresent); 18740eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 18750eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isDue = timestamp < expectedPresent; 18760eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return isDue || !isPlausible; 18776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 18786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 1879d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) { 1880d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (mBufferLatched) { 1881d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1882d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime); 1883d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 18844d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending = false; 1885ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh; 188699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 188799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 18880a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, 18893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson const std::shared_ptr<FenceTime>& presentFence, 18900a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson const CompositorTiming& compositorTiming) { 18913d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.updateSignalTimes(); 18923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.updateSignalTimes(); 18933d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 1894d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // mFrameLatencyNeeded is true when a new frame was latched for the 1895d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // composition. 189628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (!mFrameLatencyNeeded) 189728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return false; 189828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 189928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameEventHistory. 190028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard { 190128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard Mutex::Autolock lock(mFrameEventHistoryMutex); 190228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameEventHistory.addPostComposition(mCurrentFrameNumber, 19030a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson glDoneFence, presentFence, compositorTiming); 190428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 190582dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 190628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameTracker. 190728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 190828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setDesiredPresentTime(desiredPresentTime); 190982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 19103d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime> frameReadyFence = 19113d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mSurfaceFlingerConsumer->getCurrentFenceTime(); 191228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (frameReadyFence->isValid()) { 19133d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setFrameReadyFence(std::move(frameReadyFence)); 191428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 191528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // There was no fence for this frame, so assume that it was ready 191628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // to be presented at the desired present time. 191728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setFrameReadyTime(desiredPresentTime); 191828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 191982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 19203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson if (presentFence->isValid()) { 19213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentFence( 19223d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime>(presentFence)); 192328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 192428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // The HWC doesn't support present fences, so use the refresh 192528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // timestamp instead. 19263d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentTime( 19273d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFlinger->getHwComposer().getRefreshTimestamp( 19283d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson HWC_DISPLAY_PRIMARY)); 1929d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 193028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 193128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.advanceFrame(); 193228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameLatencyNeeded = false; 193328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return true; 1934d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 1935d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 19369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1937f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { 19385ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { 19395ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson return; 19405ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson } 19415ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 19423d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 1943d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 19443d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 19453d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 19463d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 19478cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson if (mPreviousFrameNumber != 0) { 19488cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mFrameEventHistory.addRelease(mPreviousFrameNumber, 19498cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson dequeueReadyTime, std::move(releaseFenceTime)); 19508cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson } 19519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 19529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 19539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 19541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 19551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 19561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& parent = getParent(); 19571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 19581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 19591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 19611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1963da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const { 196413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Layer::State& s(mDrawingState); 19659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 19661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return !(isHiddenByPolicy()) && s.alpha > 0.0f 19679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza && (mActiveBuffer != NULL || mSidebandStream != NULL); 19689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 19691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return !(isHiddenByPolicy()) && s.alpha 19709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard && (mActiveBuffer != NULL || mSidebandStream != NULL); 19719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1972da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 1973da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 1974cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() { 1975cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard auto headFrameNumber = getHeadFrameNumber(); 1976cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool matchingFramesFound = false; 1977cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool allTransactionsApplied = true; 1978cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 1979cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1980cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard for (auto& point : mLocalSyncPoints) { 1981cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (point->getFrameNumber() > headFrameNumber) { 1982cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 1983cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 1984cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard matchingFramesFound = true; 1985cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1986cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!point->frameIsAvailable()) { 1987cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // We haven't notified the remote layer that the frame for 1988cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // this point is available yet. Notify it now, and then 1989cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // abort this attempt to latch. 1990cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard point->setFrameAvailable(); 1991cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = false; 1992cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 1993cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 1994cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1995cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied(); 1996cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 1997cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard return !matchingFramesFound || allTransactionsApplied; 1998cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard} 1999cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2000d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 20021c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 20031c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 2004399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 2005399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was true 2006399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 200712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza if (mSidebandStream != NULL) { 200812e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza setTransactionFlags(eTransactionNeeded); 200912e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 201012e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza } 20115bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall recomputeVisibleRegions = true; 20125bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall 20135bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall const State& s(getDrawingState()); 20141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getTransform().transform(Region(Rect(s.active.w, s.active.h))); 2015399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 2016399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 20174fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region outDirtyRegion; 2018223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mQueuedFrames <= 0 && !mAutoRefresh) { 2019223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2020223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 202199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 2022223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // if we've already called updateTexImage() without going through 2023223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // a composition step, we have to skip this layer at this point 2024223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // because we cannot call updateTeximage() without a corresponding 2025223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // compositionComplete() call. 2026223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // we'll trigger an update in onPreComposition(). 2027223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mRefreshPending) { 2028223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2029223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 20301ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 2031223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the head buffer's acquire fence hasn't signaled yet, return and 2032223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // try again later 2033223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!headFenceHasSignaled()) { 2034223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2035223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2036223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 20372c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 2038223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Capture the old state of the layer for comparisons later 2039223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const State& s(getDrawingState()); 2040223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const bool oldOpacity = isOpaque(s); 2041223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 2042223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2043cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!allTransactionsSignaled()) { 2044223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2045223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2046223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2047223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2048223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This boolean is used to make sure that SurfaceFlinger's shadow copy 2049223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // of the buffer queue isn't modified when the buffer queue is returning 2050223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // BufferItem's that weren't actually queued. This can happen in shared 2051223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // buffer mode. 2052223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bool queuedBuffer = false; 20537b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 20547b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard getProducerStickyTransform() != 0, mName.string(), 20557b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard mOverrideScalingMode, mFreezePositionUpdates); 2056223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 2057223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, 2058223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mLastFrameNumberReceived); 2059223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (updateResult == BufferQueue::PRESENT_LATER) { 2060223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Producer doesn't want buffer to be displayed yet. Signal a 2061223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // layer update so we check again at the next opportunity. 2062223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2063223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2064223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 2065223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the buffer has been rejected, remove it from the shadow queue 2066223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // and return early 2067063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 20686b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 2069223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2070223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 2071223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2072223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2073223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 2074223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This can occur if something goes wrong when trying to create the 2075223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // EGLImage for this buffer. If this happens, the buffer has already 2076223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // been released, so we need to clean up the queue and bug out 2077223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // early. 2078223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2079223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2080223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.clear(); 2081223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_and(0, &mQueuedFrames); 2082223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2083ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2084223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Once we have hit this state, the shadow queue may no longer 2085223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // correctly reflect the incoming BufferQueue's contents, so even if 2086223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage starts working, the only safe course of action is 2087223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // to continue to ignore updates. 2088223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mUpdateTexImageFailed = true; 2089ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2090223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2091223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2092223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2093223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2094223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Autolock scope 2095223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2096223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2097223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2098223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2099223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any stale buffers that have been dropped during 2100223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage 2101223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 21026b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.removeAt(0); 2103223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 21046b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 21056b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 2106223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2107223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2108ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 21091585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 2110223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Decrement the queued-frames count. Signal another event if we 2111223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // have more frames pending. 2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard || mAutoRefresh) { 2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2115223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2116d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian 2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // update the active buffer 211806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer( 211906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &mActiveBufferSlot); 2120223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mActiveBuffer == NULL) { 2121223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // this can only happen if the very first buffer was rejected. 2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2124702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2125d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched = true; 2126d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mPreviousFrameNumber = mCurrentFrameNumber; 2127d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2128d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2129d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson { 2130d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2131d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); 2132d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2 21333d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 2134d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 21353d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 21368cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson if (mPreviousFrameNumber != 0) { 21378cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mFrameEventHistory.addRelease(mPreviousFrameNumber, 21388cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson latchTime, std::move(releaseFenceTime)); 21398cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson } 2140d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif 2141d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 2142d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2143223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mRefreshPending = true; 2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFrameLatencyNeeded = true; 2145223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer == NULL) { 2146223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // the first time we receive a buffer, we need to trigger a 2147223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // geometry invalidation. 2148223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2149223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2150223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2151bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace()); 2152bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((crop != mCurrentCrop) || 2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (transform != mCurrentTransform) || 2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (scalingMode != mCurrentScalingMode)) 2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentCrop = crop; 2161223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentTransform = transform; 2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentScalingMode = scalingMode; 2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2165702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer != NULL) { 2167223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufWidth = mActiveBuffer->getWidth(); 2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufHeight = mActiveBuffer->getHeight(); 2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (bufWidth != uint32_t(oldActiveBuffer->width) || 2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bufHeight != uint32_t(oldActiveBuffer->height)) { 2171702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian recomputeVisibleRegions = true; 2172702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2174702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2175223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 2176223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldOpacity != isOpaque(s)) { 2177223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2179cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2180223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any sync points corresponding to the buffer which was just 2181223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latched 2182223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2183223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto point = mLocalSyncPoints.begin(); 2185223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (point != mLocalSyncPoints.end()) { 2186223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!(*point)->frameIsAvailable() || 2187223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard !(*point)->transactionIsApplied()) { 2188223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This sync point must have been added since we started 2189223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latching. Don't drop it yet. 2190223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard continue; 2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2193223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2194223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((*point)->getFrameNumber() <= mCurrentFrameNumber) { 2195223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard point = mLocalSyncPoints.erase(point); 2196223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else { 2197223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2198cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2199cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2201cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2202223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // FIXME: postedRegion should be dirty & bounds 2203223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Region dirtyRegion(Rect(s.active.w, s.active.h)); 2204223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2205223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // transform the dirty region to window-manager space 22061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr outDirtyRegion = (getTransform().transform(dirtyRegion)); 22071c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 22084fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 2209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 221113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const 221213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 221313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 221413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 221513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 221613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 221713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 221803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 221903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 222003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 222113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 222213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 222313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 222413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 222513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 222613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 222713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 222813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 222913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 223013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 223113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 223213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 223313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 223413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 223513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 223613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 223713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setTransformHint(orientation); 223813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 223913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 224013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 224113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 224213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 224313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 22443e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const 22451b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 22461eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 224713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 22483e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.colorize(result, Colorizer::GREEN); 224974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 225013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "+ %s %p (%s)\n", 225113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian getTypeId(), this, getName().string()); 22523e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.reset(result); 225313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 22542ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian s.activeTransparentRegion.dump(result, "transparentRegion"); 225513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian visibleRegion.dump(result, "visibleRegion"); 2256ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.dump(result, "surfaceDamageRegion"); 225713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sp<Client> client(mClientRef.promote()); 225813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 225974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( " " 2260acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), " 2261acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), " 226213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "isOpaque=%1d, invalidate=%1d, " 22639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 22649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 22659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 22669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 22679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 226813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian " client=%p\n", 22691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr getLayerStack(), s.z, 22701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr s.active.transform.tx(), s.active.transform.ty(), 22711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr s.active.w, s.active.h, 2272b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, s.crop.top, 2273b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, s.crop.bottom, 2274b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.left, s.finalCrop.top, 2275b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.right, s.finalCrop.bottom, 22764125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden isOpaque(s), contentDirty, 227713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian s.alpha, s.flags, 22783dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[0][0], s.active.transform[0][1], 22793dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[1][0], s.active.transform[1][1], 228013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian client.get()); 22811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2282a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<const GraphicBuffer> buf0(mActiveBuffer); 2283a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian uint32_t w0=0, h0=0, s0=0, f0=0; 22841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian if (buf0 != 0) { 22851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian w0 = buf0->getWidth(); 22861b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian h0 = buf0->getHeight(); 22871b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s0 = buf0->getStride(); 2288a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian f0 = buf0->format; 22891b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian } 229074d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 22911b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 2292ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 22936905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden " queued-frames=%d, mRefreshPending=%d\n", 2294a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFormat, w0, h0, s0,f0, 22956905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden mQueuedFrames, mRefreshPending); 22961b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2297bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (mSurfaceFlingerConsumer != 0) { 22983d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross mSurfaceFlingerConsumer->dumpState(result, " "); 2299bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 2300d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 2301d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian 23029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2303e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 2304e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2305e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2306e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 2307e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 2308e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 2309e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 2310e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 2311e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2312e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2313e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 2314e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2315e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 2316e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 2317e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 2318e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2319e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2320e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 2321e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 2322e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 2323e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 2324e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 2325e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 2326e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 2327e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 2328e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 2329e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2330e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2331e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 2332e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2333e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 2334e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 2335e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %10u | ", layerState.z); 2336e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%10s | ", 2337e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(getCompositionType(hwcId)).c_str()); 2338e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 2339e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, 2340e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza frame.right, frame.bottom); 23415a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 2342e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, 2343e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza crop.right, crop.bottom); 2344e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2345e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 2346e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 2347e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 23489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2349e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2350d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 2351d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 235282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 235382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2354d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 2355d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 235625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 235725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 23586547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 23596547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 23606547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 23616547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 2362d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 2363d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 2364d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 2365d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 2366d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 2367d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson result.appendFormat("- Layer %s (%s, %p)\n", 2368d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson getName().string(), getTypeId(), this); 2369d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2370d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 2371d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 2372d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 2373d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 23745ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 23755ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 23765ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 23775ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 23785ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 23793890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 23803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta *outDelta) { 2381d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2382d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 23833d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 2384d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 2385d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 238640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 23873890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 23883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 2389d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 239040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 2391e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2392e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory( 2393e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza bool forceFlush) { 2394e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza std::vector<OccupancyTracker::Segment> history; 2395e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, 2396e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza &history); 2397e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza if (result != NO_ERROR) { 2398e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), 2399e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza result); 2400e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return {}; 2401e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza } 2402e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return history; 2403e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza} 2404e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2405367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const { 2406367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); 2407367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr} 2408367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 24091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 24101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 24111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 24121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 24151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 24161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 24171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24191db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 24201db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 24211db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 24221db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 24231db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 24241db73f66624e7d151710483dd58e03eed672f064Robert Carr } 24251db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 24261db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 24271db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 24281db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 24291db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 24301db73f66624e7d151710483dd58e03eed672f064Robert Carr } 24311db73f66624e7d151710483dd58e03eed672f064Robert Carr 24321db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 24331db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent->addChild(child); 24341db73f66624e7d151710483dd58e03eed672f064Robert Carr 24351db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 24361db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 24371db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 24381db73f66624e7d151710483dd58e03eed672f064Robert Carr } 24391db73f66624e7d151710483dd58e03eed672f064Robert Carr } 24401db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 24411db73f66624e7d151710483dd58e03eed672f064Robert Carr 24421db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 24431db73f66624e7d151710483dd58e03eed672f064Robert Carr} 24441db73f66624e7d151710483dd58e03eed672f064Robert Carr 24459524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 24469524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr traverseInZOrder([this](Layer* child) { 24479524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (child == this) { 24489524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return; 24499524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 24509524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 24519524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 24529524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (client != nullptr) { 24539524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr client->detachLayer(child); 24549524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 24559524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr }); 24569524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 24579524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 24589524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 24599524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 24601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 24611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mParent = layer; 24621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 24651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 24661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 24671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 24701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 24711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 24721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 24741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 24771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 24781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 24811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Negatively signed children are before 'this' in Z-order. 24821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 24831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) { 24841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 24851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i < mDrawingChildren.size(); i++) { 24861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 24871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (child->getZ() >= 0) 24881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 24891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInZOrder(exec); 24901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr exec(this); 24921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i < mDrawingChildren.size(); i++) { 24931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 24941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInZOrder(exec); 24951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 24991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Positively signed children are before 'this' in reverse Z-order. 25001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 25011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) { 25021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 25031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (i = mDrawingChildren.size()-1; i>=0; i--) { 25041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 25051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (child->getZ() < 0) { 25061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 25071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInReverseZOrder(exec); 25091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr exec(this); 25111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i>=0; i--) { 25121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 25131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInReverseZOrder(exec); 25141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 25181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 25191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 25201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 25211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 25221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 25241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 25271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 25281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 25291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 25301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 25321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 253413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 253513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 25363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 25393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 25403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 25433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 25443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2545