Layer.cpp revision 532b26380fd6d32dc5d7605bd766a2c4f00d0a80
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer" 201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h> 4390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 463e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 497b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 55875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 57c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE 0 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 674d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const String8& name, uint32_t w, uint32_t h, uint32_t flags) 6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian : contentDirty(false), 7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 72a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mTextureName(-1U), 7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mName("unnamed"), 7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat(PIXEL_FORMAT_NONE), 7613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 80399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 81a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 83933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 84c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 85a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 86d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched(false), 87cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 888cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mPreviousFrameNumber(0), 894d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending(false), 9082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 9113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 935cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition(false), 969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mHasSurface(false), 9903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 101a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 102a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 103a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 10465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 10504839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos mUpdateTexImageFailed(false), 10682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 10782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mFreezePositionUpdates(false) 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating Layer %s", name.string()); 1119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 113a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mFlinger->getRenderEngine().genTextures(1, &mTextureName); 11549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eHidden) 1194125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerHidden; 1204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (flags & ISurfaceComposerClient::eOpaque) 1214125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerOpaque; 122231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza if (flags & ISurfaceComposerClient::eSecure) 123231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza layerFlags |= layer_state_t::eLayerSecure; 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eNonPremultiplied) 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mPremultipliedAlpha = false; 1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1323dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 133b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 134b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1354d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentState.alpha = 1.0f; 1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentState.alpha = 0xFF; 1409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.flags = layerFlags; 1434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 145bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1462f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1472f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1516547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t displayPeriod = 1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 1599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1606547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1610a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1620a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1630a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1640a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 165e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 166e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 1673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() { 168bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 169b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferProducer> producer; 170b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer; 1710556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian BufferQueue::createBufferQueue(&producer, &consumer, true); 1721db73f66624e7d151710483dd58e03eed672f064Robert Carr mProducer = new MonitoredProducer(producer, mFlinger, this); 173468051e20be19130572231266db306396a56402bIrvel mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this); 174bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 175399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSurfaceFlingerConsumer->setContentsChangedListener(this); 1764d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mSurfaceFlingerConsumer->setName(mName); 177b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam 17863a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard if (mFlinger->isLayerTripleBufferingDisabled()) { 17963a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard mProducer->setMaxDequeuedBufferCount(2); 18063a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard } 1816905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 1828430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 1838430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian updateTransformHint(hw); 184b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 18596f0819f81293076e652792794a961543e6750d7Mathias Agopian 1864d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1878ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos sp<Client> c(mClientRef.promote()); 1888ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos if (c != 0) { 1898ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos c->detachLayer(this); 1908ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos } 1918ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos 192cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mRemoteSyncPoints) { 193cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setTransactionApplied(); 194cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 195c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza for (auto& point : mLocalSyncPoints) { 196c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza point->setFrameAvailable(); 197c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 198921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mFlinger->deleteTextureAsync(mTextureName); 1996547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 20096f0819f81293076e652792794a961543e6750d7Mathias Agopian} 20196f0819f81293076e652792794a961543e6750d7Mathias Agopian 20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.empty()) { 2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface* layer) { 2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer) { 2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer->onDisplayed(); 2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 22213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2236b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) { 2246b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Add this buffer from our internal queue tracker 2256b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza { // Autolock scope 2266b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 227468051e20be19130572231266db306396a56402bIrvel mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), 228468051e20be19130572231266db306396a56402bIrvel item.mGraphicBuffer->getHeight(), item.mFrameNumber); 229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Reset the frame number tracker when we receive the first buffer after 230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // a frame number reset 231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (item.mFrameNumber == 1) { 232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = 0; 233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Ensure that callbacks are handled in order 236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 237a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 238a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ms2ns(500)); 239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (result != NO_ERROR) { 240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2446b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.push_back(item); 245ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza android_atomic_inc(&mQueuedFrames); 246a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 247a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Wake up any pending callbacks 248a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 249a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition.broadcast(); 2506b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2516b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 25299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mFlinger->signalLayerUpdate(); 253579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 254579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 2556b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) { 2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza { // Autolock scope 2577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Mutex::Autolock lock(mQueueItemLock); 258a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Ensure that callbacks are handled in order 2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ms2ns(500)); 2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (result != NO_ERROR) { 2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 2657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 266a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 267a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mQueueItems.empty()) { 2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("Can't replace a frame on an empty queue"); 2707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 2717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 2724d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos mQueueItems.editItemAt(mQueueItems.size() - 1) = item; 2737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 2747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake up any pending callbacks 2757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 2767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mQueueItemCondition.broadcast(); 2776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2786b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 2796b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 280399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() { 281399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 282399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was false 283399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mFlinger->signalLayerUpdate(); 284399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 285399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall} 286399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 2876710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after 2886710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before 2896710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list) 29013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() { 2915edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 2925edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 2935edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 2945edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 2955edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 2965edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 2975edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 2985edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 299bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->abandon(); 3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 30348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 304cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3091eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h, 31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian PixelFormat format, uint32_t flags) 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t const maxSurfaceDims = min( 31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // never allow a surface larger than what our underlying GL implementation 32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // can handle. 32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return BAD_VALUE; 32413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 32613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat = format; 32713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 32803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 32913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 33013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentOpacity = getOpacityForFormat(format); 33113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 33213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 33313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 33413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 33513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 33613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return NO_ERROR; 33713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 3404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 3414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 3434d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian "Layer::getHandle() has already been called"); 3444d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHasSurface = true; 3464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 348582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 349582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 350b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const { 351b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer; 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 35513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 35613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 35713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 358a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 359a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 360a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 361f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 362f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 363a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 365a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 366a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 367a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 368f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 369a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 3704fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 371f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 375f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 376f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 377f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 378f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 379f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 380f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 381f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 382f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 383f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 384f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const sp<Layer>& p = getParent(); 3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 4061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 41913127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 4201eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 4216c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 4226c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 4236c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 4246c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 4256c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 42613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 427b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 428b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 429b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 43013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 4311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 4331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 435de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 436de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 437de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 4381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 4431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 4441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 4451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4476c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 4486c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 44913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 45013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 452b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 45313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 4541eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 45513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 45613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 45713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 4586b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 4596b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 4606b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 4616b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 4620e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4630e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 464b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 465b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr activeCrop = s.crop; 4660e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 4670e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 471acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 472acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 473b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 474b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!activeCrop.intersect(s.finalCrop, &activeCrop)) { 475acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 476acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 477acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4815a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 4821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 4831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 4845a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 4851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 4871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 4901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 4921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto parentCrop = p->computeInitialCrop(hw); 4941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop.intersect(parentCrop, &activeCrop); 4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 4981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 49913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 50028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 50128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 50228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 50328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 50428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 50528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 506acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 508acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 50913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 510f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 511f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 512f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 513acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 514acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 517cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 519021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 520021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 522021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransformOrient = 523021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 52813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 5300f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos invTransform = (Transform(invTransformOrient) * Transform(invTransform)) 5310f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos .getOrientation(); 532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 536acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 540acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 550acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 551acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos const Rect winCrop = activeCrop.transform( 552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform, s.active.w, s.active.h); 55313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float xScale = crop.getWidth() / float(winWidth); 556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 55713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 558acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetL = winCrop.left * xScale; 559acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetT = winCrop.top * yScale; 560acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetR = (winWidth - winCrop.right ) * xScale; 561acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 562acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 563acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.left += insetL; 564acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.top += insetT; 565acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.right -= insetR; 566acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 56713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 56813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 56913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 57013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 5719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 572ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 5739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry( 5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw, 5769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) 5779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 578a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 5799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 5819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 5829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setDefaultState(); 5849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 585a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 5863e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 5879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 5959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(false); 5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (isSecure() && !hw->isSecure()) { 5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 602dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 60313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 6041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 6059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 606ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 6076452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 608ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman blendMode = mPremultipliedAlpha ? 6099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 6109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 611ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 612ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" 613ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman " %s (%d)", mName.string(), to_string(blendMode).c_str(), 614ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman to_string(error).c_str(), static_cast<int32_t>(error)); 6159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6166452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 0xFF) { 6179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBlending(mPremultipliedAlpha ? 6189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_PREMULT : 6199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_COVERAGE); 6209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 62213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 62313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 62413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 6256c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 6261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 627b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 628b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 6291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 6309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 631acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 6329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 6349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 635acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 636acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 63828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 63928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 64028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 64128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 64228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 64328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 644acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 645acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 646acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 6486c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 6496c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 6506c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, s.active.h)); 6516c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 6526c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeCrop.left, activeCrop.bottom)); 6536c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 6546c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, activeCrop.bottom)); 6556c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 6561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 6571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 658b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 659b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!frame.intersect(s.finalCrop, &frame)) { 660acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 661acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 662acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 664acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 665acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 666acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 669ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 670e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 671e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", 672e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza mName.string(), transformedFrame.left, transformedFrame.top, 673e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza transformedFrame.right, transformedFrame.bottom, 674e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 675e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 676e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 677e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6795a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 681e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 682e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 683e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, 684e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), 685e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza static_cast<int32_t>(error)); 686e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 687e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 688e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6906452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float alpha = getAlpha(); 6916452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " 6936452f12c95e855a96ab8f690f28914cd37de762bRobert Carr "%s (%d)", mName.string(), alpha, to_string(error).c_str(), 6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 696ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", 698ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr mName.string(), z, to_string(error).c_str(), 6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 7002f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 7012f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara error = hwcLayer->setInfo(s.type, s.appId); 7022f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", 7032f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mName.string(), static_cast<int32_t>(error)); 7049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!frame.intersect(hw->getViewport(), &frame)) { 7069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.clear(); 7079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 7099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setFrame(tr.transform(frame)); 7109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setCrop(computeCrop(hw)); 7116452f12c95e855a96ab8f690f28914cd37de762bRobert Carr layer.setPlaneAlpha(getAlpha()); 7129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 7139f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 71429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 71529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 71629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 71729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 71829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 71929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 72029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 72129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 72229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 7231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 724c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 725cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 726c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 727021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 728021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 729c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 730021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransform = 731021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 732c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 733c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 734c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 735c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian NATIVE_WINDOW_TRANSFORM_FLIP_H; 736c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 737cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 738cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 739cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 740cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 741cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 742cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 743cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 744cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 745c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 74629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 74729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 74813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 7499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 7569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: " 7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), to_string(transform).c_str(), 7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (orientation & Transform::ROT_INVALID) { 7629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we can only handle simple transformation 7639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 7649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 7659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setTransform(orientation); 7669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 768a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 769a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 7709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply this display's projection's viewport to the visible region 7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // before giving it to the HWC HAL. 7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr = displayDevice->getTransform(); 7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& viewport = displayDevice->getViewport(); 7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Region visible = tr.transform(visibleRegion.intersect(viewport)); 7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 787aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcInfo = mHwcLayers[hwcId]; 788aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcLayer = hwcInfo.layer; 7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setVisibleRegion(visible); 7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza visible.dump(LOG_TAG); 7949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 7979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza surfaceDamageRegion.dump(LOG_TAG); 8019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8030f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Sideband layers 8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mSidebandStream.get()) { 8050f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Sideband); 8060f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Sideband composition", mName.string()); 8070f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 8089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 8099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", 8109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mName.string(), mSidebandStream->handle(), 8119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8130f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 8149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8160a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // Client layers 817aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu if (hwcInfo.forceClientComposition || 8180a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) { 8190f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Client composition", mName.string()); 8209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Client); 8210f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 8220f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 8230f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 8240a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // SolidColor layers 8250a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (mActiveBuffer == nullptr) { 8260a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza setCompositionType(hwcId, HWC2::Composition::SolidColor); 827c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 828c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // For now, we only support black for DimLayer 8290a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza error = hwcLayer->setColor({0, 0, 0, 255}); 8300a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (error != HWC2::Error::None) { 8310a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), 8320a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8330a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 834c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 835c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // Clear out the transform, because it doesn't make sense absent a 836c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // source buffer 837c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza error = hwcLayer->setTransform(HWC2::Transform::None); 838c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza if (error != HWC2::Error::None) { 839c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), 840c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 841c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza } 842c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 8430a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza return; 8440a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 8450a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza 8460f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Device or Cursor layers 8470f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (mPotentialCursor) { 8480f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Cursor composition", mName.string()); 8490f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Cursor); 8509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 8519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting Device composition", mName.string()); 8529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Device); 8539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8540f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 855bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace); 856bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter error = hwcLayer->setDataspace(mCurrentState.dataSpace); 857bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (error != HWC2::Error::None) { 858bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), 859bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace, to_string(error).c_str(), 860bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter static_cast<int32_t>(error)); 861bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter } 862bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 86306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu uint32_t hwcSlot = 0; 8641f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara sp<GraphicBuffer> hwcBuffer; 8651f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, 8661f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara &hwcSlot, &hwcBuffer); 86706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu 8680f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 8691f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence); 8700f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (error != HWC2::Error::None) { 8710f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), 8720f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza mActiveBuffer->handle, to_string(error).c_str(), 8730f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza static_cast<int32_t>(error)); 8740f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 8759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 8769551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter 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 996cae605cd5668f8107e340ad8a672c7f034147401Robert Carrstatic constexpr mat4 inverseOrientation(uint32_t transform) { 997cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 998cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 999cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 1000cae605cd5668f8107e340ad8a672c7f034147401Robert Carr mat4 tr; 1001cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 1002cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 1003cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * rot90; 1004cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1005cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) { 1006cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * flipH; 1007cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1008cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) { 1009cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * flipV; 1010cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1011cae605cd5668f8107e340ad8a672c7f034147401Robert Carr return inverse(tr); 1012cae605cd5668f8107e340ad8a672c7f034147401Robert Carr} 1013cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 10145d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter/* 10155d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter * onDraw will draw the current layer onto the presentable buffer 10165d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter */ 1017c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 1018c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 10201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 10211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 1022a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (CC_UNLIKELY(mActiveBuffer == 0)) { 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the texture has not been created yet, this Layer has 1024179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // in fact never been drawn into. This happens frequently with 1025179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // SurfaceView because the WindowManager can't know when the client 1026179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // has drawn the first time. 1027179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 1028179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // If there is nothing under us, we paint the screen in black, otherwise 1029179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // we just skip this update. 1030179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 1031179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // figure out if there is something below us 1032179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region under; 10331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bool finished = false; 1034412903fce3a93f411c85c54375a1851bfb370400Dan Stoza mFlinger->mDrawingState.traverseInZOrder([&](Layer* layer) { 10351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (finished || layer == static_cast<Layer const*>(this)) { 10361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr finished = true; 10371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return; 10381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 10394297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 10401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr }); 1041179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // if not everything below us is covered, we plug the holes! 1042179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region holes(clip.subtract(under)); 1043179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian if (!holes.isEmpty()) { 10441748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0, 0, 0, 1); 1045179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian } 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1048a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 104997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // Bind the current buffer to the GL texture, and wait for it to be 105097eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // ready for us to draw into. 1051bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 1052bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (err != NO_ERROR) { 105397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 1054dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // Go ahead and draw the buffer anyway; no matter what we do the screen 1055dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // is probably going to have something visibly wrong. 1056dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 1057dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 1058dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 1059dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 1060875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1061875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 1062dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis if (!blackOutLayer) { 1063cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // TODO: we could be more subtle with isFixedSize() 1064eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 1065cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1066cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Query the texture matrix given our current filtering mode. 1067cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis float textureMatrix[16]; 1068bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 1069bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 1070cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1071cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 1072c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1073c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 1074021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to 1075021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the texture transform 1076c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 1077021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 1078021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 1079cae605cd5668f8107e340ad8a672c7f034147401Robert Carr mat4 tr = inverseOrientation(transform); 1080cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 1081cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /** 1082cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * TODO(b/36727915): This is basically a hack. 1083cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * 1084cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Ensure that regardless of the parent transformation, 1085cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * this buffer is always transformed from native display 1086cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * orientation to display orientation. For example, in the case 1087cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * of a camera where the buffer remains in native orientation, 1088cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * we want the pixels to always be upright. 1089cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 1090cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getParent() != nullptr) { 1091cae605cd5668f8107e340ad8a672c7f034147401Robert Carr const auto parentTransform = getParent()->getTransform(); 1092cae605cd5668f8107e340ad8a672c7f034147401Robert Carr tr = tr * inverseOrientation(parentTransform.getOrientation()); 1093cae605cd5668f8107e340ad8a672c7f034147401Robert Carr } 1094c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1095c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and finally apply it to the original texture matrix 1096c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 1097c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 1098c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 1099c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1100cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Set things up for texturing. 110149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 110249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setFiltering(useFiltering); 110349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setMatrix(textureMatrix); 110449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian 110549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian engine.setupLayerTexturing(mTexture); 1106a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } else { 1107875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.setupLayerBlackedOut(); 1108a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } 11098578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard drawWithOpenGL(hw, useIdentityTransform); 1110875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableTexturing(); 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1114c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 11151748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard float red, float green, float blue, 1116c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza float alpha) const 111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 111819733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1119c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, false); 112019733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 112119733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 112313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 112413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL( 11251748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard const sp<const DisplayDevice>& hw) const { 11261748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0,0,0,0); 112713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1129c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 11308578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard bool useIdentityTransform) const { 11311eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 113213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1133c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, useIdentityTransform); 113413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 113513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian /* 113613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * NOTE: the way we compute the texture coordinates here produces 113713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * different results than when we take the HWC path -- in the later case 113813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * the "source crop" is rounded to texel boundaries. 113913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * This can produce significantly different results when the texture 114013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * is scaled by a large amount. 114113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * 114213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * The GL code below is more logical (imho), and the difference with 114313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * HWC is due to a limitation of the HWC API to integers -- a question 1144c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian * is suspend is whether we should ignore this problem or revert to 114513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * GL composition when a buffer scaling is applied (maybe with some 114613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * minimal value)? Or, we could make GL behave like HWC -- but this feel 114713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * like more of a hack. 114813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian */ 1149acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos Rect win(computeBounds()); 1150acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 11511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 1152b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 11531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 1154b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!win.intersect(s.finalCrop, &win)) { 1155acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1156acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 11571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 1158acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!win.intersect(computeBounds(), &win)) { 1159acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1160acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1161acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 116213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 11633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float left = float(win.left) / float(s.active.w); 11643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float top = float(win.top) / float(s.active.h); 11653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float right = float(win.right) / float(s.active.w); 11663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float bottom = float(win.bottom) / float(s.active.h); 116713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1168875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // TODO: we probably want to generate the texture coords with the mesh 1169875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // here we assume that we only have 4 vertices 1170ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 1171ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[0] = vec2(left, 1.0f - top); 1172ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[1] = vec2(left, 1.0f - bottom); 1173ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[2] = vec2(right, 1.0f - bottom); 1174ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[3] = vec2(right, 1.0f - top); 117513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1176875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 11776452f12c95e855a96ab8f690f28914cd37de762bRobert Carr engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), getAlpha()); 11785d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2 11795d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter engine.setSourceDataSpace(mCurrentState.dataSpace); 11805d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif 11815cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian engine.drawMesh(mMesh); 1182875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableBlending(); 118313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 118413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 11859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 11869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, 11879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool callIntoHwc) { 11889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 11899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 11909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 11919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 11939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 11949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), 11959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), static_cast<int>(callIntoHwc)); 11969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 11979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 11989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 11999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 12009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 12019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set " 12029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "composition type %s: %s (%d)", mName.string(), 12039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), to_string(error).c_str(), 12049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 12059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 12089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 1210ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 1211ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 1212ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 1213ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 1214ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 12159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 1216ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 12179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 12189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 12209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 12219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 12239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 12249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 12259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 12269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 12289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 12299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 12319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 12329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 12339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 12349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 12359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 12369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 12379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 12391681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const { 12401681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int producerStickyTransform = 0; 12411681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 12421681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (ret != OK) { 12431681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 12441681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk strerror(-ret), ret); 12451681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return 0; 12461681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 12471681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return static_cast<uint32_t>(producerStickyTransform); 12481681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 12491681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 1250c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() { 1251c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool propertyLoaded = false; 1252c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool latch = false; 1253c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static std::mutex mutex; 1254c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza std::lock_guard<std::mutex> lock(mutex); 1255c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (!propertyLoaded) { 1256c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza char value[PROPERTY_VALUE_MAX] = {}; 1257c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza property_get("debug.sf.latch_unsignaled", value, "0"); 1258c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza latch = atoi(value); 1259c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza propertyLoaded = true; 1260c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1261c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return latch; 1262c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza} 1263c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 1264cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const { 1265cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mQueueItemLock); 1266cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!mQueueItems.empty()) { 1267cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mQueueItems[0].mFrameNumber; 1268cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1269cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mCurrentFrameNumber; 12707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1271cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza} 12727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 12731ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const { 12749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1275c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (latchUnsignaledBuffers()) { 1276c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return true; 1277c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1278c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 12791ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza Mutex::Autolock lock(mQueueItemLock); 12801ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems.empty()) { 12811ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 12821ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 12831ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems[0].mIsDroppable) { 12841ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // Even though this buffer's fence may not have signaled yet, it could 12851ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // be replaced by another buffer before it has a chance to, which means 12861ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // that it's possible to get into a situation where a buffer is never 12871ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // able to be latched. To avoid this, grab this buffer anyway. 12881ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 12891ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 12901ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return mQueueItems[0].mFence->getSignalTime() != INT64_MAX; 12919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 12929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return true; 12939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12941ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza} 12951ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 1296cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 1297cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 1298cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 1299cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 1300cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 13017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1302cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1303cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1304cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 1305cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 13067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 130813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 130913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 131013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 131113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 131213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 131313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 131413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 131513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1316ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range 1317ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and 1318ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel 1319ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into 1320ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here. 1321ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 1322ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 13235773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) { 1324a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (HARDWARE_IS_DEVICE_FORMAT(format)) { 1325a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return true; 1326ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold } 13275773d3f5b2694c647e010246dff99acc70131289Mathias Agopian switch (format) { 13285773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 13295773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 1330ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy case HAL_PIXEL_FORMAT_RGBA_FP16: 1331541f22658ab1617c9d12c98684ab40248df8749bRomain Guy case HAL_PIXEL_FORMAT_RGBA_1010102: 1332dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return false; 13335773d3f5b2694c647e010246dff99acc70131289Mathias Agopian } 13345773d3f5b2694c647e010246dff99acc70131289Mathias Agopian // in all other case, we have no blending (also for unknown formats) 1335dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return true; 1336ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold} 1337ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 134013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 134113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1342acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 1343acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 1344acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 1345acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1346acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 1347acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 1348acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1349acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 1350acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 1351acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1352acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 1353acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 1354acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1355acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 1356acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1357c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 1358c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 135913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 13601eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 13611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Transform hwTransform(hw->getTransform()); 136213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t hw_h = hw->getHeight(); 13631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 13643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 1366acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 1367acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 1368acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 1369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 13701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 1371acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 13721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 13731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 13741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 13751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 1376acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1377acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1378b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1379b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 1380b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 1381b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 1382b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 1383acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1384acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1385ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 13861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[0] = hwTransform.transform(lt); 13871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[1] = hwTransform.transform(lb); 13881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[2] = hwTransform.transform(rb); 13891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[3] = hwTransform.transform(rt); 13903f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian for (size_t i=0 ; i<4 ; i++) { 13915cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian position[i].y = hw_h - position[i].y; 139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1394ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 13954125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const 1396a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{ 1397e6fd41d064711395c7d060abacd86d487495530dneo.he // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the 1398a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // layer's opaque flag. 1399e6fd41d064711395c7d060abacd86d487495530dneo.he if ((mSidebandStream == nullptr) && (mActiveBuffer == nullptr)) { 1400a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return false; 1401db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis } 1402a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 1403a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if the layer has the opaque flag, then we're always opaque, 1404a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // otherwise we use the current buffer's format. 14054125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 1406a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian} 1407a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 1408231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const 1409231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{ 1410231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 1411231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 1412231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 1413231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 14147a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const 14157a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{ 1416a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 14177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis return (activeBuffer != 0) && 14187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 14197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1420b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 142113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const { 1422c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE; 142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const { 142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return !mCurrentCrop.isEmpty(); 142713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 142813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 142913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 143013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mNeedsFiltering || hw->needsFiltering(); 143113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 143213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 143313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 143413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 143513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 143613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 143713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 143813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 143913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 144013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 144113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 144213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 144313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region& 144413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setVisibleNonTransparentRegion) { 144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 144613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 144713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 144813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 144913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 145013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 145113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 145213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 14537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 14547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 14557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 14567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 14597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 14600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 14610d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 14620d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 14630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 14647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 14657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 14667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 14670d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 14683bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 14693bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos auto syncPoint = std::make_shared<SyncPoint>( 14703bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos mCurrentState.frameNumber); 14710d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 1472cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 1473cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1474cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 1475cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 14760d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1477cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 14817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 1482f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 14837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 14857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 148705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 148805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 148905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 149005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos stateToCommit->flags = (oldFlags & ~stateToCommit->mask) | 149105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos (stateToCommit->flags & stateToCommit->mask); 14927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 14947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 14957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 149605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 14977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 14987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 14990d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 15007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 15027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 15037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 15047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 150505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 15077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 15087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1510cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (mRemoteSyncPoints.front()->getFrameNumber() != 1511cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mPendingStates[0].frameNumber) { 1512cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ALOGE("[%s] Unexpected sync point frame number found", 1513cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mName.string()); 1514cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1515cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 1516cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 1517cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 1518cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 1519cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1520cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 15227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 152305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 15257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 15277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 15287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 1529792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 1530792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 153305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 15347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 15357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 15397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 15407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 15417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 15427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 15437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 15467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 15477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() { 1550cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto headFrameNumber = getHeadFrameNumber(); 15511ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza bool headFenceSignaled = headFenceHasSignaled(); 1552cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1553cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mLocalSyncPoints) { 15541ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { 1555cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setFrameAvailable(); 1556cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 15577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 156013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 15611c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 15621c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 15637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 156405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 156505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 15667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 15677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15691eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 15711eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const bool sizeChanged = (c.requested.w != s.requested.w) || 15721eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian (c.requested.h != s.requested.h); 1573a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1574a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian if (sizeChanged) { 1575cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 15769d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 15776905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1578419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n" 1580419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1581b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n", 1582c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr this, getName().string(), mCurrentTransform, 1583c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr getEffectiveScalingMode(), 15841eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.active.w, c.active.h, 1585b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.left, 1586b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.top, 1587b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.right, 1588b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.bottom, 1589b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getWidth(), 1590b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getHeight(), 15911eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h, 15921eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian s.active.w, s.active.h, 1593b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, 1594b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.top, 1595b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, 1596b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.bottom, 1597b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getWidth(), 1598b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getHeight(), 1599b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.requested.w, s.requested.h); 1600a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 16012a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 16022a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1603bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setDefaultBufferSize( 16041eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h); 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1606cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 160782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr const bool resizePending = (c.requested.w != c.active.w) || 160882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr (c.requested.h != c.active.h); 16090cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 16109e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 161113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // don't let Layer::doTransaction update the drawing state 16120cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // if we have a pending resize, unless we are in fixed-size mode. 16130cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // the drawing state will be updated only once we receive a buffer 16140cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // with the correct size. 16150cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // 16160cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // in particular, we want to make sure the clip (which is part 16170cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // of the geometry state) is latched together with the size but is 16180cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // latched immediately when no resizing is involved. 16199e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // 16209e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // If a sideband stream is attached, however, we want to skip this 16219e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // optimization so that transactions aren't missed when a buffer 16229e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // never arrives 16230cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 16240cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 16250cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 16260cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 16270cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 162813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always set active to requested, unless we're asked not to 162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this is used by Layer, which special cases resizes. 163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (flags & eDontUpdateGeometryState) { 163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } else { 16327d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 163382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (mFreezePositionUpdates) { 163482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 163582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 163682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 163782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 163882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 163982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 164082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 164182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 164282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 164313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 164413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 16451eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 164613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 164713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 164813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 164913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 16501eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 165113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 165513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 16563dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 16573dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mNeedsFiltering = (!c.active.transform.preserveRects() || 165813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian (type >= Transform::SCALE)); 165913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 166013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1661c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1662c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1663c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1664c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1666c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1667c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 166813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 166905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 167013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 167305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 167405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1675a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1676a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 167713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 167813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 167913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 168013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 168313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 168413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 168582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 16863dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 168713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 168813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 168969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 169069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 169169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 169269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 16933dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 169482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (immediate && !mFreezePositionUpdates) { 169582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 169682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 169782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mFreezePositionUpdates = mFreezePositionUpdates || !immediate; 169869663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 16997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 170113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 170213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 170382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 17041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 17051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 17061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 17071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 17081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 17101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 17111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 17121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 17141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1716ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.z == z) 171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 171913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 172013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 17217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1722db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1723db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1724db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1725db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1726db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1727db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1728db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1729db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1730db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 173113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 173213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 173313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 17341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1735db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1736db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1737db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1738db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1739db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1740db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1741db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1742db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1743db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1744db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1745db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1746db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1747db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1748db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1749db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) { 1750db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1751db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1752db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1753db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1754db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1755db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1756db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1757db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1758db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1759db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1760db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1761db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.z = z; 1762db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1763db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1764db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1765db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1766db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1767db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1768db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1769db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1770db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 177113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 177213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 177513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 17767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 177813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 177913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 17809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 17819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 17829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 17839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) { 17849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 178513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.alpha == alpha) 178613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 178713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 178813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.alpha = alpha; 17897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 179013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 179113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 179213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 179313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 179413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 17953dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set( 1796cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 17977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 179813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 179913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 180013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 180113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 18022ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 18037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 180413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 180513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 180613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 180713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 180813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 180913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.flags == newFlags) 181013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 181113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 181213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 18137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 18147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 181513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 181613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 181899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 181999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 1820b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.crop == crop) 182113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 182213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 182399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 182499e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr if (immediate) { 182599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 182699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 18277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 182813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 182913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 183013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 18318d5227b8416b099c884429312daf2d60496fa484Robert Carr 18328d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 1833b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.finalCrop == crop) 1834acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return false; 1835acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 18368d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 18378d5227b8416b099c884429312daf2d60496fa484Robert Carr if (immediate) { 18388d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 18398d5227b8416b099c884429312daf2d60496fa484Robert Carr } 1840acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1841acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1842acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1843acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 184413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1845c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 1846c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (scalingMode == mOverrideScalingMode) 1847c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return false; 1848c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 184982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1850c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1851c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1852c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 18532f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 18542f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = appId; 18552f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = type; 18562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.modified = true; 18572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara setTransactionFlags(eTransactionNeeded); 18582f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 18592f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1860c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const { 1861c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (mOverrideScalingMode >= 0) { 1862c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mOverrideScalingMode; 1863c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 1864c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mCurrentScalingMode; 1865c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1866c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 186713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 186813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.layerStack == layerStack) 186913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 187013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 187113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 18727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 187313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 187413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1875a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1876a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1877bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 1878bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (mCurrentState.dataSpace == dataSpace) 1879bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return false; 1880bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1881bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1882bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1883bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1884bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1885bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1886bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 1887532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 1888532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1889532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1890532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 18911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 18921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto p = getParent(); 18931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 18941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 18951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 18971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 18990d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, 19007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber) { 19010d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 19027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 19037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 19047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 19057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 19067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 19070d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1908792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 19097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 19100d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("Deferred transaction"); 19110d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 19120d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 19130d48072f6047140119ff194c1194ce402fca2c0bRobert Carrvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, 19140d48072f6047140119ff194c1194ce402fca2c0bRobert Carr uint64_t frameNumber) { 19150d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 19160d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 19177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 19187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1919ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() { 1920ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza if (mFlinger->mForceFullDamage) { 1921ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = Region::INVALID_REGION; 1922ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } else { 1923ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1924ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } 1925ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1926ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1927ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() { 1928ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.clear(); 1929ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1930ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19356b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const { 1936ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mSidebandStreamChanged || mAutoRefresh) { 1937d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza return true; 1938d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza } 1939d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza 19406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 19410eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza if (mQueueItems.empty()) { 19420eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return false; 19430eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza } 19440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza auto timestamp = mQueueItems[0].mTimestamp; 19456b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza nsecs_t expectedPresent = 19466b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 19470eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 19480eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza // Ignore timestamps more than a second in the future 19490eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 19500eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 19510eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza "relative to expectedPresent %" PRId64, mName.string(), timestamp, 19520eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza expectedPresent); 19530eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 19540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isDue = timestamp < expectedPresent; 19550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return isDue || !isPlausible; 19566b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 19576b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 1958d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) { 1959d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (mBufferLatched) { 1960d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1961d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime); 1962d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 19634d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending = false; 1964ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh; 196599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 196699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 19670a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, 19683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson const std::shared_ptr<FenceTime>& presentFence, 19690a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson const CompositorTiming& compositorTiming) { 19703d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.updateSignalTimes(); 19713d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.updateSignalTimes(); 19723d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 1973d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // mFrameLatencyNeeded is true when a new frame was latched for the 1974d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // composition. 197528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (!mFrameLatencyNeeded) 197628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return false; 197728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 197828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameEventHistory. 197928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard { 198028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard Mutex::Autolock lock(mFrameEventHistoryMutex); 198128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameEventHistory.addPostComposition(mCurrentFrameNumber, 19820a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson glDoneFence, presentFence, compositorTiming); 198328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 198482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 198528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameTracker. 198628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 198728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setDesiredPresentTime(desiredPresentTime); 198882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 19893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime> frameReadyFence = 19903d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mSurfaceFlingerConsumer->getCurrentFenceTime(); 199128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (frameReadyFence->isValid()) { 19923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setFrameReadyFence(std::move(frameReadyFence)); 199328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 199428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // There was no fence for this frame, so assume that it was ready 199528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // to be presented at the desired present time. 199628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setFrameReadyTime(desiredPresentTime); 199728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 199882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 19993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson if (presentFence->isValid()) { 20003d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentFence( 20013d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime>(presentFence)); 200228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 200328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // The HWC doesn't support present fences, so use the refresh 200428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // timestamp instead. 20053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentTime( 20063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFlinger->getHwComposer().getRefreshTimestamp( 20073d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson HWC_DISPLAY_PRIMARY)); 2008d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 200928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 201028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.advanceFrame(); 201128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameLatencyNeeded = false; 201228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return true; 2013d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 2014d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 20159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2016f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { 20175ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { 20185ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson return; 20195ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson } 20205ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 20213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 2022d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 20233d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 20243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 20253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 20268cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson if (mPreviousFrameNumber != 0) { 20278cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mFrameEventHistory.addRelease(mPreviousFrameNumber, 20288cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson dequeueReadyTime, std::move(releaseFenceTime)); 20298cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson } 20309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 20319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 20329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 20331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 20341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 20351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& parent = getParent(); 20361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 20371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 20381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 20391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 20401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 20411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2042da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const { 20439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 20446452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return !(isHiddenByPolicy()) && getAlpha() > 0.0f 20459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza && (mActiveBuffer != NULL || mSidebandStream != NULL); 20469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 20476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return !(isHiddenByPolicy()) && getAlpha() 20489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard && (mActiveBuffer != NULL || mSidebandStream != NULL); 20499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2050da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 2051da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2052cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() { 2053cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard auto headFrameNumber = getHeadFrameNumber(); 2054cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool matchingFramesFound = false; 2055cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool allTransactionsApplied = true; 2056cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 2057cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2058cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard for (auto& point : mLocalSyncPoints) { 2059cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (point->getFrameNumber() > headFrameNumber) { 2060cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 2061cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 2062cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard matchingFramesFound = true; 2063cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2064cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!point->frameIsAvailable()) { 2065cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // We haven't notified the remote layer that the frame for 2066cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // this point is available yet. Notify it now, and then 2067cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // abort this attempt to latch. 2068cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard point->setFrameAvailable(); 2069cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = false; 2070cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 2071cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 2072cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2073cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied(); 2074cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 2075cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard return !matchingFramesFound || allTransactionsApplied; 2076cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard} 2077cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 2078d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) 2079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 20801c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 20811c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 2082399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 2083399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was true 2084399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 208512e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza if (mSidebandStream != NULL) { 208612e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza setTransactionFlags(eTransactionNeeded); 208712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 208812e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza } 20895bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall recomputeVisibleRegions = true; 20905bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall 20915bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall const State& s(getDrawingState()); 20921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getTransform().transform(Region(Rect(s.active.w, s.active.h))); 2093399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 2094399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 20954fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region outDirtyRegion; 2096223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mQueuedFrames <= 0 && !mAutoRefresh) { 2097223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2098223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 209999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 2100223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // if we've already called updateTexImage() without going through 2101223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // a composition step, we have to skip this layer at this point 2102223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // because we cannot call updateTeximage() without a corresponding 2103223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // compositionComplete() call. 2104223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // we'll trigger an update in onPreComposition(). 2105223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mRefreshPending) { 2106223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2107223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 21081ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 2109223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the head buffer's acquire fence hasn't signaled yet, return and 2110223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // try again later 2111223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!headFenceHasSignaled()) { 2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 21152c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 2116223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Capture the old state of the layer for comparisons later 2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const State& s(getDrawingState()); 2118223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const bool oldOpacity = isOpaque(s); 2119223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 2120223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2121cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!allTransactionsSignaled()) { 2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2125223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This boolean is used to make sure that SurfaceFlinger's shadow copy 2127223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // of the buffer queue isn't modified when the buffer queue is returning 2128223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // BufferItem's that weren't actually queued. This can happen in shared 2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // buffer mode. 2130223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bool queuedBuffer = false; 21317b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 21327b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard getProducerStickyTransform() != 0, mName.string(), 21337b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard mOverrideScalingMode, mFreezePositionUpdates); 2134223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 2135223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, 2136223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mLastFrameNumberReceived); 2137223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (updateResult == BufferQueue::PRESENT_LATER) { 2138223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Producer doesn't want buffer to be displayed yet. Signal a 2139223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // layer update so we check again at the next opportunity. 2140223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2141223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2142223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 2143223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the buffer has been rejected, remove it from the shadow queue 2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // and return early 2145063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 21466b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 2147223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2148223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 2149223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2150223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2151223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 2152223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This can occur if something goes wrong when trying to create the 2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // EGLImage for this buffer. If this happens, the buffer has already 2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // been released, so we need to clean up the queue and bug out 2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // early. 2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.clear(); 2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_and(0, &mQueuedFrames); 2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2161ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Once we have hit this state, the shadow queue may no longer 2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // correctly reflect the incoming BufferQueue's contents, so even if 2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage starts working, the only safe course of action is 2165223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // to continue to ignore updates. 2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mUpdateTexImageFailed = true; 2167ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2168223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2170223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Autolock scope 2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2174223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2175223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2176223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2177223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any stale buffers that have been dropped during 2178223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage 2179223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 21806b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.removeAt(0); 2181223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 21826b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 21836b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 2184223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2185223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2186ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 21871585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 2188223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Decrement the queued-frames count. Signal another event if we 2189223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // have more frames pending. 2190223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 2191223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard || mAutoRefresh) { 2192223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2193223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2194d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian 2195223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // update the active buffer 219606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer( 219706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &mActiveBufferSlot); 2198223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mActiveBuffer == NULL) { 2199223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // this can only happen if the very first buffer was rejected. 2200223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2201223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2202702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2203d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched = true; 2204d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mPreviousFrameNumber = mCurrentFrameNumber; 2205d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2206d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2207d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson { 2208d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2209d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); 2210d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2 22113d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 2212d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 22133d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 22148cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson if (mPreviousFrameNumber != 0) { 22158cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson mFrameEventHistory.addRelease(mPreviousFrameNumber, 22168cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson latchTime, std::move(releaseFenceTime)); 22178cc8b10e27d515a6962ae6c66a62387ced45f5feBrian Anderson } 2218d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif 2219d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 2220d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2221223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mRefreshPending = true; 2222223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFrameLatencyNeeded = true; 2223223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer == NULL) { 2224223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // the first time we receive a buffer, we need to trigger a 2225223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // geometry invalidation. 2226223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2227223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2228223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2229bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace()); 2230bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 2231223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 2232223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 2233223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 2234223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((crop != mCurrentCrop) || 2235223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (transform != mCurrentTransform) || 2236223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (scalingMode != mCurrentScalingMode)) 2237223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2238223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentCrop = crop; 2239223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentTransform = transform; 2240223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentScalingMode = scalingMode; 2241223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2242223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2243702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2244223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer != NULL) { 2245223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufWidth = mActiveBuffer->getWidth(); 2246223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufHeight = mActiveBuffer->getHeight(); 2247223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (bufWidth != uint32_t(oldActiveBuffer->width) || 2248223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bufHeight != uint32_t(oldActiveBuffer->height)) { 2249702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian recomputeVisibleRegions = true; 2250702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2251223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2252702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2253223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 2254223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldOpacity != isOpaque(s)) { 2255223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2256223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2257cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2258223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any sync points corresponding to the buffer which was just 2259223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latched 2260223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2261223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 2262223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto point = mLocalSyncPoints.begin(); 2263223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (point != mLocalSyncPoints.end()) { 2264223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!(*point)->frameIsAvailable() || 2265223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard !(*point)->transactionIsApplied()) { 2266223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This sync point must have been added since we started 2267223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latching. Don't drop it yet. 2268223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2269223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard continue; 2270223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2271223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2272223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((*point)->getFrameNumber() <= mCurrentFrameNumber) { 2273223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard point = mLocalSyncPoints.erase(point); 2274223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else { 2275223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2276cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2277cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2278223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2279cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2280223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // FIXME: postedRegion should be dirty & bounds 2281223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Region dirtyRegion(Rect(s.active.w, s.active.h)); 2282223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2283223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // transform the dirty region to window-manager space 22841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr outDirtyRegion = (getTransform().transform(dirtyRegion)); 22851c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 22864fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 2287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const 229013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 229113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 229213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 229313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 229413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 229513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 229603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 229703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 229803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 229913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 230013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 230113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 230213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 230313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 230413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 230513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 230613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 230713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 230813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 230913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 231013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 231113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 231213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 231313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 231413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 231513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setTransformHint(orientation); 231613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 231713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 231813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 231913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 232013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 232113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 23223e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const 23231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 23241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 232513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 23263e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.colorize(result, Colorizer::GREEN); 232774d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 232813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "+ %s %p (%s)\n", 232913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian getTypeId(), this, getName().string()); 23303e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.reset(result); 233113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 23322ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian s.activeTransparentRegion.dump(result, "transparentRegion"); 233313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian visibleRegion.dump(result, "visibleRegion"); 2334ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.dump(result, "surfaceDamageRegion"); 233513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sp<Client> client(mClientRef.promote()); 233636c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter PixelFormat pf = PIXEL_FORMAT_UNKNOWN; 233736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter const sp<GraphicBuffer>& buffer(getActiveBuffer()); 233836c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter if (buffer != NULL) { 233936c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter pf = buffer->getPixelFormat(); 234036c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter } 234113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 234274d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( " " 2343acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), " 2344acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), " 234513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "isOpaque=%1d, invalidate=%1d, " 234636c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter "dataspace=%s, pixelformat=%s " 23479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 23489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 23499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 23509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 23519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 235213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian " client=%p\n", 23531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr getLayerStack(), s.z, 23541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr s.active.transform.tx(), s.active.transform.ty(), 23551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr s.active.w, s.active.h, 2356b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, s.crop.top, 2357b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, s.crop.bottom, 2358b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.left, s.finalCrop.top, 2359b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.right, s.finalCrop.bottom, 23604125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden isOpaque(s), contentDirty, 236136c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter dataspaceDetails(getDataSpace()).c_str(), decodePixelFormat(pf).c_str(), 236213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian s.alpha, s.flags, 23633dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[0][0], s.active.transform[0][1], 23643dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[1][0], s.active.transform[1][1], 236513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian client.get()); 23661b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2367a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<const GraphicBuffer> buf0(mActiveBuffer); 2368a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian uint32_t w0=0, h0=0, s0=0, f0=0; 23691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian if (buf0 != 0) { 23701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian w0 = buf0->getWidth(); 23711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian h0 = buf0->getHeight(); 23721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s0 = buf0->getStride(); 2373a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian f0 = buf0->format; 23741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian } 237574d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 23761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 2377ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 23786905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden " queued-frames=%d, mRefreshPending=%d\n", 2379a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFormat, w0, h0, s0,f0, 23806905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden mQueuedFrames, mRefreshPending); 23811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2382bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (mSurfaceFlingerConsumer != 0) { 23833d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross mSurfaceFlingerConsumer->dumpState(result, " "); 2384bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 2385d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 2386d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian 23879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2388e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 2389e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2390e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2391e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 2392e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 2393e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 2394e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 2395e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 2396e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2397e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2398e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 2399e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2400e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 2401e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 2402e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 2403e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2404e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2405e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 2406e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 2407e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 2408e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 2409e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 2410e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 2411e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 2412e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 2413e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 2414e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2415e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2416e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 2417e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2418e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 2419e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 2420e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %10u | ", layerState.z); 2421e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%10s | ", 2422e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(getCompositionType(hwcId)).c_str()); 2423e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 2424e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, 2425e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza frame.right, frame.bottom); 24265a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 2427e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, 2428e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza crop.right, crop.bottom); 2429e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2430e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 2431e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 2432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 24339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2434e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2435d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 2436d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 243782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 243882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2439d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 2440d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 244125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 244225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 24436547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 24446547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 24456547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 24466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 2447d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 2448d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 2449d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 2450d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 2451d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 2452d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson result.appendFormat("- Layer %s (%s, %p)\n", 2453d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson getName().string(), getTypeId(), this); 2454d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2455d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 2456d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 2457d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 2458d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 24595ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 24605ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 24615ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 24625ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 24635ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 24643890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 24653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta *outDelta) { 2466d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2467d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 24683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 2469d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 2470d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 247140845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 24723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 24733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 2474d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 247540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 2476e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2477e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory( 2478e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza bool forceFlush) { 2479e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza std::vector<OccupancyTracker::Segment> history; 2480e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, 2481e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza &history); 2482e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza if (result != NO_ERROR) { 2483e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), 2484e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza result); 2485e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return {}; 2486e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza } 2487e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return history; 2488e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza} 2489e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2490367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const { 2491367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); 2492367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr} 2493367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 24941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 24951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 24961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 24971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 25001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 25011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 25021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25041db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 25051db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 25061db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 25071db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 25081db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 25091db73f66624e7d151710483dd58e03eed672f064Robert Carr } 25101db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 25111db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 25121db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 25131db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 25141db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 25151db73f66624e7d151710483dd58e03eed672f064Robert Carr } 25161db73f66624e7d151710483dd58e03eed672f064Robert Carr 25171db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 25181db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent->addChild(child); 25191db73f66624e7d151710483dd58e03eed672f064Robert Carr 25201db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 25211db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 25221db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 25231db73f66624e7d151710483dd58e03eed672f064Robert Carr } 25241db73f66624e7d151710483dd58e03eed672f064Robert Carr } 25251db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 25261db73f66624e7d151710483dd58e03eed672f064Robert Carr 25271db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 25281db73f66624e7d151710483dd58e03eed672f064Robert Carr} 25291db73f66624e7d151710483dd58e03eed672f064Robert Carr 25309524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 2531412903fce3a93f411c85c54375a1851bfb370400Dan Stoza traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) { 25329524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (child == this) { 25339524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return; 25349524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 25359524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 25369524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 25379524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (client != nullptr) { 25389524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr client->detachLayer(child); 25399524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 25409524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr }); 25419524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 25429524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 25439524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 25449524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 25451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 25461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mParent = layer; 25471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 25501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 25511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 25521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 25551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 25561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 25571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 25581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 25591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 25611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 25621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 25631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 25641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2565412903fce3a93f411c85c54375a1851bfb370400Dan StozaLayerVector Layer::makeTraversalList(LayerVector::StateSet stateSet) { 2566412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 2567412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 2568412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 2569412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 2570412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 2571412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 2572412903fce3a93f411c85c54375a1851bfb370400Dan Stoza if (state.zOrderRelatives.size() == 0) { 2573412903fce3a93f411c85c54375a1851bfb370400Dan Stoza return children; 2574db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2575db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 2576db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2577412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 2578db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 2579db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 2580db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 2581db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2582db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2583db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2584412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 2585db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 2586db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2587db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2588db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 2589db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 2590db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 25911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 2592db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 25931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 2594412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 2595412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 2596db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 25971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 2598db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 2599db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2600db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 26011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 2602db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 2603412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 26041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2605412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 2606db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 2607db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2608412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 26091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 26101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 2613db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 26141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 2615412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 2616412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 2617412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 2618db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 26191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 2620db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (i = list.size()-1; i>=0; i--) { 2621db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2622db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 26231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 26241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2625412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 26261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2627412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 26281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i>=0; i--) { 2629db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 2630412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 26311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 26321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 26351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 26361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 26371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 26381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 26399b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 26409b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 26419b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 26429b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 26439b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 26449b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 26459b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr if (p->isFixedSize()) { 26461725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 26471725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 26481725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 26491725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getWidth(); 26501725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getHeight(); 26511725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 26521725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getWidth(); 26531725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getHeight(); 26541725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 26559b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr float sx = p->getDrawingState().active.w / 26561725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr static_cast<float>(bufferWidth); 26579b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr float sy = p->getDrawingState().active.h / 26581725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr static_cast<float>(bufferHeight); 26599b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 26609b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 26619b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 26629b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 26631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 26641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 26651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 26676452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#ifdef USE_HWC2 26686452f12c95e855a96ab8f690f28914cd37de762bRobert Carrfloat Layer::getAlpha() const { 26696452f12c95e855a96ab8f690f28914cd37de762bRobert Carr const auto& p = getParent(); 26706452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 26716452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0; 26726452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return parentAlpha * getDrawingState().alpha; 26736452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 26746452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#else 26756452f12c95e855a96ab8f690f28914cd37de762bRobert Carruint8_t Layer::getAlpha() const { 26766452f12c95e855a96ab8f690f28914cd37de762bRobert Carr const auto& p = getParent(); 26776452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 26786452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float parentAlpha = (p != nullptr) ? (p->getAlpha() / 255.0f) : 1.0; 26796452f12c95e855a96ab8f690f28914cd37de762bRobert Carr float drawingAlpha = getDrawingState().alpha / 255.0f; 26806452f12c95e855a96ab8f690f28914cd37de762bRobert Carr drawingAlpha = drawingAlpha * parentAlpha; 26816452f12c95e855a96ab8f690f28914cd37de762bRobert Carr return static_cast<uint8_t>(std::round(drawingAlpha * 255)); 26826452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 26836452f12c95e855a96ab8f690f28914cd37de762bRobert Carr#endif 26846452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 26851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 26861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 26871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 26881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 26891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 26901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 26911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 26921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 269313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 269413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 26953f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26973f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 26983f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 26993f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27013f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 27023f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 27033f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2704