Layer.cpp revision c9232edd34618360d099272fb0537cae2f715860
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 2241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <math.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 2441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include <stdlib.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3736c44dcc692ac1f7230d01d2ed3ffa93104ce478Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 383330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 416b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 42a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h> 43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h> 4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 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" 5241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "clz.h" 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 56875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 57875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 58c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include "LayerProtoHelper.h" 60c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 6141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#define DEBUG_RESIZE 0 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 6741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w, 6841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t h, uint32_t flags) 690c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman : contentDirty(false), 7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mName(name), 7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 77a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 78399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 79a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 80a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 81c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 83cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 8482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 8513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 8613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 875cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 8813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 8903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 90a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 91a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 92a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 93a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 9465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 9582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 9641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFreezeGeometryUpdates(false) { 979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 98a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1004d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 10141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden; 10241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque; 10341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure; 1044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1054d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 106f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza mTransactionName = String8("TX - ") + mName; 1074d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1094d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1100c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mCurrentState.flags = layerFlags; 1113dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 112b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 113b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedFinalCrop = mCurrentState.finalCrop; 1157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedCrop = mCurrentState.crop; 1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 11713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = 1.0f; 1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1194d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1204d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 121bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1222f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1232f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1276547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1316547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1320a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1330a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1340a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 136e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 137e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 13841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {} 13996f0819f81293076e652792794a961543e6750d7Mathias Agopian 1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1416547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 14296f0819f81293076e652792794a961543e6750d7Mathias Agopian} 14396f0819f81293076e652792794a961543e6750d7Mathias Agopian 14413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 14513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 14613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 14713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 148eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman/* 149eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * onLayerDisplayed is only meaningful for BufferLayer, but, is called through 150eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * Layer. So, the implementation is done in BufferLayer. When called on a 151eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman * ColorLayer object, it's essentially a NOP. 152eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman */ 153eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanvoid Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {} 15413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 155c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() { 156c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mCurrentState to mLayersPendingRemoval 157c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 1588b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw mPendingRemoval = true; 1598b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw 1605edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1615edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1625edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 1635edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 164c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mFlinger->setTransactionFlags(eTraversalNeeded); 1655edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1665edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1675edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1685edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 169c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu for (const auto& child : mCurrentChildren) { 170c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu child->onRemovedFromCurrentState(); 171c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 172c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu} 1733851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 174c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() { 175c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mLayersPendingRemoval 176eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman abandon(); 177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 178b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyAllHwcLayers(); 1793851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 1801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 1811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 1821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 18348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 184cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 18513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 18613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 18713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 18813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1891eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 19013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 19113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 19213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 19313fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const { 19413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return mPremultipliedAlpha; 19513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 19613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 1974d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 1984d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 1994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 200582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 201582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 20413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 206b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { 20741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Already have a layer for hwcId %d", hwcId); 208b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWC2::Layer* layer = hwc->createLayer(hwcId); 209b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (!layer) { 210b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return false; 211b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 212b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWCInfo& hwcInfo = mHwcLayers[hwcId]; 213b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc = hwc; 214b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.layer = layer; 215b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas layer->setLayerDestroyedListener( 21641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman [this, hwcId](HWC2::Layer* /*layer*/) { mHwcLayers.erase(hwcId); }); 217b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return true; 218b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 219b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 220b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyHwcLayer(int32_t hwcId) { 221b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (mHwcLayers.count(hwcId) == 0) { 222b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return; 223b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 224b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas auto& hwcInfo = mHwcLayers[hwcId]; 22541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer"); 226b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer"); 227b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer); 228b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // The layer destroyed listener should have cleared the entry from 229b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // mHwcLayers. Verify that. 23041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers"); 231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 232b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() { 234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas size_t numLayers = mHwcLayers.size(); 235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas for (size_t i = 0; i < numLayers; ++i) { 236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed"); 237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyHwcLayer(mHwcLayers.begin()->first); 238b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(), 24041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "All hardware composer layers should have been destroyed"); 241b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 243a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 244a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 245a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 246f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 247f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 248a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 249f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 250a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 251a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 252a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 253f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 254a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 2554fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 256f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 257f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 258f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 259f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 260f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 261f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 262f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 263f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 264f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 265f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 266f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 267f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 268f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 269f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 2701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 2711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 2721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 2731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 2751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 2761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 2781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 2791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 2801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 28141b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr if (!s.finalCrop.isEmpty()) { 28241b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr win.intersect(s.finalCrop, &win); 28341b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr } 28441b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr 285e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const sp<Layer>& p = mDrawingParent.promote(); 2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 2881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 2891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 2901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 2911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 2921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 2931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 2941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 2951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 30813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 3091eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 3106c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 3116c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 3126c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 3136c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 3146c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 316b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 317b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 318b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 322e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 324de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 325de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 326de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 3341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3366c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 3376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 33813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 341b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 3431eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 34413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 3476b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 3486b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 3496b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 3506b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 3510e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3520e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 353b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 354df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu activeCrop.intersect(s.crop, &activeCrop); 3550e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 3560e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 359acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 360acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 361acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 362b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 36341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(s.finalCrop, &activeCrop)) { 364acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 366acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 367b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 368b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw const auto& p = mDrawingParent.promote(); 369b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw if (p != nullptr) { 370b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw auto parentCrop = p->computeInitialCrop(hw); 371b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw activeCrop.intersect(parentCrop, &activeCrop); 372b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw } 373b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 3741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 3751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3775a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 3781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 3791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 3805a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 3811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 39013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 39128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 39228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 39328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 39428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 39528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 39628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 397acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 398acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 399acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 40013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 401f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 402f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 403f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 404acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 405acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 406acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 407acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 408cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 409acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 410021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 411021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 412acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 41341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform(); 414acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 415acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 41641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 41713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 418acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 41941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation(); 420acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 421acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 422acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 426acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 427acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 428acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 43341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 434acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 43841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h); 43913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 44141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float xScale = crop.getWidth() / float(winWidth); 442acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 44313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 44441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetL = winCrop.left * xScale; 44541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetT = winCrop.top * yScale; 44641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetR = (winWidth - winCrop.right) * xScale; 447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 44941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.left += insetL; 45041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.top += insetT; 45141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.right -= insetR; 452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 45313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 45413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 45513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 45613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 457ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 458a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 4599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 4609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 461a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 4623e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 4639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 4649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 4669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 4679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 4689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 470dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 47113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 4721eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 473ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 4746452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 47541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman blendMode = 47641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 4779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 478ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 47941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 48041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set blend mode %s:" 48141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " %s (%d)", 48241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(), 48341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 48413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 48513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 48613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 4876c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 4881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 489b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 490b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 4911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 49241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 493acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 494acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 4951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 49628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 49728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 49828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 49928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 50028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 50128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 50241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 503acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5056c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 5066c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 50741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h)); 50841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom)); 50941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf( 51041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom)); 5116c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 5121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 514b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 51541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!frame.intersect(s.finalCrop, &frame)) { 516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 519acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 5239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 524ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 525e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 52641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(), 52741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.left, transformedFrame.top, transformedFrame.right, 52841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error)); 529e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 530e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 531e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5335a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 5349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 535e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 536e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 53741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 53841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom, 53941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 540e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 541e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 542e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 54413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw float alpha = static_cast<float>(getAlpha()); 5456452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 54641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 54741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set plane alpha %.3f: " 54841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 54941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error)); 5509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 551ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 55241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z, 55341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 5542f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 5552a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int type = s.type; 5562a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int appId = s.appId; 557e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> parent = mDrawingParent.promote(); 5582a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk if (parent.get()) { 5592a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk auto& parentState = parent->getDrawingState(); 5602a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk type = parentState.type; 5612a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk appId = parentState.appId; 5622a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk } 5632a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk 5642a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk error = hwcLayer->setInfo(type, appId); 56541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(), 56641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 5679f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 56829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 56929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 57029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 57129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 57229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 57329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 57429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 57529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 57629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 5771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 578c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 579cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 580c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 581021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 582021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 583c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 58441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform(); 585c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 586c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 58741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 588c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 589cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 590cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 591cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 592cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 593cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 594cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 595cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 596cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 597c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 59829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 59929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 60013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 6019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 6029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 6039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 6059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 6069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 60741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 60841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set transform %s: " 60941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 61041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(transform).c_str(), to_string(error).c_str(), 61141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 613a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 614a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 6159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 6169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 6179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 6189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 6229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 623eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman 624c9232edd34618360d099272fb0537cae2f715860chaviwbool Layer::getForceClientComposition(int32_t hwcId) { 625c9232edd34618360d099272fb0537cae2f715860chaviw if (mHwcLayers.count(hwcId) == 0) { 626c9232edd34618360d099272fb0537cae2f715860chaviw ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId); 627c9232edd34618360d099272fb0537cae2f715860chaviw return false; 628c9232edd34618360d099272fb0537cae2f715860chaviw } 629c9232edd34618360d099272fb0537cae2f715860chaviw 630c9232edd34618360d099272fb0537cae2f715860chaviw return mHwcLayers[hwcId].forceClientComposition; 631c9232edd34618360d099272fb0537cae2f715860chaviw} 632c9232edd34618360d099272fb0537cae2f715860chaviw 6339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 6349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 63541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mHwcLayers.count(hwcId) == 0 || getCompositionType(hwcId) != HWC2::Composition::Cursor) { 6369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 6409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 641dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 6429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 6439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 6449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 645b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 646b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 6479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 6501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 652b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 653b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 654acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 6569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 6579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 65841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, position.top); 65941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 66041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set cursor position " 66141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "to (%d, %d): %s (%d)", 66241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), position.left, position.top, to_string(error).c_str(), 66341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 66503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 66613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 66713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 66813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 66913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 670a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const { 671a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, clip, false); 67213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 67313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 674a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const { 675a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform); 67613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 67713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 678a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const { 679a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), false); 680c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 681c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 68241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue, 68341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float alpha) const { 68419733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 685a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw computeGeometry(renderArea, mMesh, false); 68619733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 68719733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 68813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 68913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 690a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const { 69141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman clearWithOpenGL(renderArea, 0, 0, 0, 0); 69213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 69313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 69441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) { 6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 7009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 70141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(), 70241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int>(callIntoHwc)); 7039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 7049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 7059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 70841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 70941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set " 71041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "composition type %s: %s (%d)", 71141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(type).c_str(), to_string(error).c_str(), 71241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 7139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 718ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 719ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 720ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 721ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 722ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 7239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 724ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 7319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 746cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 747cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 748cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 749cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 750cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 7517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 752cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 753cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 754cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 755cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 7567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 7577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 75813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 75913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 76013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 76113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 76213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 76313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 76413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 76513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 76613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 76713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 76813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 76913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 770acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 771acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 772acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 773acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 774acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 775acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 776acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 777acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 778acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 779acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 780acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 781acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 782acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 783acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 784acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 785a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh, 786a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool useIdentityTransform) const { 7871eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 788a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const Transform renderAreaTransform(renderArea.getTransform()); 789a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const uint32_t height = renderArea.getHeight(); 7901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 7913f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 792acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 793acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 794acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 795acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 796acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 7971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 798acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 7991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 8001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 8011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 8021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 803acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 804acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 805b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 806b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 807b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 808b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 809b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 810acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 811acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 812ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 813a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[0] = renderAreaTransform.transform(lt); 814a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[1] = renderAreaTransform.transform(lb); 815a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[2] = renderAreaTransform.transform(rb); 816a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[3] = renderAreaTransform.transform(rt); 81741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (size_t i = 0; i < 4; i++) { 818a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[i].y = height - position[i].y; 81913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 82013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 821ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 82241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const { 823231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 824231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 825231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 826231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 82713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 82813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 82913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 83013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 83113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 83213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 83313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 83413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 83513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 83613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 83741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) { 83813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 83913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 84013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 84113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 84213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 84313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 84413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 84513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 8467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 8477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 8487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 8497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 8527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 8530d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 8540d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 8550d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 8560d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 8577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 8587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 8597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 8600d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 8613bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 86241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber); 8630d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 864cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 865cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 866cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 867cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 8680d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 869cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 8707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 8737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 874f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 8757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 8767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 877f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 8787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 8797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 88005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 88105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 88205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 88341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman stateToCommit->flags = 88441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask); 8857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 8867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 887f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 8887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 8897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 89005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 8917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 8927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 8930d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 8947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 8957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 8967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 8977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 8987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 89905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 9027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 90441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) { 90541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Unexpected sync point frame number found", mName.string()); 906cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 907cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 908cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 909cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 910cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 911cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 912cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 9137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 9147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 91505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 9197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 9207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 921792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 922792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 9237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 92505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 9267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 9277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 9317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 9327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 9337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 9347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 9357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 9387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 9397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 94113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 9421c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 9431c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 9447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 94505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 94605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 9477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 9487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 9497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 9501eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 95241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h); 953a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 954eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman if (sizeChanged) { 955cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 9569d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 95741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 95841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 95941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n" 96041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 96141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n", 96241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman this, getName().string(), mCurrentTransform, getEffectiveScalingMode(), c.active.w, 96341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman c.active.h, c.crop.left, c.crop.top, c.crop.right, c.crop.bottom, 96441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman c.crop.getWidth(), c.crop.getHeight(), c.requested.w, c.requested.h, s.active.w, 96541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman s.active.h, s.crop.left, s.crop.top, s.crop.right, s.crop.bottom, 96641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman s.crop.getWidth(), s.crop.getHeight(), s.requested.w, s.requested.h); 967a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 9682a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 9692a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 970eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setDefaultBufferSize(c.requested.w, c.requested.h); 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 972cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 973e392b55de711657d2a955b9785588d009b5e922dRobert Carr // Don't let Layer::doTransaction update the drawing state 974e392b55de711657d2a955b9785588d009b5e922dRobert Carr // if we have a pending resize, unless we are in fixed-size mode. 975e392b55de711657d2a955b9785588d009b5e922dRobert Carr // the drawing state will be updated only once we receive a buffer 976e392b55de711657d2a955b9785588d009b5e922dRobert Carr // with the correct size. 977e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 978e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In particular, we want to make sure the clip (which is part 979e392b55de711657d2a955b9785588d009b5e922dRobert Carr // of the geometry state) is latched together with the size but is 980e392b55de711657d2a955b9785588d009b5e922dRobert Carr // latched immediately when no resizing is involved. 981e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 982e392b55de711657d2a955b9785588d009b5e922dRobert Carr // If a sideband stream is attached, however, we want to skip this 983e392b55de711657d2a955b9785588d009b5e922dRobert Carr // optimization so that transactions aren't missed when a buffer 984e392b55de711657d2a955b9785588d009b5e922dRobert Carr // never arrives 985e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 986e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In the case that we don't have a buffer we ignore other factors 987e392b55de711657d2a955b9785588d009b5e922dRobert Carr // and avoid entering the resizePending state. At a high level the 988e392b55de711657d2a955b9785588d009b5e922dRobert Carr // resizePending state is to avoid applying the state of the new buffer 989e392b55de711657d2a955b9785588d009b5e922dRobert Carr // to the old buffer. However in the state where we don't have an old buffer 990e392b55de711657d2a955b9785588d009b5e922dRobert Carr // there is no such concern but we may still be being used as a parent layer. 99141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) && 99241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (mActiveBuffer != nullptr); 9930cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 9949e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 9950cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 9960cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 9970cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 9980cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 9997bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we apply various requested geometry states, depending on our 10007bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // latching configuration. See Layer.h for a detailed discussion of 10017bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // how geometry latching is controlled. 10027bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (!(flags & eDontUpdateGeometryState)) { 10037d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 10047bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 10057bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize 10067bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // mode, which causes attributes which normally latch regardless of scaling mode, 10077bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to be delayed. We copy the requested state to the active state making sure 10087bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to respect these rules (again see Layer.h for a detailed discussion). 10097bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10107bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // There is an awkward asymmetry in the handling of the crop states in the position 10117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // states, as can be seen below. Largely this arises from position and transform 10127bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // being stored in the same data structure while having different latching rules. 10137bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 10147bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 10157bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Careful that "c" and editCurrentState may not begin as equivalent due to 10167bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // applyPendingStates in the presence of deferred transactions. 10177bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mFreezeGeometryUpdates) { 101882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 101982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 102082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 102182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 102282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 102382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 102482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 102582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 102682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 102713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 102813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10291eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 103013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 103113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 103213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 103313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10341eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 103513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 103613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 103713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 103813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 103913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 10403dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 104141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE)); 104213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 104313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1044c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1045c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1046c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1047c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 10481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1049c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1050c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 105113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 105205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 105313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 105705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1058a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1059a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 106213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 106413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 106513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 106713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 106882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 10693dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 107013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 107269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 107369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 107469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 107569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 10763dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 10777bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 10787bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we directly update the active state 10797bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // unlike other setters, because we store it within 10807bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // the transform, but use different latching rules. 10817bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 108282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 108382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 10847bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 108569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 10867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 108713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 108813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 108913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 109082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 10911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 10921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 10931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 10941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 10951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 10961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 10971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 10981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 10991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 11001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 11011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 11021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1103ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 110441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.z == z) return false; 110513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 110613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 11077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1108db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1109db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1110db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1111db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1112db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1113db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1114db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1115db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1116db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 111813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 111913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 11201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1121db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1122db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1123db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1124db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1125db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1126db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1127db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1128db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1129db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1130db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1131db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1132db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1133db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1134db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1135db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) { 1136db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1137db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1138db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1139db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1140db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1141db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1142db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1143db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1144db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1145db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1146db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1147db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.z = z; 1148db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 11499ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote(); 11509ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw if (oldZOrderRelativeOf != nullptr) { 11519ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw oldZOrderRelativeOf->removeZOrderRelative(this); 11529ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw } 1153db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1154db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1155db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1156db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1157db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1158db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1159db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1160db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 116113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 116241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false; 116313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 116413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 11657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 116613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 116713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 116813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 117041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.color.a == alpha) return false; 117113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 117213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = alpha; 11737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 117413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 117513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 117613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 117713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 117813fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) { 117941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g && 118041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman color.b == mCurrentState.color.b) 118113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return false; 118213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 118313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.sequence++; 118413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.r = color.r; 118513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.g = color.g; 118613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.b = color.b; 118713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.modified = true; 118813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw setTransactionFlags(eTransactionNeeded); 118913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return true; 119013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 119113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 119213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 119313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 119441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 11957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 119613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 119713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 119813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 119913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 12002ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 12017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 120213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 120313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 120413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 120513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 120613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 120741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.flags == newFlags) return false; 120813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 120913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 12107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 12117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 121213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 121313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 121413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 121599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 121699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 121741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedCrop == crop) return false; 121813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 121999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 12207bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 122199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 122299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 12237bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12247bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 12257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 122613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 122713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 122813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 12298d5227b8416b099c884429312daf2d60496fa484Robert Carr 12308d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 123141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedFinalCrop == crop) return false; 1232acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 12338d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 12347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 12358d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 12368d5227b8416b099c884429312daf2d60496fa484Robert Carr } 12377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 12387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 1239acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1240acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1241acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1242acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 124313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1244c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 124541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (scalingMode == mOverrideScalingMode) return false; 1246c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 124782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1248c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1249c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1250c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 12512f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 125241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.appId = appId; 125341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.type = type; 125441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.modified = true; 125541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman setTransactionFlags(eTransactionNeeded); 12562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 12572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 125941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.layerStack == layerStack) return false; 126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 12627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1265a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1266a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1267bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 126841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.dataSpace == dataSpace) return false; 1269bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1270bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1271bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1272bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1273bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1274bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1275bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 1276532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 1277532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1278532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1279532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 12801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 1281e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu auto p = mDrawingParent.promote(); 12821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 12831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 12841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 12851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 12861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 12871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 128841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) { 12890d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 12907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 12917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 12927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 12937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 12947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 12950d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1296792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 12977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 12980d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 12990d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 130041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) { 13010d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 13020d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 13037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1305ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 13111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 1312e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& parent = mDrawingParent.promote(); 13131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 13141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 13151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 13171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 131941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const { 132013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 132113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 132213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 132313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 132413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 132503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 132603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 132703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 132813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 132913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 133013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 133113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 133313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 133413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 133513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 133613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 133713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 134013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 134113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 134213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 134313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 1344eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman setTransformHint(orientation); 134513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 134613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 134713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 134813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 134913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 135013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1351a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const { 1352a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerDebugInfo info; 1353a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const Layer::State& ds = getDrawingState(); 1354a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mName = getName(); 13551acbec7884a47f316005ba4f2b5e47c74317ee43chaviw sp<Layer> parent = getParent(); 1356a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); 1357a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mType = String8(getTypeId()); 1358a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mTransparentRegion = ds.activeTransparentRegion; 1359a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mVisibleRegion = visibleRegion; 1360a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mSurfaceDamageRegion = surfaceDamageRegion; 1361a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mLayerStack = getLayerStack(); 1362a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mX = ds.active.transform.tx(); 1363a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mY = ds.active.transform.ty(); 1364a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mZ = ds.z; 1365a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mWidth = ds.active.w; 1366a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mHeight = ds.active.h; 1367a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mCrop = ds.crop; 1368a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFinalCrop = ds.finalCrop; 136913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw info.mColor = ds.color; 1370a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFlags = ds.flags; 1371a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mPixelFormat = getPixelFormat(); 1372a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mDataSpace = getDataSpace(); 1373a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][0] = ds.active.transform[0][0]; 1374a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][1] = ds.active.transform[0][1]; 1375a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][0] = ds.active.transform[1][0]; 1376a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][1] = ds.active.transform[1][1]; 1377a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 1378a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita sp<const GraphicBuffer> activeBuffer = getActiveBuffer(); 1379a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (activeBuffer != 0) { 1380a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = activeBuffer->getWidth(); 1381a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = activeBuffer->getHeight(); 1382a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = activeBuffer->getStride(); 1383a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = activeBuffer->format; 1384a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } else { 1385a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = 0; 1386a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = 0; 1387a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = 0; 1388a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = 0; 1389a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 1390bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 1391a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mNumQueuedFrames = getQueuedFrameCount(); 1392a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mRefreshPending = isBufferLatched(); 1393a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mIsOpaque = isOpaque(ds); 1394a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mContentDirty = contentDirty; 1395a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return info; 1396d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 139783ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu 1398e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 1399e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1400e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1401e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 1402e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 1403e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 1404e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 1405e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 1406e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1407e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1408e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1409e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1410e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 1411e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 1412e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 1413e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1414e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1415e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 1416e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 1417e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 1418e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 1419e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 1420e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 1421e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 1422e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 1423e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 1424e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1425e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1426e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 1427e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1428e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 1429e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 14308c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck result.appendFormat(" %10d | ", layerState.z); 143141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str()); 1432e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 143341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom); 14345a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 143541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom); 1436e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1437e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 1438e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 1439e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1440e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1441d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 1442d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 144382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 144482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 1445d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 1446d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 144725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 144825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 14496547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 14506547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 14516547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 14526547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1453d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 1454d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 1455d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 1456d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 1457d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 145841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this); 1459d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1460d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 1461d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 1462d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 1463d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 14645ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 14655ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 14665ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 14675ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 14685ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 14693890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 147041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman FrameEventHistoryDelta* outDelta) { 1471d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1472d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 1473fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // If there are any unsignaled fences in the aquire timeline at this 1474fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // point, the previously queued frame hasn't been latched yet. Go ahead 1475fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // and try to get the signal time here so the syscall is taken out of 1476fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // the main thread's critical path. 1477fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mAcquireTimeline.updateSignalTimes(); 1478fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // Push the new fence after updating since it's likely still pending. 14793d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 1480d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 1481d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 148240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 14833890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 14843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 1485d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 148640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 1487e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 148898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const { 148998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu size_t count = 0; 149098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu for (const sp<Layer>& child : mCurrentChildren) { 149198f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu count += 1 + child->getChildrenCount(); 149298f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu } 149398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu return count; 149498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu} 149598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu 14961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 14971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 14981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 14991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 15021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 15031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 15041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15061db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 15071db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 15081db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 15091db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 15101db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15111db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15121db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 15131db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 15141db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 15151db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 15161db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 15171db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15181db73f66624e7d151710483dd58e03eed672f064Robert Carr 15191db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 1520e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu newParent->addChild(child); 15211db73f66624e7d151710483dd58e03eed672f064Robert Carr 15221db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 15231db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 15241db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 15251db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15261db73f66624e7d151710483dd58e03eed672f064Robert Carr } 15271db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 15281db73f66624e7d151710483dd58e03eed672f064Robert Carr 15291db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 15301db73f66624e7d151710483dd58e03eed672f064Robert Carr} 15311db73f66624e7d151710483dd58e03eed672f064Robert Carr 1532f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) { 1533f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (newParentHandle == nullptr) { 15340617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 15350617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 15360617894190ea0c3ee50889bee1d4df0f369b0761chaviw 15370617894190ea0c3ee50889bee1d4df0f369b0761chaviw auto handle = static_cast<Handle*>(newParentHandle.get()); 15380617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Layer> newParent = handle->owner.promote(); 15390617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (newParent == nullptr) { 15400617894190ea0c3ee50889bee1d4df0f369b0761chaviw ALOGE("Unable to promote Layer handle"); 15410617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 15420617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 15430617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1544f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Layer> parent = getParent(); 1545f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (parent != nullptr) { 1546f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw parent->removeChild(this); 15470617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 1548f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw newParent->addChild(this); 15490617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1550f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Client> client(mClientRef.promote()); 15510617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Client> newParentClient(newParent->mClientRef.promote()); 15520617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1553f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (client != newParentClient) { 1554f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw client->setParentLayer(newParent); 15550617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 15560617894190ea0c3ee50889bee1d4df0f369b0761chaviw 15570617894190ea0c3ee50889bee1d4df0f369b0761chaviw return true; 15580617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 15590617894190ea0c3ee50889bee1d4df0f369b0761chaviw 15609524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 1561412903fce3a93f411c85c54375a1851bfb370400Dan Stoza traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) { 15629524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (child == this) { 15639524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return; 15649524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 15659524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 1566161410b01a37bcc5522d8e91fe0a743989c86e70chaviw sp<Client> parentClient = mClientRef.promote(); 15679524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 1568161410b01a37bcc5522d8e91fe0a743989c86e70chaviw if (client != nullptr && parentClient != client) { 15699524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr client->detachLayer(child); 15709524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 15719524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr }); 15729524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 15739524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 15749524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 15759524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 15761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 1577e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mCurrentParent = layer; 15781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 15811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 15821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 15831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 15841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 15861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 15871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 15881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 15891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 15901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 15921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 15931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 15941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 159641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList( 159741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LayerVector::StateSet stateSet) { 1598412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 1599412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 1600412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1601412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1602412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 1603412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 1604412903fce3a93f411c85c54375a1851bfb370400Dan Stoza if (state.zOrderRelatives.size() == 0) { 1605412903fce3a93f411c85c54375a1851bfb370400Dan Stoza return children; 1606db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1607db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 1608db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1609412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 1610db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 1611db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1612db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 1613db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1614db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1615db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1616412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 1617db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 1618db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1619db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1620db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 1621db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1622db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1624db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 16251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1626412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 1627412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 1628db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 1630db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1631db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1632db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 16331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 1634db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1635412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 16361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1637412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 1638db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1639db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1640412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 16411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 16441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1645db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 16461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1647412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 1648412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 1649412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 1650db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 16511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 1652bf32499a90b40e102c59d588f2ee34d9a67e5664Joel Galenson for (i = int32_t(list.size()) - 1; i >= 0; i--) { 1653db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1654db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 16551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 16561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1657412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 16581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1659412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 166041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (; i >= 0; i--) { 1661db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1662412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 16631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1666a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/** 1667a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers. 1668a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */ 1669a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet, 1670a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector::Visitor& visitor) { 1671a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1672a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1673a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 1674a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw size_t i = 0; 1675a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 1676a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 1677a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw if (relative->getZ() >= 0) { 1678a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw break; 1679a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1680a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 1681a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1682a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw visitor(this); 1683a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 1684a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 1685a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 1686a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 1687a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw} 1688a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 16891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 16901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 1691e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 16921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 16931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 16949b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 16959b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 16969b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 16979b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 16989b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 16999b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 17000a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu if (p->isFixedSize() && p->mActiveBuffer != nullptr) { 17011725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 17021725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 17031725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 17041725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getWidth(); 17051725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getHeight(); 17061725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 17071725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getWidth(); 17081725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getHeight(); 17091725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 171041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth); 171141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight); 17129b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 17139b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 17149b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 17159b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 17161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 17181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 172013fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const { 1721e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 17226452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 172313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf; 172413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return parentAlpha * getDrawingState().color.a; 17256452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 17266452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 172713fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const { 172813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw const half4 color(getDrawingState().color); 172913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return half4(color.r, color.g, color.b, getAlpha()); 17306452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 17316452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 17321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 17331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 17341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 17351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 17361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 1738e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mDrawingParent = mCurrentParent; 17391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 17411d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) { 17421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 17431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 17441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const State& state = useDrawing ? mDrawingState : mCurrentState; 17451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform = state.active.transform; 17471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform = getTransform(); 17481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_id(sequence); 17501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_name(getName().c_str()); 17511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_type(String8(getTypeId())); 17521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const auto& child : children) { 17541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_children(child->sequence); 17551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 17561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 17581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw sp<Layer> strongRelative = weakRelative.promote(); 17591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (strongRelative != nullptr) { 17601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_relatives(strongRelative->sequence); 17611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 17621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 17631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.activeTransparentRegion, 17651d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->mutable_transparent_region()); 17661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region()); 17671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region()); 17681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_layer_stack(getLayerStack()); 17701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z(state.z); 17711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* position = layerInfo->mutable_position(); 17731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_x(transform.tx()); 17741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_y(transform.ty()); 17751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* requestedPosition = layerInfo->mutable_requested_position(); 17771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_x(requestedTransform.tx()); 17781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_y(requestedTransform.ty()); 17791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw SizeProto* size = layerInfo->mutable_size(); 17811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_w(state.active.w); 17821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_h(state.active.h); 17831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop()); 17851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop()); 17861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_is_opaque(isOpaque(state)); 17881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_invalidate(contentDirty); 17891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_dataspace(dataspaceDetails(getDataSpace())); 17901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); 17911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color()); 17921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color()); 17931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_flags(state.flags); 17941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); 17961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform()); 17971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 17981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto parent = getParent(); 17991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (parent != nullptr) { 18001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_parent(parent->sequence); 18011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); 18041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (zOrderRelativeOf != nullptr) { 18051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); 18061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto activeBuffer = getActiveBuffer(); 18091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (activeBuffer != nullptr) { 18101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(activeBuffer, layerInfo->mutable_active_buffer()); 18111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 18121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 18131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_queued_frames(getQueuedFrameCount()); 18141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_refresh_pending(isBufferLatched()); 18151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} 18161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 181713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 181813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 18193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 18223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 18233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 18263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 18273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 1828