Layer.cpp revision 8b3871addb9bbd5776f4ed59e67af2baa9c583fd
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), 720c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mSurfaceFlingerConsumer(NULL), 7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mName(name), 7513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 78a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 79399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 80a9347647eca3101c014be902b713772de3977d87Mathias Agopian mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 82c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 83a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 84cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 8582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 8613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 8713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 885cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition(false), 919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 94a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 95a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 96a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 9865476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 9982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 10041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFreezeGeometryUpdates(false) { 1019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 102a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 10541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden; 10641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque; 10741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure; 1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1094d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 110f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza mTransactionName = String8("TX - ") + mName; 1114d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1124d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1140c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mCurrentState.flags = layerFlags; 1153dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 116b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 117b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1187bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedFinalCrop = mCurrentState.finalCrop; 1197bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mCurrentState.requestedCrop = mCurrentState.crop; 1204d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 12113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = 1.0f; 1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 125bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1262f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1272f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1316547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 13741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman nsecs_t displayPeriod = flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1396547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson 1410a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson CompositorTiming compositorTiming; 1420a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson flinger->getCompositorTiming(&compositorTiming); 1430a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson mFrameEventHistory.initializeCompositorTiming(compositorTiming); 144e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 145e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 14641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::onFirstRef() {} 14796f0819f81293076e652792794a961543e6750d7Mathias Agopian 1484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1496547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 15096f0819f81293076e652792794a961543e6750d7Mathias Agopian} 15196f0819f81293076e652792794a961543e6750d7Mathias Agopian 15213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 15313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 15413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 15513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.empty()) { 1599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 1609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1610c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman if (mSurfaceFlingerConsumer) { 1620c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 1630c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman } 1649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 1659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 16741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman HWComposer::HWCLayerInterface* layer) { 1689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer) { 1699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer->onDisplayed(); 1709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 1719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 1739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 17413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 175c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemovedFromCurrentState() { 176c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mCurrentState to mLayersPendingRemoval 177c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 1788b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw mPendingRemoval = true; 1798b3871addb9bbd5776f4ed59e67af2baa9c583fdchaviw 1805edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1815edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1825edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr if (strongRelative != nullptr) { 1835edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr strongRelative->removeZOrderRelative(this); 184c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu mFlinger->setTransactionFlags(eTraversalNeeded); 1855edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1865edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1875edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr } 1885edb1add8b35c0d63645cb53fb175d459a689da5Robert Carr 189c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu for (const auto& child : mCurrentChildren) { 190c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu child->onRemovedFromCurrentState(); 191c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu } 192c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu} 1933851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 194c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wuvoid Layer::onRemoved() { 195c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu // the layer is removed from SF mLayersPendingRemoval 196c665702cea06c5c42360b7f66fed1693127e6680Chia-I Wu 1970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman if (mSurfaceFlingerConsumer) { 1980c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mSurfaceFlingerConsumer->abandon(); 1990c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman } 2003851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#ifdef USE_HWC2 201b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyAllHwcLayers(); 2023851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu#endif 2033851225fddb6f1755a8034aa7a9f9ae7397b56a9Chia-I Wu 2041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 2051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 2061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 20748d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 208cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 20913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 21113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 21213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2131eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 21413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 21513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 21613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 21713fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::getPremultipledAlpha() const { 21813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return mPremultipliedAlpha; 21913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 22013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 2214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 2224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 2234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 224582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 225582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 22613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 22713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 22813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 22913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 230b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#ifdef USE_HWC2 231b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasbool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { 23241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Already have a layer for hwcId %d", hwcId); 233b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWC2::Layer* layer = hwc->createLayer(hwcId); 234b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (!layer) { 235b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return false; 236b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 237b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas HWCInfo& hwcInfo = mHwcLayers[hwcId]; 238b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc = hwc; 239b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.layer = layer; 240b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas layer->setLayerDestroyedListener( 24141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman [this, hwcId](HWC2::Layer* /*layer*/) { mHwcLayers.erase(hwcId); }); 242b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return true; 243b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 244b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 245b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyHwcLayer(int32_t hwcId) { 246b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas if (mHwcLayers.count(hwcId) == 0) { 247b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas return; 248b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 249b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas auto& hwcInfo = mHwcLayers[hwcId]; 25041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer"); 251b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer"); 252b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer); 253b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // The layer destroyed listener should have cleared the entry from 254b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas // mHwcLayers. Verify that. 25541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers"); 256b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 257b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 258b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomasvoid Layer::destroyAllHwcLayers() { 259b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas size_t numLayers = mHwcLayers.size(); 260b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas for (size_t i = 0; i < numLayers; ++i) { 261b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(mHwcLayers.empty(), "destroyAllHwcLayers failed"); 262b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas destroyHwcLayer(mHwcLayers.begin()->first); 263b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas } 264b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(), 26541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "All hardware composer layers should have been destroyed"); 266b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas} 267b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#endif 268b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 269a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 270a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 271a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 272f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 273f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 274a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 275f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 276a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 277a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 278a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 279f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 280a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 2814fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 282f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 283f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 284f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 285f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 286f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 287f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 288f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 289f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 290f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 291f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 292f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 293f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 294f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 295f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 2961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 2971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 2981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 2991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 3011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 3021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 30741b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr if (!s.finalCrop.isEmpty()) { 30841b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr win.intersect(s.finalCrop, &win); 30941b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr } 31041b08b5e97b04d726fb8bbacddbce563a1c890f9Robert Carr 311e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const sp<Layer>& p = mDrawingParent.promote(); 3121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 3131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 3141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 3151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 3161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 3171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 3181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 3191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 3201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 3211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 3231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 3241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 3271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 3281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 3291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 3321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 3331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 33413127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 3351eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 3366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 3376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 3386c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 3396c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 3406c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 342b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 343b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 344b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 3461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 348e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 3491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 350de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // Look in computeScreenBounds recursive call for explanation of 351de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr // why we pass false here. 352de9ec44905aca4f0ef4f473065b0e7d93d7e1cfeRobert Carr bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 3531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 3591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 3601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3626c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 3636c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 36413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 36513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 367b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 36813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 3691eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 37013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 37113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 37213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 3736b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 3746b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 3756b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 3766b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 3770e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3780e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 379b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 380df7867f3f488222f3708fb00415fbf0fcf74eb97Chia-I Wu activeCrop.intersect(s.crop, &activeCrop); 3810e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 3820e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 385acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 386acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 387acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 388b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 38941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(s.finalCrop, &activeCrop)) { 390acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 391acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 392acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 393b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 394b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw const auto& p = mDrawingParent.promote(); 395b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw if (p != nullptr) { 396b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw auto parentCrop = p->computeInitialCrop(hw); 397b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw activeCrop.intersect(parentCrop, &activeCrop); 398b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw } 399b1154d14ac8055f77e861c7ec8ef9c9f63c3a899chaviw 4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4035a423eaa86f4c990afcef8c55e3949d0872068b4Dan StozaFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 4041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 4051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 4065a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect crop = getContentCrop().toFloatRect(); 4071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 4091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 4101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 4121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 4131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 4151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 41613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 41728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 41828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 41928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 42028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 42128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 42228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 423acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 424acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 425acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 42613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 427f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 428f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 429f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 432acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 433acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 434cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 435acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 436021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 437021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 438acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 43941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform(); 440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 441acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 44241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 44313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 44541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation(); 446acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 451acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 45941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 461acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 46441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h); 46513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 46741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float xScale = crop.getWidth() / float(winWidth); 468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 46913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 47041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetL = winCrop.left * xScale; 47141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetT = winCrop.top * yScale; 47241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float insetR = (winWidth - winCrop.right) * xScale; 473acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 474acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 47541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.left += insetL; 47641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.top += insetT; 47741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman crop.right -= insetR; 478acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 47913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 48013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 48113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 48213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 4839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 484ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 4859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 48641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setGeometry(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) 4879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 488a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 4899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 4909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 4919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 4929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 4939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setDefaultState(); 4949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 495a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 4963e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 4979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 4989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 4999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 5019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 5029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 5059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(false); 5079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (isSecure() && !hw->isSecure()) { 5099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 5109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 512dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 51313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 5141eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 5159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 516ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto blendMode = HWC2::BlendMode::None; 5176452f12c95e855a96ab8f690f28914cd37de762bRobert Carr if (!isOpaque(s) || getAlpha() != 1.0f) { 51841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman blendMode = 51941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 5209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 521ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman auto error = hwcLayer->setBlendMode(blendMode); 52241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 52341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set blend mode %s:" 52441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " %s (%d)", 52541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(), 52641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 5279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 52813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw if (!isOpaque(s) || getAlpha() != 1.0f) { 52941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman layer.setBlending(mPremultipliedAlpha ? HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE); 5309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 53213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 53313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 53413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 5356c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 5361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 537b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 538b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 5391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 5409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 54141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 5429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 54341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 5449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 54828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 54928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 55028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 55128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 55228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 55328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 55441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 555acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5576c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 5586c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 55941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h)); 56041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom)); 56141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman activeTransparentRegion.orSelf( 56241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom)); 5636c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 5641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 5651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 566b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 56741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!frame.intersect(s.finalCrop, &frame)) { 568acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 569acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 570acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 572acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 573acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 574acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 5769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 577ecf0fa5340c54757870881c5d24eb331c517d78cDavid Reveman error = hwcLayer->setDisplayFrame(transformedFrame); 578e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 57941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(), 58041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.left, transformedFrame.top, transformedFrame.right, 58141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error)); 582e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 583e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 584e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5865a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 5879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 588e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 589e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 59041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 59141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom, 59241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 593e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 594e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 595e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 5969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 59713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw float alpha = static_cast<float>(getAlpha()); 5986452f12c95e855a96ab8f690f28914cd37de762bRobert Carr error = hwcLayer->setPlaneAlpha(alpha); 59941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 60041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set plane alpha %.3f: " 60141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 60241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error)); 6039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 604ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 60541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z, 60641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 6072f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 6082a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int type = s.type; 6092a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk int appId = s.appId; 610e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu sp<Layer> parent = mDrawingParent.promote(); 6112a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk if (parent.get()) { 6122a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk auto& parentState = parent->getDrawingState(); 6132a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk type = parentState.type; 6142a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk appId = parentState.appId; 6152a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk } 6162a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk 6172a58963cd96546bc645d05c3d1421a506f42bb64Albert Chaulk error = hwcLayer->setInfo(type, appId); 61841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(), 61941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!frame.intersect(hw->getViewport(), &frame)) { 6229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.clear(); 6239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 6259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setFrame(tr.transform(frame)); 6269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setCrop(computeCrop(hw)); 62741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman layer.setPlaneAlpha(static_cast<uint8_t>(std::round(255.0f * getAlpha()))); 6289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 6299f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 63029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 63129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 63229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 63329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 63429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 63529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 63629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 63729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 63829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 6391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 640c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 641cae605cd5668f8107e340ad8a672c7f034147401Robert Carr if (getTransformToDisplayInverse()) { 642c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 643021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 644021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 645c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 64641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform(); 647c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 648c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 64941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; 650c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 651cae605cd5668f8107e340ad8a672c7f034147401Robert Carr 652cae605cd5668f8107e340ad8a672c7f034147401Robert Carr /* 653cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * Here we cancel out the orientation component of the WM transform. 654cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * The scaling and translate components are already included in our bounds 655cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * computation so it's enough to just omit it in the composition. 656cae605cd5668f8107e340ad8a672c7f034147401Robert Carr * See comment in onDraw with ref to b/36727915 for why. 657cae605cd5668f8107e340ad8a672c7f034147401Robert Carr */ 658cae605cd5668f8107e340ad8a672c7f034147401Robert Carr transform = Transform(invTransform) * tr * bufferOrientation; 659c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 66029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 66129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 66213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 6639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 6649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 6659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 6669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 6689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 6699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 67041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 67141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set transform %s: " 67241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "%s (%d)", 67341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(transform).c_str(), to_string(error).c_str(), 67441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (orientation & Transform::ROT_INVALID) { 6789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we can only handle simple transformation 6799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 6809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 6819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setTransform(orientation); 6829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 684a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 685a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 6869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply this display's projection's viewport to the visible region 6989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // before giving it to the HWC HAL. 6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr = displayDevice->getTransform(); 7009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& viewport = displayDevice->getViewport(); 7019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Region visible = tr.transform(visibleRegion.intersect(viewport)); 7029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 703aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcInfo = mHwcLayers[hwcId]; 704aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu auto& hwcLayer = hwcInfo.layer; 7059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setVisibleRegion(visible); 7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 70841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza visible.dump(LOG_TAG); 7109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 7139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 71541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza surfaceDamageRegion.dump(LOG_TAG); 7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7190f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Sideband layers 7209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mSidebandStream.get()) { 7210f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Sideband); 7220f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Sideband composition", mName.string()); 7230f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 7249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 72541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", mName.string(), 72641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mSidebandStream->handle(), to_string(error).c_str(), static_cast<int32_t>(error)); 7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7280f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7310a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // Client layers 732aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu if (hwcInfo.forceClientComposition || 73341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) { 7340f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Client composition", mName.string()); 7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Client); 7360f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 7370f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 7380f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 7390a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // SolidColor layers 7400a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (mActiveBuffer == nullptr) { 7410a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza setCompositionType(hwcId, HWC2::Composition::SolidColor); 742c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 74313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw half4 color = getColor(); 74441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman error = hwcLayer->setColor({static_cast<uint8_t>(std::round(255.0f * color.r)), 74541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<uint8_t>(std::round(255.0f * color.g)), 74641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<uint8_t>(std::round(255.0f * color.b)), 255}); 7470a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (error != HWC2::Error::None) { 74841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), to_string(error).c_str(), 74941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 7500a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 751c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 752c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // Clear out the transform, because it doesn't make sense absent a 753c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // source buffer 754c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza error = hwcLayer->setTransform(HWC2::Transform::None); 755c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza if (error != HWC2::Error::None) { 756c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), 75741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 758c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza } 759c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 7600a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza return; 7610a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 7620a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza 7630f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Device or Cursor layers 7640f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (mPotentialCursor) { 7650f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Cursor composition", mName.string()); 7660f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Cursor); 7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting Device composition", mName.string()); 7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Device); 7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7710f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 772bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace); 773bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter error = hwcLayer->setDataspace(mCurrentState.dataSpace); 774bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (error != HWC2::Error::None) { 77541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), mCurrentState.dataSpace, 77641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 777bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter } 778bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 77906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu uint32_t hwcSlot = 0; 7801f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara sp<GraphicBuffer> hwcBuffer; 78141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman hwcInfo.bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, &hwcSlot, &hwcBuffer); 78206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu 7830f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 7841f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara error = hwcLayer->setBuffer(hwcSlot, hwcBuffer, acquireFence); 7850f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (error != HWC2::Error::None) { 78641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), mActiveBuffer->handle, 78741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman to_string(error).c_str(), static_cast<int32_t>(error)); 7880f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 7899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7909551fd3acc2b0bbdfed02ed2bf97c5e560933abeCourtney Goeltzenleuchter 7919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 79341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman HWComposer::HWCLayerInterface& layer) { 7949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we have to set the visible region on every frame because 7959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we currently free it during onLayerDisplayed(), which is called 7969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // after HWComposer::commit() -- every frame. 7979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Apply this display's projection's viewport to the visible region 7989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // before giving it to the HWC HAL. 7999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr = hw->getTransform(); 8009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 8019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setVisibleRegionScreen(visible); 8029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSurfaceDamage(surfaceDamageRegion); 8039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); 804ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 8059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mSidebandStream.get()) { 8069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSidebandStream(mSidebandStream); 8079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // NOTE: buffer can be NULL if the client never drew into this 8099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // layer yet, or if we ran out of memory 8109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBuffer(mActiveBuffer); 8119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 8149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 8169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 8179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 81841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mHwcLayers.count(hwcId) == 0 || getCompositionType(hwcId) != HWC2::Composition::Cursor) { 8199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 8209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 8239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 824dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 8259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 8269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 8279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 828b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 829b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 8309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 8329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 8331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 8349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 835b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 836b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 837acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 8389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 8399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 8409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 84141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, position.top); 84241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 84341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set cursor position " 84441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "to (%d, %d): %s (%d)", 84541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), position.left, position.top, to_string(error).c_str(), 84641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 8479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 8489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 8499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 85041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman HWComposer::HWCLayerInterface& layer) { 8519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fenceFd = -1; 8529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // TODO: there is a possible optimization here: we only need to set the 8549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // acquire fence the first time a new buffer is acquired on EACH display. 8559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 85641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (layer.getCompositionType() == HWC_OVERLAY || 85741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 8589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 8599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fence->isValid()) { 8609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard fenceFd = fence->dup(); 8619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fenceFd == -1) { 8629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("failed to dup layer fence, skipping sync: %d", errno); 8639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setAcquireFenceFd(fenceFd); 8679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 86941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid SodmanRect Layer::getPosition(const sp<const DisplayDevice>& hw) { 8709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this gives us only the "orientation" component of the transform 8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const State& s(getCurrentState()); 8729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // apply the layer's transform, followed by the display's global transform 8749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // here we're guaranteed that the layer's transform preserves rects 8759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect win(s.active.w, s.active.h); 8769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.crop.isEmpty()) { 8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard win.intersect(s.crop, &win); 8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // subtract the transparent region and snap to the bounds 8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect bounds = reduce(win, s.activeTransparentRegion); 8811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(hw->getViewport(), &frame); 8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.finalCrop.isEmpty()) { 8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(s.finalCrop, &frame); 8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return Rect(tr.transform(frame)); 8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 89003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 89113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 89213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 89313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 89413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 895a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, const Region& clip) const { 896a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, clip, false); 89713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 89813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 899a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const { 900a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform); 90113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 90213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 903a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::draw(const RenderArea& renderArea) const { 904a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw onDraw(renderArea, Region(renderArea.getBounds()), false); 905c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 906c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 90741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue, 90841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float alpha) const { 90919733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 910a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw computeGeometry(renderArea, mMesh, false); 91119733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 91219733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 91313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 91413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 915a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::clearWithOpenGL(const RenderArea& renderArea) const { 91641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman clearWithOpenGL(renderArea, 0, 0, 0, 0); 91713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 91813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 9199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 92041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) { 9219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 9229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 9239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 9249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 9269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 92741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(), 92841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int>(callIntoHwc)); 9299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 9309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 9319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 9329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 9339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 93441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE_IF(error != HWC2::Error::None, 93541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Failed to set " 93641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "composition type %s: %s (%d)", 93741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), to_string(type).c_str(), to_string(error).c_str(), 93841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman static_cast<int32_t>(error)); 9399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 9439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 944ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 945ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 946ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 947ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 948ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 9499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 950ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 9519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 9529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 9549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 9569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 9579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 9589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 9599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 9609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 9629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 9649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 9659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 9669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 9679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 9689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 9699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 9709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 973cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 974cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 975cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 976cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 977cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 9787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 979cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 980cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 981cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 982cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 9837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 9847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 98613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 98713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 98813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 98913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 99013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 99113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 99213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 99313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 99413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 99513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 99613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 997acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 998acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 999acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 1000acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1001acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 1002acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 1003acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1004acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 1005acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 1006acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1007acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 1008acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 1009acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1010acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 1011acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1012a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh, 1013a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool useIdentityTransform) const { 10141eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1015a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const Transform renderAreaTransform(renderArea.getTransform()); 1016a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const uint32_t height = renderArea.getHeight(); 10171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 10183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1019acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 1020acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 1021acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 1022acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 1023acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 10241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 1025acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 10261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 10271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 10281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 10291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 1030acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1031acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1032b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1033b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 1034b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 1035b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 1036b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 1037acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1038acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1039ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 1040a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[0] = renderAreaTransform.transform(lt); 1041a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[1] = renderAreaTransform.transform(lb); 1042a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[2] = renderAreaTransform.transform(rb); 1043a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[3] = renderAreaTransform.transform(rt); 104441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (size_t i = 0; i < 4; i++) { 1045a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw position[i].y = height - position[i].y; 104613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 104713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1048ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 104941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanbool Layer::isSecure() const { 1050231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 1051231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 1052231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 1053231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 105413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 105513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 105613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 105713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 105813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 105913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 106013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 106113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 106213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 106441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) { 106513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 106613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 106713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 106813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 106913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 107013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 107113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 10747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 10757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 10767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 10777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 10787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 10797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 10800d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mCurrentState.barrierLayer != nullptr) { 10810d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote(); 10820d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer == nullptr) { 10830d48072f6047140119ff194c1194ce402fca2c0bRobert Carr ALOGE("[%s] Unable to promote barrier Layer.", mName.string()); 10847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 10857dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 10867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 10870d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 10883bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 108941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber); 10900d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (barrierLayer->addSyncPoint(syncPoint)) { 1091cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 1092cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1093cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 1094cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 10950d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1096cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 10977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 10987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 10997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 11007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 1101f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 11027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 1104f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 11057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 11067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 110705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 110805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 110905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 111041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman stateToCommit->flags = 111141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (oldFlags & ~stateToCommit->mask) | (stateToCommit->flags & stateToCommit->mask); 11127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 11137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 1114f7ba41abeb819e915997b4612a7af8c685d1fe3cDan Stoza ATRACE_INT(mTransactionName.string(), mPendingStates.size()); 11157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 11167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 111705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 11187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 11197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 11200d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (mPendingStates[0].barrierLayer != nullptr) { 11217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 11227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 11237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 11247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 11257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 112605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 11277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 11287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 11297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 113141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) { 113241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGE("[%s] Unexpected sync point frame number found", mName.string()); 1133cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1134cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 1135cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 1136cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 1137cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 1138cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1139cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 11407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 11417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 114205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 11437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 11447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 11457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 11467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 11477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 1148792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 1149792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 11507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 115205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 11537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 11547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 11577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 11587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 11597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 11607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 11617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 11627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 11647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 11657dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 11667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 11677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 116813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 11691c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 11701c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 11717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 117205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 117305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 11747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 11757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 11767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 11771eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h); 1180a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 11810c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman if (mSurfaceFlingerConsumer && sizeChanged) { 1182cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 11839d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 118441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 118541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 118641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n" 118741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 118841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman " requested={ wh={%4u,%4u} }}\n", 118941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman this, getName().string(), mCurrentTransform, getEffectiveScalingMode(), c.active.w, 119041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman c.active.h, c.crop.left, c.crop.top, c.crop.right, c.crop.bottom, 119141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman c.crop.getWidth(), c.crop.getHeight(), c.requested.w, c.requested.h, s.active.w, 119241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman s.active.h, s.crop.left, s.crop.top, s.crop.right, s.crop.bottom, 119341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman s.crop.getWidth(), s.crop.getHeight(), s.requested.w, s.requested.h); 1194a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 11952a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 11962a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 119741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mSurfaceFlingerConsumer->setDefaultBufferSize(c.requested.w, c.requested.h); 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1199cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 1200e392b55de711657d2a955b9785588d009b5e922dRobert Carr // Don't let Layer::doTransaction update the drawing state 1201e392b55de711657d2a955b9785588d009b5e922dRobert Carr // if we have a pending resize, unless we are in fixed-size mode. 1202e392b55de711657d2a955b9785588d009b5e922dRobert Carr // the drawing state will be updated only once we receive a buffer 1203e392b55de711657d2a955b9785588d009b5e922dRobert Carr // with the correct size. 1204e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1205e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In particular, we want to make sure the clip (which is part 1206e392b55de711657d2a955b9785588d009b5e922dRobert Carr // of the geometry state) is latched together with the size but is 1207e392b55de711657d2a955b9785588d009b5e922dRobert Carr // latched immediately when no resizing is involved. 1208e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1209e392b55de711657d2a955b9785588d009b5e922dRobert Carr // If a sideband stream is attached, however, we want to skip this 1210e392b55de711657d2a955b9785588d009b5e922dRobert Carr // optimization so that transactions aren't missed when a buffer 1211e392b55de711657d2a955b9785588d009b5e922dRobert Carr // never arrives 1212e392b55de711657d2a955b9785588d009b5e922dRobert Carr // 1213e392b55de711657d2a955b9785588d009b5e922dRobert Carr // In the case that we don't have a buffer we ignore other factors 1214e392b55de711657d2a955b9785588d009b5e922dRobert Carr // and avoid entering the resizePending state. At a high level the 1215e392b55de711657d2a955b9785588d009b5e922dRobert Carr // resizePending state is to avoid applying the state of the new buffer 1216e392b55de711657d2a955b9785588d009b5e922dRobert Carr // to the old buffer. However in the state where we don't have an old buffer 1217e392b55de711657d2a955b9785588d009b5e922dRobert Carr // there is no such concern but we may still be being used as a parent layer. 121841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) && 121941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman (mActiveBuffer != nullptr); 12200cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 12219e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 12220cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 12230cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 12240cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 12250cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 12267bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we apply various requested geometry states, depending on our 12277bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // latching configuration. See Layer.h for a detailed discussion of 12287bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // how geometry latching is controlled. 12297bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (!(flags & eDontUpdateGeometryState)) { 12307d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 12317bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 12327bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize 12337bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // mode, which causes attributes which normally latch regardless of scaling mode, 12347bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to be delayed. We copy the requested state to the active state making sure 12357bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // to respect these rules (again see Layer.h for a detailed discussion). 12367bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 12377bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // There is an awkward asymmetry in the handling of the crop states in the position 12387bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // states, as can be seen below. Largely this arises from position and transform 12397bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // being stored in the same data structure while having different latching rules. 12407bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 12417bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // 12427bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Careful that "c" and editCurrentState may not begin as equivalent due to 12437bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // applyPendingStates in the presence of deferred transactions. 12447bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (mFreezeGeometryUpdates) { 124582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 124682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 124782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 124882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 124982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 125082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 125182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 125282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 125382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 12561eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 12611eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 126513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 126613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 12673dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 126841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE)); 126913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 127013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1271c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1272c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1273c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1274c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 12751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1276c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1277c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 127813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 127905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 128013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 128305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 128405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1285a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1286a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 128813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 128913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 129013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 129113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 129213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 129313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 129413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 129582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 12963dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 129713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 129813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 129969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 130069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 130169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 130269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 13033dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 13047bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 13057bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // Here we directly update the active state 13067bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // unlike other setters, because we store it within 13077bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // the transform, but use different latching rules. 13087bf247e2db180da661b18084d50e0b389686fc0cRobert Carr // b/38182305 130982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 131082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 13117bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 131269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 13137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 131413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 131513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 131613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 131782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 13191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 13201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 13211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 13221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 13241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 13251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 13261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 13271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 13281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 13291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1330ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 133141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.z == z) return false; 133213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 133313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 13347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 1335db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1336db66e627ad8904491e384c64f82fc77a939b9705Robert Carr // Discard all relative layering. 1337db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (mCurrentState.zOrderRelativeOf != nullptr) { 1338db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote(); 1339db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1340db66e627ad8904491e384c64f82fc77a939b9705Robert Carr strongRelative->removeZOrderRelative(this); 1341db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1342db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = nullptr; 1343db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 134413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 134513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 134613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 13471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1348db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::removeZOrderRelative(const wp<Layer>& relative) { 1349db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.remove(relative); 1350db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1351db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1352db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1353db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1354db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1355db66e627ad8904491e384c64f82fc77a939b9705Robert Carrvoid Layer::addZOrderRelative(const wp<Layer>& relative) { 1356db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelatives.add(relative); 1357db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1358db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1359db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1360db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1361db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1362db66e627ad8904491e384c64f82fc77a939b9705Robert Carrbool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) { 1363db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); 1364db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (handle == nullptr) { 1365db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1366db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1367db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> relative = handle->owner.promote(); 1368db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative == nullptr) { 1369db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return false; 1370db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1371db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1372db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.sequence++; 1373db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.modified = true; 1374db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.z = z; 1375db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 13769ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote(); 13779ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw if (oldZOrderRelativeOf != nullptr) { 13789ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw oldZOrderRelativeOf->removeZOrderRelative(this); 13799ab4bd13bcd32cbe2f334cccce0a4d8cb22e14e7chaviw } 1380db66e627ad8904491e384c64f82fc77a939b9705Robert Carr mCurrentState.zOrderRelativeOf = relative; 1381db66e627ad8904491e384c64f82fc77a939b9705Robert Carr relative->addZOrderRelative(this); 1382db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1383db66e627ad8904491e384c64f82fc77a939b9705Robert Carr setTransactionFlags(eTransactionNeeded); 1384db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1385db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return true; 1386db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1387db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 138941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false; 139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 13927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 13969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 139741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.color.a == alpha) return false; 139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 139913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.a = alpha; 14007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 140113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 140213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 140313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 140413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 140513fdc49516d17f41e64e62e73c313b0928bf13ccchaviwbool Layer::setColor(const half3& color) { 140641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g && 140741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman color.b == mCurrentState.color.b) 140813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return false; 140913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 141013fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.sequence++; 141113fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.r = color.r; 141213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.g = color.g; 141313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.color.b = color.b; 141413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw mCurrentState.modified = true; 141513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw setTransactionFlags(eTransactionNeeded); 141613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return true; 141713fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 141813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 141913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 142013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 142141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy); 14227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 142313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 142413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 142513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 142613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 14272ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 14287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 142913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 143013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 143113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 143213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 143313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 143441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.flags == newFlags) return false; 143513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 143613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 14377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 14387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 143913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 144013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 144113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 144299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 144399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 144441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedCrop == crop) return false; 144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 144699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 14477bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 144899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 144999e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 14507bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 14517bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 14527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 145313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 145413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 145513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 14568d5227b8416b099c884429312daf2d60496fa484Robert Carr 14578d5227b8416b099c884429312daf2d60496fa484Robert Carrbool Layer::setFinalCrop(const Rect& crop, bool immediate) { 145841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.requestedFinalCrop == crop) return false; 1459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 14608d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.requestedFinalCrop = crop; 14617bf247e2db180da661b18084d50e0b389686fc0cRobert Carr if (immediate && !mFreezeGeometryUpdates) { 14628d5227b8416b099c884429312daf2d60496fa484Robert Carr mCurrentState.finalCrop = crop; 14638d5227b8416b099c884429312daf2d60496fa484Robert Carr } 14647bf247e2db180da661b18084d50e0b389686fc0cRobert Carr mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate; 14657bf247e2db180da661b18084d50e0b389686fc0cRobert Carr 1466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1467acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1469acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 147013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1471c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 147241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (scalingMode == mOverrideScalingMode) return false; 1473c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 147482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1475c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1476c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1477c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 14782f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 147941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.appId = appId; 148041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.type = type; 148141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mCurrentState.modified = true; 148241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman setTransactionFlags(eTransactionNeeded); 14832f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 14842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 148513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 148641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.layerStack == layerStack) return false; 148713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 148813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 149013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 149113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1492a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1493a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1494bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 149541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (mCurrentState.dataSpace == dataSpace) return false; 1496bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1497bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1498bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1499bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1500bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1501bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1502bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 1503532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchterandroid_dataspace Layer::getDataSpace() const { 1504532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter return mCurrentState.dataSpace; 1505532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter} 1506532b26380fd6d32dc5d7605bd766a2c4f00d0a80Courtney Goeltzenleuchter 15071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 1508e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu auto p = mDrawingParent.promote(); 15091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 15101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 15111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 15121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 15131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 15141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 151541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) { 15160d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = barrierLayer; 15177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 15217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 15220d48072f6047140119ff194c1194ce402fca2c0bRobert Carr mCurrentState.barrierLayer = nullptr; 1523792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 15250d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 15260d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 152741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanvoid Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) { 15280d48072f6047140119ff194c1194ce402fca2c0bRobert Carr sp<Handle> handle = static_cast<Handle*>(barrierHandle.get()); 15290d48072f6047140119ff194c1194ce402fca2c0bRobert Carr deferTransactionUntil(handle->owner.promote(), frameNumber); 15307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1532ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() { 1533ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza if (mFlinger->mForceFullDamage) { 1534ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = Region::INVALID_REGION; 1535ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } else { 1536ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1537ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } 1538ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1539ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1540ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() { 1541ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.clear(); 1542ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1543ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 15486b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const { 1549ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mSidebandStreamChanged || mAutoRefresh) { 1550d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza return true; 1551d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza } 1552d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza 15536b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 15540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza if (mQueueItems.empty()) { 15550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return false; 15560eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza } 15570eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza auto timestamp = mQueueItems[0].mTimestamp; 155841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman nsecs_t expectedPresent = mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 15590eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 15600eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza // Ignore timestamps more than a second in the future 15610eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 156241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGW_IF(!isPlausible, 156341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "[%s] Timestamp %" PRId64 " seems implausible " 156441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman "relative to expectedPresent %" PRId64, 156541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mName.string(), timestamp, expectedPresent); 15660eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 15670eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isDue = timestamp < expectedPresent; 15680eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return isDue || !isPlausible; 15696b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 15706b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 15710a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonbool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, 157241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const std::shared_ptr<FenceTime>& presentFence, 157341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman const CompositorTiming& compositorTiming) { 1574d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // mFrameLatencyNeeded is true when a new frame was latched for the 1575d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // composition. 157641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!mFrameLatencyNeeded) return false; 157728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 157828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameEventHistory. 157928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard { 158028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard Mutex::Autolock lock(mFrameEventHistoryMutex); 158141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFrameEventHistory.addPostComposition(mCurrentFrameNumber, glDoneFence, presentFence, 158241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman compositorTiming); 158328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 158482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 158528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameTracker. 158628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 158728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setDesiredPresentTime(desiredPresentTime); 158882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 158941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman std::shared_ptr<FenceTime> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFenceTime(); 159028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (frameReadyFence->isValid()) { 15913d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setFrameReadyFence(std::move(frameReadyFence)); 159228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 159328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // There was no fence for this frame, so assume that it was ready 159428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // to be presented at the desired present time. 159528e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setFrameReadyTime(desiredPresentTime); 159628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 159782dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 15983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson if (presentFence->isValid()) { 159941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFrameTracker.setActualPresentFence(std::shared_ptr<FenceTime>(presentFence)); 160028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 160128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // The HWC doesn't support present fences, so use the refresh 160228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // timestamp instead. 16033d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentTime( 160441fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman mFlinger->getHwComposer().getRefreshTimestamp(HWC_DISPLAY_PRIMARY)); 1605d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 160628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 160728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.advanceFrame(); 160828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameLatencyNeeded = false; 160928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return true; 1610d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 1611d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 16121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 16131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 1614e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& parent = mDrawingParent.promote(); 16151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 16161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 16171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 16191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 162141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanuint32_t Layer::getEffectiveUsage(uint32_t usage) const { 162213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 162313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 162413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 162513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 162613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 162703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 162803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 162903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 163213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 163313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 163413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 163613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 163713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 163813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 163913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 164113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 164213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 164313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 164413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 164513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 16460c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman if (mSurfaceFlingerConsumer) { 16470c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman mSurfaceFlingerConsumer->setTransformHint(orientation); 16480c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman } 164913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 165013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 165113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1655a099a24c93bfa599fc5c36a647e946c26f68514fKalle RaitaLayerDebugInfo Layer::getLayerDebugInfo() const { 1656a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerDebugInfo info; 1657a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const Layer::State& ds = getDrawingState(); 1658a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mName = getName(); 16591acbec7884a47f316005ba4f2b5e47c74317ee43chaviw sp<Layer> parent = getParent(); 1660a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); 1661a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mType = String8(getTypeId()); 1662a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mTransparentRegion = ds.activeTransparentRegion; 1663a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mVisibleRegion = visibleRegion; 1664a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mSurfaceDamageRegion = surfaceDamageRegion; 1665a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mLayerStack = getLayerStack(); 1666a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mX = ds.active.transform.tx(); 1667a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mY = ds.active.transform.ty(); 1668a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mZ = ds.z; 1669a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mWidth = ds.active.w; 1670a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mHeight = ds.active.h; 1671a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mCrop = ds.crop; 1672a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFinalCrop = ds.finalCrop; 167313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw info.mColor = ds.color; 1674a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mFlags = ds.flags; 1675a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mPixelFormat = getPixelFormat(); 1676a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mDataSpace = getDataSpace(); 1677a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][0] = ds.active.transform[0][0]; 1678a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[0][1] = ds.active.transform[0][1]; 1679a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][0] = ds.active.transform[1][0]; 1680a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mMatrix[1][1] = ds.active.transform[1][1]; 1681a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 1682a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita sp<const GraphicBuffer> activeBuffer = getActiveBuffer(); 1683a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (activeBuffer != 0) { 1684a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = activeBuffer->getWidth(); 1685a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = activeBuffer->getHeight(); 1686a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = activeBuffer->getStride(); 1687a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = activeBuffer->format; 1688a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } else { 1689a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferWidth = 0; 1690a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferHeight = 0; 1691a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferStride = 0; 1692a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mActiveBufferFormat = 0; 1693a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 1694bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 1695a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mNumQueuedFrames = getQueuedFrameCount(); 1696a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mRefreshPending = isBufferLatched(); 1697a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mIsOpaque = isOpaque(ds); 1698a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita info.mContentDirty = contentDirty; 1699a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return info; 1700d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 17019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1702e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 1703e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1704e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1705e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 1706e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 1707e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 1708e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 1709e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 1710e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 1711e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 1712e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 1713e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1714e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 1715e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 1716e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 1717e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1718e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1719e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 1720e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 1721e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 1722e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 1723e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 1724e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 1725e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 1726e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 1727e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 1728e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 1729e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1730e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 1731e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1732e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 1733e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 17348c3b6ac2012ad6731f214fca6fea73fd13619d0cJohn Reck result.appendFormat(" %10d | ", layerState.z); 173541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str()); 1736e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 173741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom); 17385a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const FloatRect& crop = hwcInfo.sourceCrop; 173941fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom); 1740e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1741e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 1742e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 1743e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 17449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1745e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 1746d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 1747d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 174882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 174982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 1750d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 1751d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 175225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 175325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 17546547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 17556547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 17566547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 17576547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1758d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 1759d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 1760d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 1761d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 1762d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 176341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this); 1764d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1765d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 1766d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 1767d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 1768d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 17695ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid Layer::onDisconnect() { 17705ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 17715ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson mFrameEventHistory.onDisconnect(); 17725ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 17735ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 17743890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 177541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman FrameEventHistoryDelta* outDelta) { 1776d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1777d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 1778fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // If there are any unsignaled fences in the aquire timeline at this 1779fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // point, the previously queued frame hasn't been latched yet. Go ahead 1780fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // and try to get the signal time here so the syscall is taken out of 1781fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // the main thread's critical path. 1782fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson mAcquireTimeline.updateSignalTimes(); 1783fbc80aef0ba1b11982cf4ca88d218b65b6eca0f3Brian Anderson // Push the new fence after updating since it's likely still pending. 17843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 1785d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 1786d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 178740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 17883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 17893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 1790d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 179140845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 1792e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 179341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodmanstd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(bool forceFlush) { 1794e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza std::vector<OccupancyTracker::Segment> history; 17950c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman 179641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman if (!mSurfaceFlingerConsumer) return {}; 17970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman 179841fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, &history); 1799e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza if (result != NO_ERROR) { 180041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), result); 1801e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return {}; 1802e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza } 1803e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return history; 1804e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza} 1805e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 1806367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const { 18070c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman if (mSurfaceFlingerConsumer) { 18080c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); 18090c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman } 18100c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman return false; 1811367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr} 1812367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 181398f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wusize_t Layer::getChildrenCount() const { 181498f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu size_t count = 0; 181598f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu for (const sp<Layer>& child : mCurrentChildren) { 181698f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu count += 1 + child->getChildrenCount(); 181798f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu } 181898f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu return count; 181998f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu} 182098f1c108b016dda77c808f3d099e7a45bdd70768Chia-I Wu 18211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 18221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 18231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 18241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 18261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 18271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 18281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 18291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 18301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 18311db73f66624e7d151710483dd58e03eed672f064Robert Carrbool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 18321db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Handle> handle = nullptr; 18331db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Layer> newParent = nullptr; 18341db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParentHandle == nullptr) { 18351db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 18361db73f66624e7d151710483dd58e03eed672f064Robert Carr } 18371db73f66624e7d151710483dd58e03eed672f064Robert Carr handle = static_cast<Handle*>(newParentHandle.get()); 18381db73f66624e7d151710483dd58e03eed672f064Robert Carr newParent = handle->owner.promote(); 18391db73f66624e7d151710483dd58e03eed672f064Robert Carr if (newParent == nullptr) { 18401db73f66624e7d151710483dd58e03eed672f064Robert Carr ALOGE("Unable to promote Layer handle"); 18411db73f66624e7d151710483dd58e03eed672f064Robert Carr return false; 18421db73f66624e7d151710483dd58e03eed672f064Robert Carr } 18431db73f66624e7d151710483dd58e03eed672f064Robert Carr 18441db73f66624e7d151710483dd58e03eed672f064Robert Carr for (const sp<Layer>& child : mCurrentChildren) { 1845e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu newParent->addChild(child); 18461db73f66624e7d151710483dd58e03eed672f064Robert Carr 18471db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<Client> client(child->mClientRef.promote()); 18481db73f66624e7d151710483dd58e03eed672f064Robert Carr if (client != nullptr) { 18491db73f66624e7d151710483dd58e03eed672f064Robert Carr client->setParentLayer(newParent); 18501db73f66624e7d151710483dd58e03eed672f064Robert Carr } 18511db73f66624e7d151710483dd58e03eed672f064Robert Carr } 18521db73f66624e7d151710483dd58e03eed672f064Robert Carr mCurrentChildren.clear(); 18531db73f66624e7d151710483dd58e03eed672f064Robert Carr 18541db73f66624e7d151710483dd58e03eed672f064Robert Carr return true; 18551db73f66624e7d151710483dd58e03eed672f064Robert Carr} 18561db73f66624e7d151710483dd58e03eed672f064Robert Carr 1857f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviwbool Layer::reparent(const sp<IBinder>& newParentHandle) { 1858f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (newParentHandle == nullptr) { 18590617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 18600617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 18610617894190ea0c3ee50889bee1d4df0f369b0761chaviw 18620617894190ea0c3ee50889bee1d4df0f369b0761chaviw auto handle = static_cast<Handle*>(newParentHandle.get()); 18630617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Layer> newParent = handle->owner.promote(); 18640617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (newParent == nullptr) { 18650617894190ea0c3ee50889bee1d4df0f369b0761chaviw ALOGE("Unable to promote Layer handle"); 18660617894190ea0c3ee50889bee1d4df0f369b0761chaviw return false; 18670617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 18680617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1869f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Layer> parent = getParent(); 1870f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (parent != nullptr) { 1871f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw parent->removeChild(this); 18720617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 1873f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw newParent->addChild(this); 18740617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1875f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw sp<Client> client(mClientRef.promote()); 18760617894190ea0c3ee50889bee1d4df0f369b0761chaviw sp<Client> newParentClient(newParent->mClientRef.promote()); 18770617894190ea0c3ee50889bee1d4df0f369b0761chaviw 1878f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw if (client != newParentClient) { 1879f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw client->setParentLayer(newParent); 18800617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 18810617894190ea0c3ee50889bee1d4df0f369b0761chaviw 18820617894190ea0c3ee50889bee1d4df0f369b0761chaviw return true; 18830617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 18840617894190ea0c3ee50889bee1d4df0f369b0761chaviw 18859524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carrbool Layer::detachChildren() { 1886412903fce3a93f411c85c54375a1851bfb370400Dan Stoza traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* child) { 18879524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (child == this) { 18889524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return; 18899524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 18909524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 1891161410b01a37bcc5522d8e91fe0a743989c86e70chaviw sp<Client> parentClient = mClientRef.promote(); 18929524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr sp<Client> client(child->mClientRef.promote()); 1893161410b01a37bcc5522d8e91fe0a743989c86e70chaviw if (client != nullptr && parentClient != client) { 18949524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr client->detachLayer(child); 18959524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 18969524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr }); 18979524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 18989524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr return true; 18999524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 19009524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 19011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 1902e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mCurrentParent = layer; 19031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 19051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 19061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 19071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 19081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 19101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 19111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 19121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 19131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 19151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 19171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 19181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 19191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 192141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList( 192241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman LayerVector::StateSet stateSet) { 1923412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, 1924412903fce3a93f411c85c54375a1851bfb370400Dan Stoza "makeTraversalList received invalid stateSet"); 1925412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1926412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1927412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const State& state = useDrawing ? mDrawingState : mCurrentState; 1928412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 1929412903fce3a93f411c85c54375a1851bfb370400Dan Stoza if (state.zOrderRelatives.size() == 0) { 1930412903fce3a93f411c85c54375a1851bfb370400Dan Stoza return children; 1931db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1932db66e627ad8904491e384c64f82fc77a939b9705Robert Carr LayerVector traverse; 1933db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1934412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 1935db66e627ad8904491e384c64f82fc77a939b9705Robert Carr sp<Layer> strongRelative = weakRelative.promote(); 1936db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (strongRelative != nullptr) { 1937db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(strongRelative); 1938db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1939db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1940db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1941412903fce3a93f411c85c54375a1851bfb370400Dan Stoza for (const sp<Layer>& child : children) { 1942db66e627ad8904491e384c64f82fc77a939b9705Robert Carr traverse.add(child); 1943db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1944db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 1945db66e627ad8904491e384c64f82fc77a939b9705Robert Carr return traverse; 1946db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 1947db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 19481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1949db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Negatively signed relatives are before 'this' in Z-order. 19501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1951412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) { 1952412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 1953db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 19541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 1955db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1956db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1957db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() >= 0) { 19581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 1959db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 1960412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 19611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1962412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 1963db66e627ad8904491e384c64f82fc77a939b9705Robert Carr for (; i < list.size(); i++) { 1964db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1965412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInZOrder(stateSet, visitor); 19661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 19691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 1970db66e627ad8904491e384c64f82fc77a939b9705Robert Carr * Positively signed relatives are before 'this' in reverse Z-order. 19711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 1972412903fce3a93f411c85c54375a1851bfb370400Dan Stozavoid Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet, 1973412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::Visitor& visitor) { 1974412903fce3a93f411c85c54375a1851bfb370400Dan Stoza LayerVector list = makeTraversalList(stateSet); 1975db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 19761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 197741fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (i = list.size() - 1; i >= 0; i--) { 1978db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1979db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (relative->getZ() < 0) { 19801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 19811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1982412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 19831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 1984412903fce3a93f411c85c54375a1851bfb370400Dan Stoza visitor(this); 198541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman for (; i >= 0; i--) { 1986db66e627ad8904491e384c64f82fc77a939b9705Robert Carr const auto& relative = list[i]; 1987412903fce3a93f411c85c54375a1851bfb370400Dan Stoza relative->traverseInReverseZOrder(stateSet, visitor); 19881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1991a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw/** 1992a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw * Traverse only children in z order, ignoring relative layers. 1993a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw */ 1994a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwvoid Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet, 1995a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector::Visitor& visitor) { 1996a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 1997a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 1998a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 1999a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw size_t i = 0; 2000a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 2001a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 2002a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw if (relative->getZ() >= 0) { 2003a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw break; 2004a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 2005a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 2006a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 2007a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw visitor(this); 2008a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw for (; i < children.size(); i++) { 2009a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw const auto& relative = children[i]; 2010a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw relative->traverseChildrenInZOrder(stateSet, visitor); 2011a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 2012a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw} 2013a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 20141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 20151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 2016e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 20171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 20181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 20199b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr 20209b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g. 20219b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // it isFixedSize) then there may be additional scaling not accounted 20229b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // for in the transform. We need to mirror this scaling in child surfaces 20239b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // or we will break the contract where WM can treat child surfaces as 20249b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr // pixels in the parent surface. 20250a68b461d382304ae438fa8b52920fa75d178a1cChia-I Wu if (p->isFixedSize() && p->mActiveBuffer != nullptr) { 20261725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferWidth; 20271725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr int bufferHeight; 20281725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) { 20291725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getWidth(); 20301725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getHeight(); 20311725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } else { 20321725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferHeight = p->mActiveBuffer->getWidth(); 20331725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr bufferWidth = p->mActiveBuffer->getHeight(); 20341725eeeb7db8a2c933dcc9d01cce14e17c76c6e6Robert Carr } 203541fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth); 203641fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight); 20379b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr Transform extraParentScaling; 20389b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr extraParentScaling.set(sx, 0, 0, sy); 20399b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr t = t * extraParentScaling; 20409b429f41cbd5964f96f9fb746af3b6932e4acc66Robert Carr } 20411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 20421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 20431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 20441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 204513fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf Layer::getAlpha() const { 2046e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu const auto& p = mDrawingParent.promote(); 20476452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 204813fdc49516d17f41e64e62e73c313b0928bf13ccchaviw half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf; 204913fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return parentAlpha * getDrawingState().color.a; 20506452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 20516452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 205213fdc49516d17f41e64e62e73c313b0928bf13ccchaviwhalf4 Layer::getColor() const { 205313fdc49516d17f41e64e62e73c313b0928bf13ccchaviw const half4 color(getDrawingState().color); 205413fdc49516d17f41e64e62e73c313b0928bf13ccchaviw return half4(color.r, color.g, color.b, getAlpha()); 20556452f12c95e855a96ab8f690f28914cd37de762bRobert Carr} 20566452f12c95e855a96ab8f690f28914cd37de762bRobert Carr 20571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 20581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 20591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 20601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 20611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 20621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 2063e41dbe6ab1d412efd67fdc8344be8da8b19426d2Chia-I Wu mDrawingParent = mCurrentParent; 20641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 20651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 20661d04428c3cff3503212ec3e76775ca5ba20abc18chaviwvoid Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) { 20671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; 20681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; 20691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const State& state = useDrawing ? mDrawingState : mCurrentState; 20701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform = state.active.transform; 20721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform = getTransform(); 20731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_id(sequence); 20751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_name(getName().c_str()); 20761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_type(String8(getTypeId())); 20771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const auto& child : children) { 20791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_children(child->sequence); 20801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 20811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw for (const wp<Layer>& weakRelative : state.zOrderRelatives) { 20831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw sp<Layer> strongRelative = weakRelative.promote(); 20841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (strongRelative != nullptr) { 20851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->add_relatives(strongRelative->sequence); 20861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 20871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 20881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.activeTransparentRegion, 20901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->mutable_transparent_region()); 20911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region()); 20921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region()); 20931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_layer_stack(getLayerStack()); 20951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z(state.z); 20961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 20971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* position = layerInfo->mutable_position(); 20981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_x(transform.tx()); 20991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw position->set_y(transform.ty()); 21001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw PositionProto* requestedPosition = layerInfo->mutable_requested_position(); 21021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_x(requestedTransform.tx()); 21031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw requestedPosition->set_y(requestedTransform.ty()); 21041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw SizeProto* size = layerInfo->mutable_size(); 21061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_w(state.active.w); 21071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw size->set_h(state.active.h); 21081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop()); 21101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop()); 21111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_is_opaque(isOpaque(state)); 21131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_invalidate(contentDirty); 21141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_dataspace(dataspaceDetails(getDataSpace())); 21151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); 21161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color()); 21171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color()); 21181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_flags(state.flags); 21191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); 21211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform()); 21221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto parent = getParent(); 21241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (parent != nullptr) { 21251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_parent(parent->sequence); 21261d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 21271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); 21291d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (zOrderRelativeOf != nullptr) { 21301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); 21311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 21321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw auto activeBuffer = getActiveBuffer(); 21341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw if (activeBuffer != nullptr) { 21351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoHelper::writeToProto(activeBuffer, layerInfo->mutable_active_buffer()); 21361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw } 21371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 21381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_queued_frames(getQueuedFrameCount()); 21391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw layerInfo->set_refresh_pending(isBufferLatched()); 21401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} 21411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 214213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 214313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 21443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 21473f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 21483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 21513f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 21523f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2153