Layer.cpp revision 2f5f8a51f5994cf14837030d4b3b252a9d1b950b
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza//#define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "Layer" 201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 211c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 2513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include <math.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/compiler.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <cutils/native_handle.h> 29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 351c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 373330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza#include <gui/BufferItem.h> 4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 443e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian#include "Colorizer.h" 450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 477b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard#include "LayerRejecter.h" 48b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 53875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 54875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 55c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza#include <mutex> 56c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE 0 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 654d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 664d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const String8& name, uint32_t w, uint32_t h, uint32_t flags) 6713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian : contentDirty(false), 6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 70a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mTextureName(-1U), 7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 7213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mName("unnamed"), 7313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat(PIXEL_FORMAT_NONE), 7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 77a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 78399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 80933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 81c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 82a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 83d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched(false), 84cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 85d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mPreviousFrameNumber(-1U), 864d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending(false), 8782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 8813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 8913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 905cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition(false), 939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mHasSurface(false), 9603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 97a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 98a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 99a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 100a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 10165476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 10204839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos mUpdateTexImageFailed(false), 10382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mAutoRefresh(false), 10482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mFreezePositionUpdates(false) 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating Layer %s", name.string()); 1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 110a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mFlinger->getRenderEngine().genTextures(1, &mTextureName); 11249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 1134d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1144d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eHidden) 1164125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerHidden; 1174125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (flags & ISurfaceComposerClient::eOpaque) 1184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerOpaque; 119231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza if (flags & ISurfaceComposerClient::eSecure) 120231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza layerFlags |= layer_state_t::eLayerSecure; 1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eNonPremultiplied) 1234d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mPremultipliedAlpha = false; 1244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1293dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 130b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 131b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 1339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentState.alpha = 1.0f; 1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentState.alpha = 0xFF; 1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1394d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.flags = layerFlags; 1404d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1414d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 142bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 1432f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = 0; 1442f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = 0; 1454d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1474d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t displayPeriod = 1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1576547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 158e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 159e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 1603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() { 161bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 162b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferProducer> producer; 163b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer; 164468051e20be19130572231266db306396a56402bIrvel BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true); 165b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mProducer = new MonitoredProducer(producer, mFlinger); 166468051e20be19130572231266db306396a56402bIrvel mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this); 167bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 168399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSurfaceFlingerConsumer->setContentsChangedListener(this); 1694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mSurfaceFlingerConsumer->setName(mName); 170b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam 17163a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard if (mFlinger->isLayerTripleBufferingDisabled()) { 17263a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard mProducer->setMaxDequeuedBufferCount(2); 17363a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard } 1746905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 1758430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 1768430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian updateTransformHint(hw); 177b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 17896f0819f81293076e652792794a961543e6750d7Mathias Agopian 1794d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1808ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos sp<Client> c(mClientRef.promote()); 1818ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos if (c != 0) { 1828ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos c->detachLayer(this); 1838ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos } 1848ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos 185cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mRemoteSyncPoints) { 186cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setTransactionApplied(); 187cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 188c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza for (auto& point : mLocalSyncPoints) { 189c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza point->setFrameAvailable(); 190c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 191921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mFlinger->deleteTextureAsync(mTextureName); 1926547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 19396f0819f81293076e652792794a961543e6750d7Mathias Agopian} 19496f0819f81293076e652792794a961543e6750d7Mathias Agopian 19513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 19613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 19713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 19813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.empty()) { 2029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 2089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface* layer) { 2099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer) { 2109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer->onDisplayed(); 2119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 21513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2166b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) { 2176b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Add this buffer from our internal queue tracker 2186b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza { // Autolock scope 2196b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 220468051e20be19130572231266db306396a56402bIrvel mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), 221468051e20be19130572231266db306396a56402bIrvel item.mGraphicBuffer->getHeight(), item.mFrameNumber); 222a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Reset the frame number tracker when we receive the first buffer after 223a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // a frame number reset 224a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (item.mFrameNumber == 1) { 225a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = 0; 226a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 227a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Ensure that callbacks are handled in order 229a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 230a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ms2ns(500)); 232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (result != NO_ERROR) { 233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 235a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 236a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2376b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.push_back(item); 238ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza android_atomic_inc(&mQueuedFrames); 239a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 240a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Wake up any pending callbacks 241a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 242a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition.broadcast(); 2436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2446b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 24599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mFlinger->signalLayerUpdate(); 246579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 247579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 2486b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) { 2497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza { // Autolock scope 2507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Mutex::Autolock lock(mQueueItemLock); 251a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Ensure that callbacks are handled in order 2537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 2547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 2557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ms2ns(500)); 2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (result != NO_ERROR) { 2577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 259a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 260a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mQueueItems.empty()) { 2627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("Can't replace a frame on an empty queue"); 2637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 2647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 2654d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos mQueueItems.editItemAt(mQueueItems.size() - 1) = item; 2667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 2677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake up any pending callbacks 2687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 2697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mQueueItemCondition.broadcast(); 2706b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2716b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 2726b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 273399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() { 274399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 275399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was false 276399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mFlinger->signalLayerUpdate(); 277399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 278399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall} 279399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 2806710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after 2816710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before 2826710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list) 28313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() { 284bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->abandon(); 2851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 2861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->onRemoved(); 2871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 28848d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 289cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 29013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 29113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 29213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2941eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 29513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 29613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h, 29913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian PixelFormat format, uint32_t flags) 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 30113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t const maxSurfaceDims = min( 30213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 30313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 30413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // never allow a surface larger than what our underlying GL implementation 30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // can handle. 30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return BAD_VALUE; 30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat = format; 31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 31413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 31513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentOpacity = getOpacityForFormat(format); 31613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 31813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 31913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 32013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return NO_ERROR; 32213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 32313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3244d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 3254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 3264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3274d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 3284d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian "Layer::getHandle() has already been called"); 3294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHasSurface = true; 3314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 333582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 334582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 335b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const { 336b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer; 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 34013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 34113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 34213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 343a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 344a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 345a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 346f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 347f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 348a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 349f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 350a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 351a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 352a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 353f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 354a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 3554fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 356f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 357f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 358f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 359f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 360f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 361f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 362f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 363f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 364f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 365f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 366f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 367f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 368f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 369f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 3701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 3711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(getDrawingState()); 3721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win(s.active.w, s.active.h); 3731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (!s.crop.isEmpty()) { 3751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(s.crop, &win); 3761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 3791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 3801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const sp<Layer>& p = getParent(); 3821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Now we need to calculate the parent bounds, so we can clip ourselves to those. 3831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // When calculating the parent bounds for purposes of clipping, 3841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // we don't need to constrain the parent to its transparent region. 3851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // The transparent region is an optimization based on the 3861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer contents of the layer, but does not affect the space allocated to 3871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // it by policy, and thus children should be allowed to extend into the 3881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // parent's transparent region. In fact one of the main uses, is to reduce 3891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // buffer allocation size in cases where a child window sits behind a main window 3901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // (by marking the hole in the parent window as a transparent region) 3911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 3921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = p->computeScreenBounds(false); 3931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds.intersect(win, &win); 3941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 3951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 3961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (reduceTransparentRegion) { 3971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 3981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = reduce(win, screenTransparentRegion); 3991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return win; 4021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 40413127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 4051eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 4066c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 4076c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 4086c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 4096c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 4106c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 41113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 412b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 413b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 414b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 41513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 4161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect bounds = win; 4181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 4191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bounds = p->computeScreenBounds(); 4211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 4261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win.intersect(bounds, &win); 4271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 4281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4306c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 4316c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 43213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 43313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 4341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrRect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 435b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 43613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 4371eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 43813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 43913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 44013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 4416b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 4426b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 4436b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 4446b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 4450e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4460e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 447b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 448b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr activeCrop = s.crop; 4490e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 4500e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 453acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 454acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 456b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 457b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!activeCrop.intersect(s.finalCrop, &activeCrop)) { 458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 4611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return activeCrop; 4621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 4631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrgfx::FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 4651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // the content crop is the area of the content that gets scaled to the 4661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // layer's size. This is in buffer space. 4671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr gfx::FloatRect crop = getContentCrop().toFloatRect(); 4681f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // In addition there is a WM-specified crop we pull from our drawing state. 4701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const State& s(getDrawingState()); 4711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 4721f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Screen space to make reduction to parent crop clearer. 4731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect activeCrop = computeInitialCrop(hw); 4741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 4751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 4761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto parentCrop = p->computeInitialCrop(hw); 4771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop.intersect(parentCrop, &activeCrop); 4781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 4791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 4801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr // Back to layer space to work with the content crop. 4811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop); 48213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 48328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 48428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 48528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 48628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 48728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 48828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 489acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 490acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 491acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 49213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 493f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 494f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 495f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 496acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 497acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 498acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 499acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 500acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 501acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 502021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 503021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 504acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 505021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransformOrient = 506021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 507acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 508acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 509acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 510acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 51113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 512acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 5130f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos invTransform = (Transform(invTransformOrient) * Transform(invTransform)) 5140f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos .getOrientation(); 515acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 516acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 517acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 518acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 519acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 520acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 521acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 522acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 523acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 524acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 525acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 526acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 527acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 528acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 529acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 530acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 531acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 532acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 533acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 534acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos const Rect winCrop = activeCrop.transform( 535acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform, s.active.w, s.active.h); 53613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 537acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 538acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float xScale = crop.getWidth() / float(winWidth); 539acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 54013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 541acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetL = winCrop.left * xScale; 542acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetT = winCrop.top * yScale; 543acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetR = (winWidth - winCrop.right ) * xScale; 544acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 545acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 546acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.left += insetL; 547acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.top += insetT; 548acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.right -= insetR; 549acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 55013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 55113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 55213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 55313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 5549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 555ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrvoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 5569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setGeometry( 5589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw, 5599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) 5609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 561a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 5629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 5649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 5659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setDefaultState(); 5679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 568a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 5693e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 5709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 5729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 5749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 5759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(false); 5809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (isSecure() && !hw->isSecure()) { 5829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 585dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 58613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 5871eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (!isOpaque(s) || s.alpha != 1.0f) { 5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto blendMode = mPremultipliedAlpha ? 5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setBlendMode(blendMode); 5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" 5949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " %s (%d)", mName.string(), to_string(blendMode).c_str(), 5959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 5969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!isOpaque(s) || s.alpha != 0xFF) { 5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBlending(mPremultipliedAlpha ? 6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_PREMULT : 6019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_BLENDING_COVERAGE); 6029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 60413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 60513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 60613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 6076c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 6081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 609b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 610b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 6111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.transform(activeCrop); 6129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 613acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 6149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 6169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 617acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 618acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr activeCrop = t.inverse().transform(activeCrop, true); 62028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 62128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 62228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 62328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 62428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 62528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 626acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 627acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 628acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6296c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 6306c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 6316c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 6326c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, s.active.h)); 6336c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 6346c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeCrop.left, activeCrop.bottom)); 6356c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 6366c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, activeCrop.bottom)); 6376c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 6381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 6391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(t.transform(computeBounds(activeTransparentRegion))); 640b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 641b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!frame.intersect(s.finalCrop, &frame)) { 642acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 643acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 644acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 646acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 647acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 648acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 6499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 6509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 6519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setDisplayFrame(transformedFrame); 652e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 653e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", 654e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza mName.string(), transformedFrame.left, transformedFrame.top, 655e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza transformedFrame.right, transformedFrame.bottom, 656e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 657e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 658e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.displayFrame = transformedFrame; 659e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 66171bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza gfx::FloatRect sourceCrop = computeCrop(displayDevice); 6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 663e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (error != HWC2::Error::None) { 664e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 665e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, 666e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), 667e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza static_cast<int32_t>(error)); 668e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 669e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza hwcInfo.sourceCrop = sourceCrop; 670e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 6719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setPlaneAlpha(s.alpha); 6739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " 6749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(), 6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 677ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr error = hwcLayer->setZOrder(z); 6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", 679ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr mName.string(), z, to_string(error).c_str(), 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6812f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 6822f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara error = hwcLayer->setInfo(s.type, s.appId); 6832f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", 6842f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mName.string(), static_cast<int32_t>(error)); 6859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 6869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!frame.intersect(hw->getViewport(), &frame)) { 6879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.clear(); 6889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 6909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setFrame(tr.transform(frame)); 6919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setCrop(computeCrop(hw)); 6929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setPlaneAlpha(s.alpha); 6939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 6949f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 69529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 69629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 69729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 69829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 69929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 70029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 70129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 70229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 70329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 7041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform transform(tr * t * bufferOrientation); 705c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 706c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 707c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 708021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 709021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 710c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 711021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransform = 712021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 713c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 714c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 715c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 716c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian NATIVE_WINDOW_TRANSFORM_FLIP_H; 717c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 718c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and apply to the current transform 7190f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos transform = Transform(invTransform) * transform; 720c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 72129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 72229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 72313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 7249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 7319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: " 7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), to_string(transform).c_str(), 7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 7369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (orientation & Transform::ROT_INVALID) { 7379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we can only handle simple transformation 7389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSkip(true); 7399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 7409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setTransform(orientation); 7419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 743a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 744a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 7459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 7579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 7589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply this display's projection's viewport to the visible region 7599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // before giving it to the HWC HAL. 7609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr = displayDevice->getTransform(); 7619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& viewport = displayDevice->getViewport(); 7629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Region visible = tr.transform(visibleRegion.intersect(viewport)); 7639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 7649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = mHwcLayers[hwcId].layer; 7659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setVisibleRegion(visible); 7669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 7689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza visible.dump(LOG_TAG); 7709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 7739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 7759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza surfaceDamageRegion.dump(LOG_TAG); 7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7790f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Sideband layers 7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mSidebandStream.get()) { 7810f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Sideband); 7820f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Sideband composition", mName.string()); 7830f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", 7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mName.string(), mSidebandStream->handle(), 7879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7890f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7920a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // Client layers 7930a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (mHwcLayers[hwcId].forceClientComposition || 7940a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) { 7950f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Client composition", mName.string()); 7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Client); 7970f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza return; 7980f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 7990f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 8000a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza // SolidColor layers 8010a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (mActiveBuffer == nullptr) { 8020a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza setCompositionType(hwcId, HWC2::Composition::SolidColor); 803c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 804c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // For now, we only support black for DimLayer 8050a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza error = hwcLayer->setColor({0, 0, 0, 255}); 8060a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza if (error != HWC2::Error::None) { 8070a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), 8080a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 8090a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 810c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 811c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // Clear out the transform, because it doesn't make sense absent a 812c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza // source buffer 813c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza error = hwcLayer->setTransform(HWC2::Transform::None); 814c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza if (error != HWC2::Error::None) { 815c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), 816c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 817c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza } 818c6c8954b4258ed61790dcc95ff1d049be3e8422dDan Stoza 8190a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza return; 8200a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza } 8210a21df783892acc5cff0c39c79b0aa602074af7eDan Stoza 8220f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza // Device or Cursor layers 8230f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (mPotentialCursor) { 8240f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGV("[%s] Requesting Cursor composition", mName.string()); 8250f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza setCompositionType(hwcId, HWC2::Composition::Cursor); 8269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 8279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting Device composition", mName.string()); 8289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Device); 8299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8300f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza 831bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace); 832bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter error = hwcLayer->setDataspace(mCurrentState.dataSpace); 833bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (error != HWC2::Error::None) { 834bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), 835bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace, to_string(error).c_str(), 836bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter static_cast<int32_t>(error)); 837bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter } 838bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 8390f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 8400f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza error = hwcLayer->setBuffer(mActiveBuffer->handle, acquireFence); 8410f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza if (error != HWC2::Error::None) { 8420f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), 8430f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza mActiveBuffer->handle, to_string(error).c_str(), 8440f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza static_cast<int32_t>(error)); 8450f67b3f01fc74bbd8cf4be24fce4a1e42f102282Dan Stoza } 8469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 8479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 8489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 8499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) { 8509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we have to set the visible region on every frame because 8519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we currently free it during onLayerDisplayed(), which is called 8529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // after HWComposer::commit() -- every frame. 8539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Apply this display's projection's viewport to the visible region 8549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // before giving it to the HWC HAL. 8559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr = hw->getTransform(); 8569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 8579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setVisibleRegionScreen(visible); 8589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSurfaceDamage(surfaceDamageRegion); 8599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); 860ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 8619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mSidebandStream.get()) { 8629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setSidebandStream(mSidebandStream); 8639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // NOTE: buffer can be NULL if the client never drew into this 8659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // layer yet, or if we ran out of memory 8669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setBuffer(mActiveBuffer); 8679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 8709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 8729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 8739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 8749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0 || 8759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza getCompositionType(hwcId) != HWC2::Composition::Cursor) { 8769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 8779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 8809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 881dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 8829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 8839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 8849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 885b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 886b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 8879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 8889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 8899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 8901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 8919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 892b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 893b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 894acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 8959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 8969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 8979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, 8999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top); 9009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position " 9019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "to (%d, %d): %s (%d)", mName.string(), position.left, 9029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top, to_string(error).c_str(), 9039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 9049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 9059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 9069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 9079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer::HWCLayerInterface& layer) { 9089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fenceFd = -1; 9099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // TODO: there is a possible optimization here: we only need to set the 9119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // acquire fence the first time a new buffer is acquired on EACH display. 9129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 9149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 9159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fence->isValid()) { 9169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard fenceFd = fence->dup(); 9179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fenceFd == -1) { 9189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("failed to dup layer fence, skipping sync: %d", errno); 9199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer.setAcquireFenceFd(fenceFd); 9239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9259d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardRect Layer::getPosition( 9269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<const DisplayDevice>& hw) 9279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 9289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this gives us only the "orientation" component of the transform 9299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const State& s(getCurrentState()); 9309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // apply the layer's transform, followed by the display's global transform 9329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // here we're guaranteed that the layer's transform preserves rects 9339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect win(s.active.w, s.active.h); 9349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.crop.isEmpty()) { 9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard win.intersect(s.crop, &win); 9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // subtract the transparent region and snap to the bounds 9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Rect bounds = reduce(win, s.activeTransparentRegion); 9391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect frame(getTransform().transform(bounds)); 9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(hw->getViewport(), &frame); 9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!s.finalCrop.isEmpty()) { 9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard frame.intersect(s.finalCrop, &frame); 9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Transform& tr(hw->getTransform()); 9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return Rect(tr.transform(frame)); 9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 94803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 94913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 95013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 95113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 95213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 95313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 954c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, clip, false); 95513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 95613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 957c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw, 958c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const { 959c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), useIdentityTransform); 96013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 96113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 962c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const { 963c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), false); 964c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 965c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 966c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 967c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9691c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 9701c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 971a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (CC_UNLIKELY(mActiveBuffer == 0)) { 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the texture has not been created yet, this Layer has 973179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // in fact never been drawn into. This happens frequently with 974179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // SurfaceView because the WindowManager can't know when the client 975179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // has drawn the first time. 976179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 977179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // If there is nothing under us, we paint the screen in black, otherwise 978179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // we just skip this update. 979179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 980179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // figure out if there is something below us 981179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region under; 9821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bool finished = false; 9831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) { 9841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (finished || layer == static_cast<Layer const*>(this)) { 9851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr finished = true; 9861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return; 9871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 9884297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 9891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr }); 990179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // if not everything below us is covered, we plug the holes! 991179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region holes(clip.subtract(under)); 992179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian if (!holes.isEmpty()) { 9931748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0, 0, 0, 1); 994179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian } 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 997a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 99897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // Bind the current buffer to the GL texture, and wait for it to be 99997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // ready for us to draw into. 1000bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 1001bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (err != NO_ERROR) { 100297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 1003dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // Go ahead and draw the buffer anyway; no matter what we do the screen 1004dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // is probably going to have something visibly wrong. 1005dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 1006dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 1007dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 1008dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 1009875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1010875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 1011dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis if (!blackOutLayer) { 1012cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // TODO: we could be more subtle with isFixedSize() 1013eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 1014cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1015cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Query the texture matrix given our current filtering mode. 1016cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis float textureMatrix[16]; 1017bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 1018bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 1019cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 1020c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 1021c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1022c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 1023021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to 1024021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the texture transform 1025c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 1026c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1027c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // create a 4x4 transform matrix from the display transform flags 1028c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 1029c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 1030c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 1031c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1032c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mat4 tr; 1033021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 1034021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 1035c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) 1036c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * rot90; 1037c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) 1038c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * flipH; 1039c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) 1040c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * flipV; 1041c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1042c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse 1043c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = inverse(tr); 1044c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1045c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and finally apply it to the original texture matrix 1046c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 1047c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 1048c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 1049c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 1050cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Set things up for texturing. 105149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 105249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setFiltering(useFiltering); 105349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setMatrix(textureMatrix); 105449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian 105549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian engine.setupLayerTexturing(mTexture); 1056a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } else { 1057875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.setupLayerBlackedOut(); 1058a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } 10598578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard drawWithOpenGL(hw, useIdentityTransform); 1060875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableTexturing(); 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1064c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 10651748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard float red, float green, float blue, 1066c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza float alpha) const 106713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 106819733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 1069c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, false); 107019733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 107119733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 107213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 107313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 107413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL( 10751748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard const sp<const DisplayDevice>& hw) const { 10761748719ea1b69cc7ad111d8c6149d692b9f056f8Fabien Sanglard clearWithOpenGL(hw, 0,0,0,0); 107713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 107813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1079c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 10808578980f7dd775d7044780de85ac3103989ba7d7Fabien Sanglard bool useIdentityTransform) const { 10811eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 108213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1083c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, useIdentityTransform); 108413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 108513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian /* 108613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * NOTE: the way we compute the texture coordinates here produces 108713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * different results than when we take the HWC path -- in the later case 108813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * the "source crop" is rounded to texel boundaries. 108913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * This can produce significantly different results when the texture 109013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * is scaled by a large amount. 109113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * 109213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * The GL code below is more logical (imho), and the difference with 109313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * HWC is due to a limitation of the HWC API to integers -- a question 1094c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian * is suspend is whether we should ignore this problem or revert to 109513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * GL composition when a buffer scaling is applied (maybe with some 109613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * minimal value)? Or, we could make GL behave like HWC -- but this feel 109713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * like more of a hack. 109813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian */ 1099acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos Rect win(computeBounds()); 1100acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 11011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t = getTransform(); 1102b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 11031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.transform(win); 1104b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!win.intersect(s.finalCrop, &win)) { 1105acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1106acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 11071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr win = t.inverse().transform(win); 1108acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!win.intersect(computeBounds(), &win)) { 1109acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1110acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1111acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 111213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 11133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float left = float(win.left) / float(s.active.w); 11143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float top = float(win.top) / float(s.active.h); 11153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float right = float(win.right) / float(s.active.w); 11163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float bottom = float(win.bottom) / float(s.active.h); 111713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1118875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // TODO: we probably want to generate the texture coords with the mesh 1119875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // here we assume that we only have 4 vertices 1120ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 1121ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[0] = vec2(left, 1.0f - top); 1122ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[1] = vec2(left, 1.0f - bottom); 1123ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[2] = vec2(right, 1.0f - bottom); 1124ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[3] = vec2(right, 1.0f - top); 112513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1126875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 11274125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha); 11285cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian engine.drawMesh(mMesh); 1129875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableBlending(); 113013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 113113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 11329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 11339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, 11349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool callIntoHwc) { 11359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 11369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 11379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 11389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 11409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 11419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), 11429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), static_cast<int>(callIntoHwc)); 11439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 11449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 11459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 11469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 11479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 11489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set " 11499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "composition type %s: %s (%d)", mName.string(), 11509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), to_string(error).c_str(), 11519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 11529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 11569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 1157ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 1158ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // If we're querying the composition type for a display that does not 1159ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza // have a HWC counterpart, then it will always be Client 1160ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza return HWC2::Composition::Client; 1161ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza } 11629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 1163ec0f717dfd3821cbc648198c6d3b98fcc3b53369Dan Stoza ALOGE("getCompositionType called with an invalid HWC layer"); 11649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 11659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 11679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 11699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 11709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 11719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 11729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 11739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 11759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 11779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 11789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 11799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 11809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 11819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 11839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 11849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 11859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 11861681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const { 11871681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int producerStickyTransform = 0; 11881681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 11891681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (ret != OK) { 11901681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 11911681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk strerror(-ret), ret); 11921681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return 0; 11931681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 11941681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return static_cast<uint32_t>(producerStickyTransform); 11951681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 11961681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 1197c5da271eec001da9e11a2786f2618a45257439c3Dan Stozabool Layer::latchUnsignaledBuffers() { 1198c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool propertyLoaded = false; 1199c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static bool latch = false; 1200c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza static std::mutex mutex; 1201c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza std::lock_guard<std::mutex> lock(mutex); 1202c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (!propertyLoaded) { 1203c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza char value[PROPERTY_VALUE_MAX] = {}; 1204c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza property_get("debug.sf.latch_unsignaled", value, "0"); 1205c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza latch = atoi(value); 1206c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza propertyLoaded = true; 1207c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1208c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return latch; 1209c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza} 1210c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 1211cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const { 1212cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mQueueItemLock); 1213cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!mQueueItems.empty()) { 1214cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mQueueItems[0].mFrameNumber; 1215cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1216cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mCurrentFrameNumber; 12177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1218cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza} 12197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 12201ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stozabool Layer::headFenceHasSignaled() const { 12219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1222c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza if (latchUnsignaledBuffers()) { 1223c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza return true; 1224c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza } 1225c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza 12261ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza Mutex::Autolock lock(mQueueItemLock); 12271ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems.empty()) { 12281ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 12291ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 12301ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (mQueueItems[0].mIsDroppable) { 12311ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // Even though this buffer's fence may not have signaled yet, it could 12321ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // be replaced by another buffer before it has a chance to, which means 12331ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // that it's possible to get into a situation where a buffer is never 12341ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza // able to be latched. To avoid this, grab this buffer anyway. 12351ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return true; 12361ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza } 12371ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza return mQueueItems[0].mFence->getSignalTime() != INT64_MAX; 12389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 12399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return true; 12409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12411ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza} 12421ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 1243cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 1244cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 1245cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 1246cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 1247cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 12487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1249cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1250cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1251cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 1252cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 12537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 12547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 125613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1263ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range 1264ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and 1265ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel 1266ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into 1267ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here. 1268ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 1269ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 12705773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) { 1271a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (HARDWARE_IS_DEVICE_FORMAT(format)) { 1272a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return true; 1273ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold } 12745773d3f5b2694c647e010246dff99acc70131289Mathias Agopian switch (format) { 12755773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 12765773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 1277ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy case HAL_PIXEL_FORMAT_RGBA_FP16: 1278dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return false; 12795773d3f5b2694c647e010246dff99acc70131289Mathias Agopian } 12805773d3f5b2694c647e010246dff99acc70131289Mathias Agopian // in all other case, we have no blending (also for unknown formats) 1281dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return true; 1282ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold} 1283ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 128413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 128513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 128613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 128713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1288acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 1289acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 1290acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 1291acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1292acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 1293acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 1294acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1295acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 1296acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 1297acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1298acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 1299acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 1300acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1301acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 1302acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1303c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 1304c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 130513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 13061eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 13071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Transform hwTransform(hw->getTransform()); 130813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t hw_h = hw->getHeight(); 13091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Rect win = computeBounds(); 13103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1311acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 1312acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 1313acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 1314acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 1315acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 13161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform layerTransform = getTransform(); 1317acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 13181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lt = layerTransform.transform(lt); 13191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr lb = layerTransform.transform(lb); 13201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rb = layerTransform.transform(rb); 13211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr rt = layerTransform.transform(rt); 1322acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1323acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1324b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1325b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 1326b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 1327b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 1328b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 1329acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1330acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1331ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 13321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[0] = hwTransform.transform(lt); 13331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[1] = hwTransform.transform(lb); 13341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[2] = hwTransform.transform(rb); 13351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr position[3] = hwTransform.transform(rt); 13363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian for (size_t i=0 ; i<4 ; i++) { 13375cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian position[i].y = hw_h - position[i].y; 133813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 133913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1340ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 13414125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const 1342a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{ 1343a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if we don't have a buffer yet, we're translucent regardless of the 1344a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // layer's opaque flag. 1345db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis if (mActiveBuffer == 0) { 1346a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return false; 1347db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis } 1348a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 1349a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if the layer has the opaque flag, then we're always opaque, 1350a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // otherwise we use the current buffer's format. 13514125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 1352a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian} 1353a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 1354231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const 1355231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{ 1356231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 1357231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 1358231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 1359231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 13607a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const 13617a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{ 1362a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 13637a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis return (activeBuffer != 0) && 13647a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 13657a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1366b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 136713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const { 1368c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE; 136913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 137013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 137113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const { 137213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return !mCurrentCrop.isEmpty(); 137313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 137513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 137613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mNeedsFiltering || hw->needsFiltering(); 137713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 137813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 137913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 138013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 138113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 138213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 138313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 138413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 138513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 138613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 138713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 138813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 138913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region& 139013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setVisibleNonTransparentRegion) { 139113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 139213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 139313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 139413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 139513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 139613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 139713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 139813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 13997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 14007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 14017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 14027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 14057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 14067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mCurrentState.handle != nullptr) { 140722851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza sp<IBinder> strongBinder = mCurrentState.handle.promote(); 140822851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza sp<Handle> handle = nullptr; 140922851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza sp<Layer> handleLayer = nullptr; 141022851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza if (strongBinder != nullptr) { 141122851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza handle = static_cast<Handle*>(strongBinder.get()); 141222851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza handleLayer = handle->owner.promote(); 141322851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza } 141422851c3ba2cf5ccb0c3a0aa6c5b94ae123a5616aDan Stoza if (strongBinder == nullptr || handleLayer == nullptr) { 14157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Unable to promote Layer handle", mName.string()); 14167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 14177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 14187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 14197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.handle = nullptr; 14203bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 14213bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos auto syncPoint = std::make_shared<SyncPoint>( 14223bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos mCurrentState.frameNumber); 1423cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (handleLayer->addSyncPoint(syncPoint)) { 1424cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 1425cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1426cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 1427cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 1428cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentState.handle = nullptr; 1429cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 14307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 14337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 1434f5702ff8b1919e0a5d342ad04ac486bbcde41461Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 14357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 14377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 14387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 143905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 144005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 144105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 144205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos stateToCommit->flags = (oldFlags & ~stateToCommit->mask) | 144305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos (stateToCommit->flags & stateToCommit->mask); 14447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 14467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 14477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 144805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 14497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 14507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 14517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mPendingStates[0].handle != nullptr) { 14527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 14537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 14547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 14557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 14567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 145705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 14587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 14597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 14607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1462cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (mRemoteSyncPoints.front()->getFrameNumber() != 1463cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mPendingStates[0].frameNumber) { 1464cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ALOGE("[%s] Unexpected sync point frame number found", 1465cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mName.string()); 1466cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1467cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 1468cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 1469cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 1470cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 1471cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1472cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 14737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 14747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 147505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 14767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 14777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 14797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 14807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 1481792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 1482792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 14837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14847dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 148505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 14867dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 14877dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14887dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14897dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14907dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 14917dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 14927dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 14937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 14947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 14957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 14967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 14977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 14987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 14997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() { 1502cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto headFrameNumber = getHeadFrameNumber(); 15031ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza bool headFenceSignaled = headFenceHasSignaled(); 1504cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1505cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mLocalSyncPoints) { 15061ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { 1507cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setFrameAvailable(); 1508cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 15097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 15117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 151213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 15131c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 15141c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 151605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 151705289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 15187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 15197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 15207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 15211eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 15231eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const bool sizeChanged = (c.requested.w != s.requested.w) || 15241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian (c.requested.h != s.requested.h); 1525a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1526a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian if (sizeChanged) { 1527cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 15289d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 15296905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1530419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1531b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n" 1532419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1533b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n", 1534c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr this, getName().string(), mCurrentTransform, 1535c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr getEffectiveScalingMode(), 15361eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.active.w, c.active.h, 1537b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.left, 1538b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.top, 1539b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.right, 1540b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.bottom, 1541b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getWidth(), 1542b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getHeight(), 15431eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h, 15441eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian s.active.w, s.active.h, 1545b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, 1546b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.top, 1547b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, 1548b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.bottom, 1549b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getWidth(), 1550b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getHeight(), 1551b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.requested.w, s.requested.h); 1552a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 15532a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 15542a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1555bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setDefaultBufferSize( 15561eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h); 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1558cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 155982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr const bool resizePending = (c.requested.w != c.active.w) || 156082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr (c.requested.h != c.active.h); 15610cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 15629e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 156313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // don't let Layer::doTransaction update the drawing state 15640cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // if we have a pending resize, unless we are in fixed-size mode. 15650cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // the drawing state will be updated only once we receive a buffer 15660cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // with the correct size. 15670cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // 15680cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // in particular, we want to make sure the clip (which is part 15690cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // of the geometry state) is latched together with the size but is 15700cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // latched immediately when no resizing is involved. 15719e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // 15729e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // If a sideband stream is attached, however, we want to skip this 15739e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // optimization so that transactions aren't missed when a buffer 15749e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // never arrives 15750cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 15760cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 15770cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 15780cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 15790cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 158013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always set active to requested, unless we're asked not to 158113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this is used by Layer, which special cases resizes. 158213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (flags & eDontUpdateGeometryState) { 158313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } else { 15847d05257585918bd578bc0bc18f32571a48a7304aPablo Ceballos Layer::State& editCurrentState(getCurrentState()); 158582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (mFreezePositionUpdates) { 158682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float tx = c.active.transform.tx(); 158782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr float ty = c.active.transform.ty(); 158882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 158982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active.transform.set(tx, ty); 159082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = c.active; 159182364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } else { 159282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr editCurrentState.active = editCurrentState.requested; 159382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr c.active = c.requested; 159482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 159513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 159613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 15971eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 159813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 159913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 160013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 160113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 16021eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 160313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 160413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 160513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 160613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 160713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 16083dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 16093dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mNeedsFiltering = (!c.active.transform.preserveRects() || 161013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian (type >= Transform::SCALE)); 161113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 161213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1613c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1614c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1615c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1616c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 16171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr clearSyncPoints(); 1618c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1619c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 162013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 162105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 162213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 162505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 162605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1627a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1628a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 162913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 163013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 163113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 163213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 163313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 163413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 163513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 163613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 163782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carrbool Layer::setPosition(float x, float y, bool immediate) { 16383dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 163913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 164013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 164169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 164269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 164369663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 164469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 16453dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 164682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (immediate && !mFreezePositionUpdates) { 164782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mCurrentState.active.transform.set(x, y); 164882364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 164982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr mFreezePositionUpdates = mFreezePositionUpdates || !immediate; 165069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 16517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 165213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 165313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 165413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 165582364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 16561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 16571f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr ssize_t idx = mCurrentChildren.indexOf(childLayer); 16581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (idx < 0) { 16591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return false; 16601f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16611f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (childLayer->setLayer(z)) { 16621f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.removeAt(idx); 16631f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(childLayer); 16641f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 16651f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 16661f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 16671f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1668ae0608381b2b4699218febd6d45ad9d307544d55Robert Carrbool Layer::setLayer(int32_t z) { 166913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.z == z) 167013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 167113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 167213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 16737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 167413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 167513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 167613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 16771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 167813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 167913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 168013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 168113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 168213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 16837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 168413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 168513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 168613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 16879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 16889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 16899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 16909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool Layer::setAlpha(uint8_t alpha) { 16919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 169213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.alpha == alpha) 169313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 169413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 169513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.alpha = alpha; 16967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 169713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 169813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 169913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 170013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 170113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 17023dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set( 170313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 17047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 170513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 170613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 170713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 170813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 17092ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 17107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 171113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 171313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 171413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 171513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 171613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.flags == newFlags) 171713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 171813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 171913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 17207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 17217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 172213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 172313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 172413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 172599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr 172699e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrbool Layer::setCrop(const Rect& crop, bool immediate) { 1727b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.crop == crop) 172813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 172913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 173099e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.requestedCrop = crop; 173199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr if (immediate) { 173299e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr mCurrentState.crop = crop; 173399e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr } 17347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 173513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 173613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 173713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1738acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosbool Layer::setFinalCrop(const Rect& crop) { 1739b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.finalCrop == crop) 1740acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return false; 1741acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 1742b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop = crop; 1743acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1744acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1745acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1746acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 174713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1748c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 1749c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (scalingMode == mOverrideScalingMode) 1750c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return false; 1751c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 175282364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr setTransactionFlags(eTransactionNeeded); 1753c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1754c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1755c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 17562f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Layer::setInfo(uint32_t type, uint32_t appId) { 17572f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.appId = appId; 17582f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.type = type; 17592f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mCurrentState.modified = true; 17602f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara setTransactionFlags(eTransactionNeeded); 17612f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 17622f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1763c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const { 1764c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (mOverrideScalingMode >= 0) { 1765c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mOverrideScalingMode; 1766c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 1767c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mCurrentScalingMode; 1768c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1769c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 177013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 177113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.layerStack == layerStack) 177213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 177313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 177413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 17757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 177613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 177713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1778a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1779a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1780bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchterbool Layer::setDataSpace(android_dataspace dataSpace) { 1781bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter if (mCurrentState.dataSpace == dataSpace) 1782bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return false; 1783bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.sequence++; 1784bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.dataSpace = dataSpace; 1785bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter mCurrentState.modified = true; 1786bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setTransactionFlags(eTransactionNeeded); 1787bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter return true; 1788bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter} 1789bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 17901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carruint32_t Layer::getLayerStack() const { 17911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr auto p = getParent(); 17921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p == nullptr) { 17931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getDrawingState().layerStack; 17941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 17951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return p->getLayerStack(); 17961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 17971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 17987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::deferTransactionUntil(const sp<IBinder>& handle, 17997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber) { 18007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.handle = handle; 18017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 18027dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 18037dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 18047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 18057dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 1806792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.handle = nullptr; 1807792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 18087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 18097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 18107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1811ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() { 1812ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza if (mFlinger->mForceFullDamage) { 1813ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = Region::INVALID_REGION; 1814ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } else { 1815ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1816ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } 1817ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1818ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1819ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() { 1820ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.clear(); 1821ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1822ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18276b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const { 1828ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mSidebandStreamChanged || mAutoRefresh) { 1829d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza return true; 1830d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza } 1831d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza 18326b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 18330eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza if (mQueueItems.empty()) { 18340eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return false; 18350eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza } 18360eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza auto timestamp = mQueueItems[0].mTimestamp; 18376b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza nsecs_t expectedPresent = 18386b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 18390eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 18400eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza // Ignore timestamps more than a second in the future 18410eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 18420eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 18430eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza "relative to expectedPresent %" PRId64, mName.string(), timestamp, 18440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza expectedPresent); 18450eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 18460eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isDue = timestamp < expectedPresent; 18470eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return isDue || !isPlausible; 18486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 18496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 1850d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonbool Layer::onPreComposition(nsecs_t refreshStartTime) { 1851d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (mBufferLatched) { 1852d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 1853d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime); 1854d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 18554d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending = false; 1856ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh; 185799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 185899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 18593d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Andersonbool Layer::onPostComposition( 18603d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson const std::shared_ptr<FenceTime>& glDoneFence, 18613d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson const std::shared_ptr<FenceTime>& presentFence, 18623d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson const std::shared_ptr<FenceTime>& retireFence) { 18633d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.updateSignalTimes(); 18643d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.updateSignalTimes(); 18653d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 1866d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // mFrameLatencyNeeded is true when a new frame was latched for the 1867d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // composition. 186828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (!mFrameLatencyNeeded) 186928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return false; 187028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 187128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameEventHistory. 187228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard { 187328e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard Mutex::Autolock lock(mFrameEventHistoryMutex); 187428e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameEventHistory.addPostComposition(mCurrentFrameNumber, 18753d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson glDoneFence, presentFence); 187628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameEventHistory.addRetire(mPreviousFrameNumber, 187728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard retireFence); 187828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 187982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 188028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // Update mFrameTracker. 188128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 188228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setDesiredPresentTime(desiredPresentTime); 188382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 18843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime> frameReadyFence = 18853d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mSurfaceFlingerConsumer->getCurrentFenceTime(); 188628e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard if (frameReadyFence->isValid()) { 18873d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setFrameReadyFence(std::move(frameReadyFence)); 188828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 188928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // There was no fence for this frame, so assume that it was ready 189028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // to be presented at the desired present time. 189128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.setFrameReadyTime(desiredPresentTime); 189228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } 189382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 18943d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson if (presentFence->isValid()) { 18953d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentFence( 18963d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime>(presentFence)); 18973d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson } else if (retireFence->isValid()) { 18983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentFence( 18993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson std::shared_ptr<FenceTime>(retireFence)); 190028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard } else { 190128e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // The HWC doesn't support present fences, so use the refresh 190228e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard // timestamp instead. 19033d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameTracker.setActualPresentTime( 19043d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFlinger->getHwComposer().getRefreshTimestamp( 19053d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson HWC_DISPLAY_PRIMARY)); 1906d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 190728e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard 190828e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameTracker.advanceFrame(); 190928e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard mFrameLatencyNeeded = false; 191028e98084bdadcf3001a3e24034c5c98057dd2398Fabien Sanglard return true; 1911d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 1912d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 19139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1914f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Andersonvoid Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { 19159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->releasePendingBuffer(); 19163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 1917d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 19183d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 19193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson 19203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 19213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameEventHistory.addRelease( 1922f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson mPreviousFrameNumber, dequeueReadyTime, std::move(releaseFenceTime)); 19239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 19249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 19259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 19261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrbool Layer::isHiddenByPolicy() const { 19271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const Layer::State& s(mDrawingState); 19281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& parent = getParent(); 19291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr && parent->isHiddenByPolicy()) { 19301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return true; 19311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 19321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return s.flags & layer_state_t::eLayerHidden; 19331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 19341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 1935da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const { 193613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Layer::State& s(mDrawingState); 19379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 19381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return !(isHiddenByPolicy()) && s.alpha > 0.0f 19399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza && (mActiveBuffer != NULL || mSidebandStream != NULL); 19409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 19411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return !(isHiddenByPolicy()) && s.alpha 19429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard && (mActiveBuffer != NULL || mSidebandStream != NULL); 19439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1944da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 1945da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 1946cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglardbool Layer::allTransactionsSignaled() { 1947cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard auto headFrameNumber = getHeadFrameNumber(); 1948cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool matchingFramesFound = false; 1949cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard bool allTransactionsApplied = true; 1950cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 1951cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1952cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard for (auto& point : mLocalSyncPoints) { 1953cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (point->getFrameNumber() > headFrameNumber) { 1954cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 1955cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 1956cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard matchingFramesFound = true; 1957cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1958cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!point->frameIsAvailable()) { 1959cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // We haven't notified the remote layer that the frame for 1960cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // this point is available yet. Notify it now, and then 1961cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard // abort this attempt to latch. 1962cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard point->setFrameAvailable(); 1963cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = false; 1964cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard break; 1965cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 1966cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1967cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied(); 1968cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard } 1969cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard return !matchingFramesFound || allTransactionsApplied; 1970cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard} 1971cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard 1972d6927fb1143398370c0885844bfb58923ef740b7Brian AndersonRegion Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 19741c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 19751c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 1976399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 1977399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was true 1978399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 197912e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza if (mSidebandStream != NULL) { 198012e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza setTransactionFlags(eTransactionNeeded); 198112e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 198212e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza } 19835bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall recomputeVisibleRegions = true; 19845bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall 19855bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall const State& s(getDrawingState()); 19861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return getTransform().transform(Region(Rect(s.active.w, s.active.h))); 1987399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 1988399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 19894fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region outDirtyRegion; 1990223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mQueuedFrames <= 0 && !mAutoRefresh) { 1991223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 1992223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 199399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 1994223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // if we've already called updateTexImage() without going through 1995223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // a composition step, we have to skip this layer at this point 1996223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // because we cannot call updateTeximage() without a corresponding 1997223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // compositionComplete() call. 1998223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // we'll trigger an update in onPreComposition(). 1999223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mRefreshPending) { 2000223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2001223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 20021ce6581ac788eaad58fd3329c2154af7dd74aa3dDan Stoza 2003223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the head buffer's acquire fence hasn't signaled yet, return and 2004223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // try again later 2005223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!headFenceHasSignaled()) { 2006223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2007223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2008223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 20092c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 2010223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Capture the old state of the layer for comparisons later 2011223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const State& s(getDrawingState()); 2012223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const bool oldOpacity = isOpaque(s); 2013223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 2014223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2015cd6fd5463d2e9b87504e29a39ac5f2395010805bFabien Sanglard if (!allTransactionsSignaled()) { 2016223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2017223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2018223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2019223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2020223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This boolean is used to make sure that SurfaceFlinger's shadow copy 2021223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // of the buffer queue isn't modified when the buffer queue is returning 2022223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // BufferItem's that weren't actually queued. This can happen in shared 2023223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // buffer mode. 2024223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bool queuedBuffer = false; 20257b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 20267b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard getProducerStickyTransform() != 0, mName.string(), 20277b1563a0e8e742315a16c9a7b27537dbcd13d09aFabien Sanglard mOverrideScalingMode, mFreezePositionUpdates); 2028223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 2029223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, 2030223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mLastFrameNumberReceived); 2031223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (updateResult == BufferQueue::PRESENT_LATER) { 2032223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Producer doesn't want buffer to be displayed yet. Signal a 2033223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // layer update so we check again at the next opportunity. 2034223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2035223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2036223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 2037223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // If the buffer has been rejected, remove it from the shadow queue 2038223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // and return early 2039063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 20406b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 2041223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2042223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 2043223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2044223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2045223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 2046223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This can occur if something goes wrong when trying to create the 2047223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // EGLImage for this buffer. If this happens, the buffer has already 2048223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // been released, so we need to clean up the queue and bug out 2049223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // early. 2050223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2051223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2052223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.clear(); 2053223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_and(0, &mQueuedFrames); 2054223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2055ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2056223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Once we have hit this state, the shadow queue may no longer 2057223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // correctly reflect the incoming BufferQueue's contents, so even if 2058223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage starts working, the only safe course of action is 2059223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // to continue to ignore updates. 2060223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mUpdateTexImageFailed = true; 2061ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 2062223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2063223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2064223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2065223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (queuedBuffer) { 2066223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Autolock scope 2067223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2068223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2069223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mQueueItemLock); 2070223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2071223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any stale buffers that have been dropped during 2072223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // updateTexImage 2073223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 20746b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.removeAt(0); 2075223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard android_atomic_dec(&mQueuedFrames); 20766b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 20776b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 2078223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mQueueItems.removeAt(0); 2079223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2080ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 20811585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 2082223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Decrement the queued-frames count. Signal another event if we 2083223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // have more frames pending. 2084223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 2085223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard || mAutoRefresh) { 2086223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFlinger->signalLayerUpdate(); 2087223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2088d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian 2089223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // update the active buffer 2090223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(); 2091223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (mActiveBuffer == NULL) { 2092223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // this can only happen if the very first buffer was rejected. 2093223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard return outDirtyRegion; 2094223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2095702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2096d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mBufferLatched = true; 2097d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mPreviousFrameNumber = mCurrentFrameNumber; 2098d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2099d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2100d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson { 2101d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2102d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); 2103d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#ifndef USE_HWC2 21043d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson auto releaseFenceTime = std::make_shared<FenceTime>( 2105d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 21063d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mReleaseTimeline.push(releaseFenceTime); 21073d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mFrameEventHistory.addRelease( 2108f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson mPreviousFrameNumber, latchTime, std::move(releaseFenceTime)); 2109d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#endif 2110d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 2111d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 2112223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mRefreshPending = true; 2113223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mFrameLatencyNeeded = true; 2114223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer == NULL) { 2115223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // the first time we receive a buffer, we need to trigger a 2116223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // geometry invalidation. 2117223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2118223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2119223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2120bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace()); 2121bb09b436fa119ad8b97f1bf5c04cc5aa10b5f1f0Courtney Goeltzenleuchter 2122223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 2123223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 2124223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 2125223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((crop != mCurrentCrop) || 2126223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (transform != mCurrentTransform) || 2127223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard (scalingMode != mCurrentScalingMode)) 2128223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2129223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentCrop = crop; 2130223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentTransform = transform; 2131223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentScalingMode = scalingMode; 2132223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2133223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2134702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2135223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldActiveBuffer != NULL) { 2136223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufWidth = mActiveBuffer->getWidth(); 2137223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard uint32_t bufHeight = mActiveBuffer->getHeight(); 2138223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (bufWidth != uint32_t(oldActiveBuffer->width) || 2139223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard bufHeight != uint32_t(oldActiveBuffer->height)) { 2140702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian recomputeVisibleRegions = true; 2141702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2142223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2143702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2144223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 2145223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (oldOpacity != isOpaque(s)) { 2146223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard recomputeVisibleRegions = true; 2147223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2148cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2149223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // Remove any sync points corresponding to the buffer which was just 2150223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latched 2151223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard { 2152223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Mutex::Autolock lock(mLocalSyncPointMutex); 2153223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard auto point = mLocalSyncPoints.begin(); 2154223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard while (point != mLocalSyncPoints.end()) { 2155223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if (!(*point)->frameIsAvailable() || 2156223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard !(*point)->transactionIsApplied()) { 2157223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // This sync point must have been added since we started 2158223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // latching. Don't drop it yet. 2159223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2160223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard continue; 2161223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2162223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2163223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard if ((*point)->getFrameNumber() <= mCurrentFrameNumber) { 2164223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard point = mLocalSyncPoints.erase(point); 2165223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } else { 2166223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard ++point; 2167cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2168cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2169223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard } 2170cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2171223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // FIXME: postedRegion should be dirty & bounds 2172223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard Region dirtyRegion(Rect(s.active.w, s.active.h)); 2173223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard 2174223eb91c416f4acb3e635f1dccf5e5ba74c0d866Fabien Sanglard // transform the dirty region to window-manager space 21751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr outDirtyRegion = (getTransform().transform(dirtyRegion)); 21761c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 21774fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 2178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 218013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const 218113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 218213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 218313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 218413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 218513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 218613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 218703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 218803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 218903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 219013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 219113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 219213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 219313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 219413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 219513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 219613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 219713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 219813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 219913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 220013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 220113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 220213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 220313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 220413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 220513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 220613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setTransformHint(orientation); 220713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 220813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 220913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 221013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 221113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 221213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 22133e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const 22141b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 22151eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 221613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 22173e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.colorize(result, Colorizer::GREEN); 221874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 221913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "+ %s %p (%s)\n", 222013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian getTypeId(), this, getName().string()); 22213e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.reset(result); 222213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 22232ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian s.activeTransparentRegion.dump(result, "transparentRegion"); 222413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian visibleRegion.dump(result, "visibleRegion"); 2225ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.dump(result, "surfaceDamageRegion"); 222613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sp<Client> client(mClientRef.promote()); 222713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 222874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( " " 2229acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), " 2230acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), " 223113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "isOpaque=%1d, invalidate=%1d, " 22329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 22339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 22349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 22359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 22369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 223713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian " client=%p\n", 22381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr getLayerStack(), s.z, 22391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr s.active.transform.tx(), s.active.transform.ty(), 22401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr s.active.w, s.active.h, 2241b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, s.crop.top, 2242b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, s.crop.bottom, 2243b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.left, s.finalCrop.top, 2244b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.right, s.finalCrop.bottom, 22454125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden isOpaque(s), contentDirty, 224613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian s.alpha, s.flags, 22473dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[0][0], s.active.transform[0][1], 22483dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[1][0], s.active.transform[1][1], 224913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian client.get()); 22501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2251a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<const GraphicBuffer> buf0(mActiveBuffer); 2252a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian uint32_t w0=0, h0=0, s0=0, f0=0; 22531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian if (buf0 != 0) { 22541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian w0 = buf0->getWidth(); 22551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian h0 = buf0->getHeight(); 22561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s0 = buf0->getStride(); 2257a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian f0 = buf0->format; 22581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian } 225974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 22601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 2261ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 22626905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden " queued-frames=%d, mRefreshPending=%d\n", 2263a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFormat, w0, h0, s0,f0, 22646905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden mQueuedFrames, mRefreshPending); 22651b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2266bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (mSurfaceFlingerConsumer != 0) { 22673d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross mSurfaceFlingerConsumer->dumpState(result, " "); 2268bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 2269d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 2270d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian 22719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2272e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDumpHeader(String8& result) { 2273e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2274e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2275e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Layer name\n"); 2276e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Z | "); 2277e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Comp Type | "); 2278e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Disp Frame (LTRB) | "); 2279e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append(" Source Crop (LTRB)\n"); 2280e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("----------------------------------------"); 2281e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("---------------------------------------\n"); 2282e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 2283e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2284e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stozavoid Layer::miniDump(String8& result, int32_t hwcId) const { 2285e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 2286e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza return; 2287e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2288e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2289e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza String8 name; 2290e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza if (mName.length() > 77) { 2291e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza std::string shortened; 2292e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string(), 36); 2293e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append("[...]"); 2294e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza shortened.append(mName.string() + (mName.length() - 36), 36); 2295e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = shortened.c_str(); 2296e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } else { 2297e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza name = mName; 2298e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza } 2299e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2300e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %s\n", name.string()); 2301e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2302e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Layer::State& layerState(getDrawingState()); 2303e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 2304e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat(" %10u | ", layerState.z); 2305e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%10s | ", 2306e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza to_string(getCompositionType(hwcId)).c_str()); 2307e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza const Rect& frame = hwcInfo.displayFrame; 2308e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, 2309e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza frame.right, frame.bottom); 231071bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza const gfx::FloatRect& crop = hwcInfo.sourceCrop; 2311e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, 2312e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza crop.right, crop.bottom); 2313e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2314e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - - "); 2315e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza result.append("- - - - - - - - - - - - - - - - - - - -\n"); 2316e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza} 23179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2318e22aec741f1530cde86c38989bcc2f87626b93b0Dan Stoza 2319d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 2320d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 232182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 232282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2323d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 2324d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 232525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 232625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 23276547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 23286547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 23296547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 23306547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 2331d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 2332d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 2333d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 2334d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 2335d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonvoid Layer::dumpFrameEvents(String8& result) { 2336d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson result.appendFormat("- Layer %s (%s, %p)\n", 2337d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson getName().string(), getTypeId(), this); 2338d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2339d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.checkFencesForCompletion(); 2340d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.dump(result); 2341d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 2342d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 23433890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 23443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta *outDelta) { 2345d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson Mutex::Autolock lock(mFrameEventHistoryMutex); 2346d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson if (newTimestamps) { 23473d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson mAcquireTimeline.push(newTimestamps->acquireFence); 2348d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson mFrameEventHistory.addQueue(*newTimestamps); 2349d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 235040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 23513890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (outDelta) { 23523890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mFrameEventHistory.getAndResetDelta(outDelta); 2353d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson } 235440845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 2355e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2356e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozastd::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory( 2357e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza bool forceFlush) { 2358e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza std::vector<OccupancyTracker::Segment> history; 2359e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, 2360e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza &history); 2361e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza if (result != NO_ERROR) { 2362e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), 2363e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza result); 2364e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return {}; 2365e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza } 2366e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza return history; 2367e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza} 2368e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 2369367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrbool Layer::getTransformToDisplayInverse() const { 2370367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); 2371367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr} 2372367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 23731f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::addChild(const sp<Layer>& layer) { 23741f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mCurrentChildren.add(layer); 23751f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(this); 23761f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 23771f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 23781f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrssize_t Layer::removeChild(const sp<Layer>& layer) { 23791f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr layer->setParent(nullptr); 23801f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mCurrentChildren.remove(layer); 23811f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 23821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 23831f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::setParent(const sp<Layer>& layer) { 23841f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mParent = layer; 23851f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 23861f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 23871f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::clearSyncPoints() { 23881f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (const auto& child : mCurrentChildren) { 23891f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->clearSyncPoints(); 23901f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 23911f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 23921f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Mutex::Autolock lock(mLocalSyncPointMutex); 23931f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (auto& point : mLocalSyncPoints) { 23941f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr point->setFrameAvailable(); 23951f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 23961f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mLocalSyncPoints.clear(); 23971f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 23981f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 23991f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrint32_t Layer::getZ() const { 24001f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return mDrawingState.z; 24011f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24031f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 24041f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Negatively signed children are before 'this' in Z-order. 24051f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 24061f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) { 24071f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t i = 0; 24081f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i < mDrawingChildren.size(); i++) { 24091f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 24101f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (child->getZ() >= 0) 24111f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 24121f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInZOrder(exec); 24131f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24141f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr exec(this); 24151f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i < mDrawingChildren.size(); i++) { 24161f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 24171f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInZOrder(exec); 24181f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24191f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24201f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr/** 24221f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr * Positively signed children are before 'this' in reverse Z-order. 24231f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr */ 24241f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) { 24251f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr int32_t i = 0; 24261f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (i = mDrawingChildren.size()-1; i>=0; i--) { 24271f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 24281f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (child->getZ() < 0) { 24291f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr break; 24301f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24311f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInReverseZOrder(exec); 24321f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24331f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr exec(this); 24341f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (; i>=0; i--) { 24351f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mDrawingChildren[i]; 24361f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->traverseInReverseZOrder(exec); 24371f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24381f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24391f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24401f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert CarrTransform Layer::getTransform() const { 24411f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr Transform t; 24421f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& p = getParent(); 24431f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (p != nullptr) { 24441f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr t = p->getTransform(); 24451f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24461f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr return t * getDrawingState().active.transform; 24471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24481f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 24491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carrvoid Layer::commitChildList() { 24501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr for (size_t i = 0; i < mCurrentChildren.size(); i++) { 24511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const auto& child = mCurrentChildren[i]; 24521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr child->commitChildList(); 24531f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 24541f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr mDrawingChildren = mCurrentChildren; 24551f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr} 24561f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 245713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 245813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 24593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 24623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 24633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 24663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 24673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2468