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